Skip to content

Commit

Permalink
Merge branch 'jk/head-symref'
Browse files Browse the repository at this point in the history
* jk/head-symref:
  symbolic ref: refuse non-ref targets in HEAD
  validate_headref: tighten ref-matching to just branches
  • Loading branch information
Junio C Hamano committed Feb 6, 2009
2 parents b371922 + afe5d3d commit 74b11bc
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 2 deletions.
3 changes: 3 additions & 0 deletions builtin-symbolic-ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)
check_symref(argv[0], quiet);
break;
case 2:
if (!strcmp(argv[0], "HEAD") &&
prefixcmp(argv[1], "refs/heads/"))
die("Refusing to point HEAD outside of refs/heads/");
create_symref(argv[0], argv[1], msg);
break;
default:
Expand Down
4 changes: 2 additions & 2 deletions path.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ int validate_headref(const char *path)
/* Make sure it is a "refs/.." symlink */
if (S_ISLNK(st.st_mode)) {
len = readlink(path, buffer, sizeof(buffer)-1);
if (len >= 5 && !memcmp("refs/", buffer, 5))
if (len >= 11 && !memcmp("refs/heads/", buffer, 11))
return 0;
return -1;
}
Expand All @@ -178,7 +178,7 @@ int validate_headref(const char *path)
len -= 4;
while (len && isspace(*buf))
buf++, len--;
if (len >= 5 && !memcmp("refs/", buf, 5))
if (len >= 11 && !memcmp("refs/heads/", buf, 11))
return 0;
}

Expand Down
41 changes: 41 additions & 0 deletions t/t1401-symbolic-ref.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/bin/sh

test_description='basic symbolic-ref tests'
. ./test-lib.sh

# If the tests munging HEAD fail, they can break detection of
# the git repo, meaning that further tests will operate on
# the surrounding git repo instead of the trash directory.
reset_to_sane() {
echo ref: refs/heads/foo >.git/HEAD
}

test_expect_success 'symbolic-ref writes HEAD' '
git symbolic-ref HEAD refs/heads/foo &&
echo ref: refs/heads/foo >expect &&
test_cmp expect .git/HEAD
'

test_expect_success 'symbolic-ref reads HEAD' '
echo refs/heads/foo >expect &&
git symbolic-ref HEAD >actual &&
test_cmp expect actual
'

test_expect_success 'symbolic-ref refuses non-ref for HEAD' '
test_must_fail git symbolic-ref HEAD foo
'
reset_to_sane

test_expect_success 'symbolic-ref refuses non-branch for HEAD' '
test_must_fail git symbolic-ref HEAD refs/foo
'
reset_to_sane

test_expect_success 'symbolic-ref refuses bare sha1' '
echo content >file && git add file && git commit -m one
test_must_fail git symbolic-ref HEAD `git rev-parse HEAD`
'
reset_to_sane

test_done

0 comments on commit 74b11bc

Please sign in to comment.