Browse Source

Merge branch 'jk/head-symref'

* jk/head-symref:
  symbolic ref: refuse non-ref targets in HEAD
  validate_headref: tighten ref-matching to just branches
maint
Junio C Hamano 16 years ago
parent
commit
74b11bc3be
  1. 3
      builtin-symbolic-ref.c
  2. 4
      path.c
  3. 41
      t/t1401-symbolic-ref.sh

3
builtin-symbolic-ref.c

@ -44,6 +44,9 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) @@ -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:

4
path.c

@ -154,7 +154,7 @@ int validate_headref(const char *path) @@ -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;
}
@ -178,7 +178,7 @@ int validate_headref(const char *path) @@ -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;
}


41
t/t1401-symbolic-ref.sh

@ -0,0 +1,41 @@ @@ -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
Loading…
Cancel
Save