(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'basic symbolic-ref tests' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: reset_to_sane body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(ref) (Id.Lit_Other ':')} {(refs/heads/foo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:37) fd: -1 arg_word: {(.git/HEAD)} ) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref writes HEAD' span_id:46))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:50) (Token id: Id.Lit_Chars val: '\tgit symbolic-ref HEAD refs/heads/foo &&\n' span_id: 51 ) (Token id:Id.Lit_Chars val:'\techo ref: refs/heads/foo >expect &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\ttest_cmp expect .git/HEAD\n' span_id:53) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref reads HEAD' span_id:60))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:64) (Token id:Id.Lit_Chars val:'\techo refs/heads/foo >expect &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref HEAD >actual &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:67) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref refuses non-ref for HEAD' span_id:74))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref HEAD foo\n' span_id: 79 ) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref refuses bare sha1' span_id:88))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:92) (Token id: Id.Lit_Chars val: '\techo content >file && git add file && git commit -m one &&\n' span_id: 93 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref HEAD $(git rev-parse HEAD)\n' span_id: 94 ) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'HEAD cannot be removed' span_id:103))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:107) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref -d HEAD\n' span_id: 108 ) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref can be deleted' span_id:118))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) (Token id: Id.Lit_Chars val: '\tgit symbolic-ref NOTHEAD refs/heads/foo &&\n' span_id: 123 ) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref -d NOTHEAD &&\n' span_id:124) (Token id: Id.Lit_Chars val: '\ttest_path_is_file .git/refs/heads/foo &&\n' span_id: 125 ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/NOTHEAD\n' span_id:126) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref can delete dangling symref' span_id:135))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:139) (Token id: Id.Lit_Chars val: '\tgit symbolic-ref NOTHEAD refs/heads/missing &&\n' span_id: 140 ) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref -d NOTHEAD &&\n' span_id:141) (Token id: Id.Lit_Chars val: '\ttest_path_is_missing .git/refs/heads/missing &&\n' span_id: 142 ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/NOTHEAD\n' span_id:143) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref fails to delete missing FOO' span_id:152))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:156) (Token id: Id.Lit_Chars val: '\techo "fatal: Cannot delete FOO, not a symbolic ref" >expect &&\n' span_id: 157 ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git symbolic-ref -d FOO >actual 2>&1 &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:159) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref fails to delete real ref' span_id:168))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) (Token id: Id.Lit_Chars val: '\techo "fatal: Cannot delete refs/heads/foo, not a symbolic ref" >expect &&\n' span_id: 173 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref -d refs/heads/foo >actual 2>&1 &&\n' span_id: 174 ) (Token id:Id.Lit_Chars val:'\ttest_path_is_file .git/refs/heads/foo &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:176) ) } ) (C {(reset_to_sane)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create large ref name' span_id:185))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:189) (Token id: Id.Lit_Chars val: '\t# make 256+ character ref; some systems may not handle that,\n' span_id: 190 ) (Token id:Id.Lit_Chars val:'\t# so be gentle\n' span_id:191) (Token id:Id.Lit_Chars val:'\tlong=0123456789abcdef &&\n' span_id:192) (Token id:Id.Lit_Chars val:'\tlong=$long/$long/$long/$long &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\tlong=$long/$long/$long/$long &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\tlong_ref=refs/heads/$long &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\ttree=$(git write-tree) &&\n' span_id:196) (Token id:Id.Lit_Chars val:'\tcommit=$(echo foo | git commit-tree $tree) &&\n' span_id:197) (Token id: Id.Lit_Chars val: '\tif git update-ref $long_ref $commit; then\n' span_id: 198 ) (Token id:Id.Lit_Chars val:'\t\ttest_set_prereq LONG_REF\n' span_id:199) (Token id:Id.Lit_Chars val:'\telse\n' span_id:200) (Token id:Id.Lit_Chars val:'\t\techo >&2 "long refs not supported"\n' span_id:201) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:202) ) } ) (C {(test_expect_success)} {(LONG_REF)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref can point to large ref name' span_id:211))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:215) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref HEAD $long_ref &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\techo $long_ref >expect &&\n' span_id:217) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref HEAD >actual &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:219) ) } ) (C {(test_expect_success)} {(LONG_REF)} {(SQ (Token id:Id.Lit_Chars val:'we can parse long symbolic ref' span_id:228))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:232) (Token id:Id.Lit_Chars val:'\techo $commit >expect &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify HEAD >actual &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:235) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref reports failure in exit code' span_id:242))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:246) (Token id: Id.Lit_Chars val: '\ttest_when_finished "rm -f .git/HEAD.lock" &&\n' span_id: 247 ) (Token id:Id.Lit_Chars val:'\t>.git/HEAD.lock &&\n' span_id:248) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref HEAD refs/heads/whatever\n' span_id: 249 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref writes reflog entry' span_id:256))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:260) (Token id:Id.Lit_Chars val:'\tgit checkout -b log1 &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\tgit checkout -b log2 &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:264) (Token id:Id.Lit_Chars val:'\tgit checkout --orphan orphan &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref -m create HEAD refs/heads/log1 &&\n' span_id:266) (Token id: Id.Lit_Chars val: '\tgit symbolic-ref -m update HEAD refs/heads/log2 &&\n' span_id: 267 ) (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\tupdate\n' span_id:269) (Token id:Id.Lit_Chars val:'\tcreate\n' span_id:270) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:271) (Token id: Id.Lit_Chars val: '\tgit log --format=%gs -g -2 >actual &&\n' span_id: 272 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:273) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'symbolic-ref does not create ref d/f conflicts' span_id:280))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:284) (Token id:Id.Lit_Chars val:'\tgit checkout -b df &&\n' span_id:285) (Token id:Id.Lit_Chars val:'\ttest_commit df &&\n' span_id:286) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df &&\n' span_id: 287 ) (Token id:Id.Lit_Chars val:'\tgit pack-refs --all --prune &&\n' span_id:288) (Token id: Id.Lit_Chars val: '\ttest_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df\n' span_id: 289 ) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'symbolic-ref handles existing pointer to invalid name' span_id: 296 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:300) (Token id:Id.Lit_Chars val:'\thead=$(git rev-parse HEAD) &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref HEAD refs/heads/outer &&\n' span_id:302) (Token id: Id.Lit_Chars val: '\tgit update-ref refs/heads/outer/inner $head &&\n' span_id: 303 ) (Token id:Id.Lit_Chars val:'\tgit symbolic-ref HEAD refs/heads/unrelated\n' span_id:304) ) } ) (C {(test_done)}) ] )