From: Junio C Hamano Date: Fri, 21 Mar 2014 19:50:44 +0000 (-0700) Subject: Merge branch 'lt/request-pull' X-Git-Tag: v2.0.0-rc0~74 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/fe3623c6359f687495549320762a2a330b2e7128?ds=inline;hp=-c Merge branch 'lt/request-pull' Discard the accumulated "heuristics" to guess from which branch the result wants to be pulled from and make sure what the end user specified is not second-guessed by "git request-pull", to avoid mistakes. * lt/request-pull: request-pull: documentation updates request-pull: resurrect "pretty refname" feature request-pull: test updates request-pull: pick up tag message as before request-pull: allow "local:remote" to specify names on both ends request-pull: more strictly match local/remote branches --- fe3623c6359f687495549320762a2a330b2e7128 diff --combined git-request-pull.sh index cf4f1505a5,b67513a2e7..5c15997523 --- a/git-request-pull.sh +++ b/git-request-pull.sh @@@ -9,7 -9,6 +9,7 @@@ LONG_USAGE='Summarizes the changes betw and includes the given URL in the generated summary.' SUBDIRECTORY_OK='Yes' OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG= OPTIONS_SPEC='git request-pull [options] start url [end] -- p show patch text as well @@@ -36,20 -35,7 +36,7 @@@ d shift done - base=$1 url=$2 head=${3-HEAD} status=0 branch_name= - - headref=$(git symbolic-ref -q "$head") - if git show-ref -q --verify "$headref" - then - branch_name=${headref#refs/heads/} - if test "z$branch_name" = "z$headref" || - ! git config "branch.$branch_name.description" >/dev/null - then - branch_name= - fi - fi - - tag_name=$(git describe --exact "$head^0" 2>/dev/null) + base=$1 url=$2 status=0 test -n "$base" && test -n "$url" || usage @@@ -59,55 -45,78 +46,78 @@@ the die "fatal: Not a valid revision: $base" fi + # + # $3 must be a symbolic ref, a unique ref, or + # a SHA object expression. It can also be of + # the format 'local-name:remote-name'. + # + local=${3%:*} + local=${local:-HEAD} + remote=${3#*:} + pretty_remote=${remote#refs/} + pretty_remote=${pretty_remote#heads/} + head=$(git symbolic-ref -q "$local") + head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)} + head=${head:-$(git rev-parse --quiet --verify "$local")} + + # None of the above? Bad. + test -z "$head" && die "fatal: Not a valid revision: $local" + + # This also verifies that the resulting head is unique: + # "git show-ref" could have shown multiple matching refs.. headrev=$(git rev-parse --verify --quiet "$head"^0) - if test -z "$headrev" + test -z "$headrev" && die "fatal: Ambiguous revision: $local" + + # Was it a branch with a description? + branch_name=${head#refs/heads/} + if test "z$branch_name" = "z$headref" || + ! git config "branch.$branch_name.description" >/dev/null then - die "fatal: Not a valid revision: $head" + branch_name= fi merge_base=$(git merge-base $baserev $headrev) || die "fatal: No commits in common between $base and $head" - # $head is the token given from the command line, and $tag_name, if - # exists, is the tag we are going to show the commit information for. - # If that tag exists at the remote and it points at the commit, use it. - # Otherwise, if a branch with the same name as $head exists at the remote - # and their values match, use that instead. + # $head is the refname from the command line. + # If a ref with the same name as $head exists at the remote + # and their values match, use that. # # Otherwise find a random ref that matches $headrev. find_matching_ref=' - sub abbr { - my $ref = shift; - if ($ref =~ s|^refs/heads/|| || $ref =~ s|^refs/tags/|tags/|) { - return $ref; - } else { - return $ref; - } - } + my ($head,$headrev) = (@ARGV); + my ($found); - my ($tagged, $branch, $found); while () { - my ($sha1, $ref, $deref) = /^(\S+)\s+(\S+?)(\^\{\})?$/; - next unless ($sha1 eq $ARGV[1]); - $found = abbr($ref); - if ($deref && $ref eq "tags/$ARGV[2]") { - $tagged = $found; - last; + chomp; + my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/; + my ($pattern); + next unless ($sha1 eq $headrev); + + $pattern="/$head\$"; + if ($ref eq $head) { + $found = $ref; + } + if ($ref =~ /$pattern/) { + $found = $ref; } - if ($ref =~ m|/\Q$ARGV[0]\E$|) { - $exact = $found; + if ($sha1 eq $head) { + $found = $sha1; } } - if ($tagged) { - print "$tagged\n"; - } elsif ($exact) { - print "$exact\n"; - } elsif ($found) { + if ($found) { print "$found\n"; } ' - ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "$head" "$headrev" "$tag_name") + ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "${remote:-HEAD}" "$headrev") + + if test -z "$ref" + then + echo "warn: No match for commit $headrev found at $url" >&2 + echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2 + status=1 + fi url=$(git ls-remote --get-url "$url") @@@ -117,7 -126,7 +127,7 @@@ git show -s --format='The following cha are available in the git repository at: ' $merge_base && - echo " $url${ref+ $ref}" && + echo " $url $pretty_remote" && git show -s --format=' for you to fetch changes up to %H: @@@ -125,39 -134,23 +135,23 @@@ ----------------------------------------------------------------' $headrev && - if test -n "$branch_name" + if test $(git cat-file -t "$head") = tag then - echo "(from the branch description for $branch_name local branch)" - echo - git config "branch.$branch_name.description" - fi && - - if test -n "$tag_name" - then - if test -z "$ref" || test "$ref" != "tags/$tag_name" - then - echo >&2 "warn: You locally have $tag_name but it does not (yet)" - echo >&2 "warn: appear to be at $url" - echo >&2 "warn: Do you want to push it there, perhaps?" - fi - git cat-file tag "$tag_name" | + git cat-file tag "$head" | sed -n -e '1,/^$/d' -e '/^-----BEGIN PGP /q' -e p echo + echo "----------------------------------------------------------------" fi && - if test -n "$branch_name" || test -n "$tag_name" + if test -n "$branch_name" then + echo "(from the branch description for $branch_name local branch)" + echo + git config "branch.$branch_name.description" echo "----------------------------------------------------------------" fi && git shortlog ^$baserev $headrev && git diff -M --stat --summary $patch $merge_base..$headrev || status=1 - if test -z "$ref" - then - echo "warn: No branch of $url is at:" >&2 - git show -s --format='warn: %h: %s' $headrev >&2 - echo "warn: Are you sure you pushed '$head' there?" >&2 - status=1 - fi exit $status