]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t1401-symbolic-ref.sh
refs_resolve_ref_unsafe: handle d/f conflicts for writes
[thirdparty/git.git] / t / t1401-symbolic-ref.sh
index 1f0dff3a0b1cedb95b900a01de972e8a02e29f90..9e782a8122f84939156e2bb4e0f871d86399f938 100755 (executable)
@@ -29,22 +29,29 @@ 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`
+       test_must_fail git symbolic-ref HEAD $(git rev-parse HEAD)
 '
 reset_to_sane
 
-test_expect_success 'symbolic-ref deletes HEAD' '
-       git symbolic-ref -d HEAD &&
+test_expect_success 'HEAD cannot be removed' '
+       test_must_fail git symbolic-ref -d HEAD
+'
+
+reset_to_sane
+
+test_expect_success 'symbolic-ref can be deleted' '
+       git symbolic-ref NOTHEAD refs/heads/foo &&
+       git symbolic-ref -d NOTHEAD &&
        test_path_is_file .git/refs/heads/foo &&
-       test_path_is_missing .git/HEAD
+       test_path_is_missing .git/NOTHEAD
 '
 reset_to_sane
 
-test_expect_success 'symbolic-ref deletes dangling HEAD' '
-       git symbolic-ref HEAD refs/heads/missing &&
-       git symbolic-ref -d HEAD &&
+test_expect_success 'symbolic-ref can delete dangling symref' '
+       git symbolic-ref NOTHEAD refs/heads/missing &&
+       git symbolic-ref -d NOTHEAD &&
        test_path_is_missing .git/refs/heads/missing &&
-       test_path_is_missing .git/HEAD
+       test_path_is_missing .git/NOTHEAD
 '
 reset_to_sane
 
@@ -110,7 +117,46 @@ test_expect_success 'symbolic-ref writes reflog entry' '
        update
        create
        EOF
-       git log --format=%gs -g >actual &&
+       git log --format=%gs -g -2 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'symbolic-ref does not create ref d/f conflicts' '
+       git checkout -b df &&
+       test_commit df &&
+       test_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df &&
+       git pack-refs --all --prune &&
+       test_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df
+'
+
+test_expect_success 'symbolic-ref can overwrite pointer to invalid name' '
+       test_when_finished reset_to_sane &&
+       head=$(git rev-parse HEAD) &&
+       git symbolic-ref HEAD refs/heads/outer &&
+       test_when_finished "git update-ref -d refs/heads/outer/inner" &&
+       git update-ref refs/heads/outer/inner $head &&
+       git symbolic-ref HEAD refs/heads/unrelated
+'
+
+test_expect_success 'symbolic-ref can resolve d/f name (EISDIR)' '
+       test_when_finished reset_to_sane &&
+       head=$(git rev-parse HEAD) &&
+       git symbolic-ref HEAD refs/heads/outer/inner &&
+       test_when_finished "git update-ref -d refs/heads/outer" &&
+       git update-ref refs/heads/outer $head &&
+       echo refs/heads/outer/inner >expect &&
+       git symbolic-ref HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'symbolic-ref can resolve d/f name (ENOTDIR)' '
+       test_when_finished reset_to_sane &&
+       head=$(git rev-parse HEAD) &&
+       git symbolic-ref HEAD refs/heads/outer &&
+       test_when_finished "git update-ref -d refs/heads/outer/inner" &&
+       git update-ref refs/heads/outer/inner $head &&
+       echo refs/heads/outer >expect &&
+       git symbolic-ref HEAD >actual &&
        test_cmp expect actual
 '