(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)})
  ]
)