strbuf_check_ref_format(): expand only local branches
authorJeff King <peff@peff.net>
Thu, 2 Mar 2017 08:23:14 +0000 (03:23 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 2 Mar 2017 19:05:04 +0000 (11:05 -0800)
This function asks strbuf_branchname() to expand any @-marks
in the branchname, and then we blindly stick refs/heads/ in
front of the result. This is obviously nonsense if the
expansion is "HEAD" or a ref in refs/remotes/.

The most obvious end-user effect is that creating or
renaming a branch with an expansion may have confusing
results (e.g., creating refs/heads/origin/master from
"@{upstream}" when the operation should be disallowed).

We can fix this by telling strbuf_branchname() that we are
only interested in local expansions. Any unexpanded bits are
then fed to check_ref_format(), which either disallows them
(in the case of "@{upstream}") or lets them through
("refs/heads/@" is technically valid, if a bit silly).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_name.c
t/t3204-branch-name-interpretation.sh
index 7f754b60c48d2a10c6562f1c63e79c366a5cd3a1..26ceec1d799afad6c6831cba00ca4d0ffab7979f 100644 (file)
@@ -1319,7 +1319,7 @@ void strbuf_branchname(struct strbuf *sb, const char *name, unsigned allowed)
 
 int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
 {
-       strbuf_branchname(sb, name, 0);
+       strbuf_branchname(sb, name, INTERPRET_BRANCH_LOCAL);
        if (name[0] == '-')
                return -1;
        strbuf_splice(sb, 0, 0, "refs/heads/", 11);
index 4f4af1fb46975f51cde93af4b2ea226d10bc3207..05e88f92d98a7d15db08345633cf624209ffcce2 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'update branch via local @{upstream}' '
        expect_branch local two
 '
 
-test_expect_failure 'disallow updating branch via remote @{upstream}' '
+test_expect_success 'disallow updating branch via remote @{upstream}' '
        git update-ref refs/remotes/origin/remote one &&
        git branch --set-upstream-to=origin/remote &&
 
@@ -109,7 +109,7 @@ test_expect_success 'disallow deleting remote branch via @{-1}' '
 # and not refs/heads/HEAD. These tests should not imply that refs/heads/@ is a
 # sane thing, but it _is_ technically allowed for now. If we disallow it, these
 # can be switched to test_must_fail.
-test_expect_failure 'create branch named "@"' '
+test_expect_success 'create branch named "@"' '
        git branch -f @ one &&
        expect_branch refs/heads/@ one
 '