From fe46fa9d267fc5465b320d0d2877de45333efeb8 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 16 Dec 2011 09:00:11 -0800 Subject: [PATCH 1/2] request-pull: update the "pull" command generation logic The old code that insisted on asking for the tip of a branch to be pulled were not updated when we started allowing for a tag to be pulled. When a tag points at an older part of the history and there is no branch that points at the tagged commit, the script failed to say which ref is to be pulled. Signed-off-by: Junio C Hamano --- git-request-pull.sh | 46 +++++++++++++++++++++++++++++++++-------- t/t5150-request-pull.sh | 3 +++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/git-request-pull.sh b/git-request-pull.sh index c6a5b7a6b3..7b5c777f0b 100755 --- a/git-request-pull.sh +++ b/git-request-pull.sh @@ -57,12 +57,40 @@ headrev=$(git rev-parse --verify "$head"^0) || exit merge_base=$(git merge-base $baserev $headrev) || die "fatal: No commits in common between $base and $head" -find_matching_branch="/^$headrev "'refs\/heads\//{ - s/^.* refs\/heads\/// - p - q -}' -branch=$(git ls-remote "$url" | sed -n -e "$find_matching_branch") +# $head is the token given from the command line. If a ref with that +# name exists at the remote and their values match, we should use it. +# Otherwise find a ref that matches $headrev. +find_matching_ref=' + sub abbr { + my $ref = shift; + if ($ref =~ s|refs/heads/||) { + return $ref; + } elsif ($ref =~ s|refs/tags/||) { + return "tag $ref"; + } else { + return $ref; + } + } + + my ($exact, $found); + while () { + my ($sha1, $ref, $deref) = /^(\S+)\s+(\S+?)(\^\{\})?$/; + next unless ($sha1 eq $ARGV[1]); + $found = abbr($ref); + if ($ref =~ m|/\Q$ARGV[0]\E$|) { + $exact = $found; + last; + } + } + if ($exact) { + print "$exact\n"; + } elsif ($found) { + print "$found\n"; + } +' + +ref=$(git ls-remote "$url" | perl -e "$find_matching_ref" "$head" "$headrev") + url=$(git ls-remote --get-url "$url") git show -s --format='The following changes since commit %H: @@ -71,7 +99,7 @@ git show -s --format='The following changes since commit %H: are available in the git repository at: ' $baserev && -echo " $url${branch+ $branch}" && +echo " $url${ref+ $ref}" && git show -s --format=' for you to fetch changes up to %H: @@ -81,7 +109,7 @@ for you to fetch changes up to %H: if test -n "$branch_name" then - echo "(from the branch description for $branch local branch)" + echo "(from the branch description for $branch_name local branch)" echo git config "branch.$branch_name.description" fi && @@ -101,7 +129,7 @@ fi && git shortlog ^$baserev $headrev && git diff -M --stat --summary $patch $merge_base..$headrev || status=1 -if test -z "$branch" +if test -z "$ref" then echo "warn: No branch of $url is at:" >&2 git show -s --format='warn: %h: %s' $headrev >&2 diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh index ea6f692baf..aec842fa33 100755 --- a/t/t5150-request-pull.sh +++ b/t/t5150-request-pull.sh @@ -67,9 +67,11 @@ test_expect_success 'setup: two scripts for reading pull requests' ' cat <<-\EOT >read-request.sed && #!/bin/sed -nf + # Note that a request could ask for "tag $tagname" / in the git repository at:$/!d n /^$/ n + s/ tag \([^ ]*\)$/ tag--\1/ s/^[ ]*\(.*\) \([^ ]*\)/please pull\ \1\ \2/p @@ -178,6 +180,7 @@ test_expect_success 'request names an appropriate branch' ' read branch } Date: Mon, 19 Dec 2011 11:59:57 -0800 Subject: [PATCH 2/2] request-pull: do not emit "tag" before the tagname The whole point of the recent update to allow "git pull $url $tagname" is so that the integrator does not have to store the (signed) tag that is used to convey authenticity to be recorded in the resulting merge in the local repository's tag namespace. Asking for a merge be made with "git pull $url tag $tagname" defeats it. Note that the request can become ambiguous if the requestor has a branch with the same name as the tag, but that is not a new problem limited to pulling. I wouldn't mind if somebody wants to add disambiguation to the find_matching_ref logic in the script as a separate patch, though. Signed-off-by: Junio C Hamano --- git-request-pull.sh | 4 +--- t/t5150-request-pull.sh | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/git-request-pull.sh b/git-request-pull.sh index 7b5c777f0b..d7ba1178ae 100755 --- a/git-request-pull.sh +++ b/git-request-pull.sh @@ -63,10 +63,8 @@ die "fatal: No commits in common between $base and $head" find_matching_ref=' sub abbr { my $ref = shift; - if ($ref =~ s|refs/heads/||) { + if ($ref =~ s|refs/heads/|| || $ref =~ s|refs/tags/||) { return $ref; - } elsif ($ref =~ s|refs/tags/||) { - return "tag $ref"; } else { return $ref; } diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh index aec842fa33..da25bc2d1f 100755 --- a/t/t5150-request-pull.sh +++ b/t/t5150-request-pull.sh @@ -180,7 +180,7 @@ test_expect_success 'request names an appropriate branch' ' read branch }