Skip to content

Commit

Permalink
push: use same rules as git-rev-parse to resolve refspecs
Browse files Browse the repository at this point in the history
This commit changes the rules for resolving refspecs to match the
rules for resolving refs in rev-parse. git-rev-parse uses clear rules
to resolve a short ref to its full name, which are well documented.
The rules for resolving refspecs documented in git-send-pack were
less strict and harder to understand. This commit replaces them by
the rules of git-rev-parse.

The unified rules are easier to understand and better resolve ambiguous
cases. You can now push from a repository containing several branches
ending on the same short name.

Note, this may break existing setups. For example, "master" will no longer
resolve to "origin/master" even when there is no other "master" elsewhere.

Signed-off-by: Steffen Prohaska <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
sprohaska authored and gitster committed Nov 19, 2007
1 parent 7980332 commit ae36bdc
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
4 changes: 3 additions & 1 deletion Documentation/git-send-pack.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ Each pattern pair consists of the source side (before the colon)
and the destination side (after the colon). The ref to be
pushed is determined by finding a match that matches the source
side, and where it is pushed is determined by using the
destination side.
destination side. The rules used to match a ref are the same
rules used by gitlink:git-rev-parse[1] to resolve a symbolic ref
name.

- It is an error if <src> does not match exactly one of the
local refs.
Expand Down
5 changes: 1 addition & 4 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -519,10 +519,7 @@ static int count_refspec_match(const char *pattern,
char *name = refs->name;
int namelen = strlen(name);

if (namelen < patlen ||
memcmp(name + namelen - patlen, pattern, patlen))
continue;
if (namelen != patlen && name[namelen - patlen - 1] != '/')
if (!refname_match(pattern, name, ref_rev_parse_rules))
continue;

/* A match is "weak" if it is with refs outside
Expand Down
12 changes: 11 additions & 1 deletion t/t5516-fetch-push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,21 @@ test_expect_success 'push with no ambiguity (1)' '
test_expect_success 'push with no ambiguity (2)' '
mk_test remotes/origin/master &&
git push testrepo master:master &&
git push testrepo master:origin/master &&
check_push_result $the_commit remotes/origin/master
'

test_expect_success 'push with colon-less refspec, no ambiguity' '
mk_test heads/master heads/t/master &&
git branch -f t/master master &&
git push testrepo master &&
check_push_result $the_commit heads/master &&
check_push_result $the_first_commit heads/t/master
'

test_expect_success 'push with weak ambiguity (1)' '
mk_test heads/master remotes/origin/master &&
Expand Down

0 comments on commit ae36bdc

Please sign in to comment.