(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"basic symbolic-ref tests">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: reset_to_sane
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(echo)} {(ref) (Lit_Other ":")} {(refs/heads/foo)}]
              redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(.git/HEAD)} spids:[37])]
            )
          ]
          spids: [27]
        )
      spids: [23 26]
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref writes HEAD">)} 
      {
        (SQ <"\n"> <"\tgit symbolic-ref HEAD refs/heads/foo &&\n"> 
          <"\techo ref: refs/heads/foo >expect &&\n"> <"\ttest_cmp expect .git/HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref reads HEAD">)} 
      {
        (SQ <"\n"> <"\techo refs/heads/foo >expect &&\n"> <"\tgit symbolic-ref HEAD >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref refuses non-ref for HEAD">)} 
      {(SQ <"\n"> <"\ttest_must_fail git symbolic-ref HEAD foo\n">)}
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"symbolic-ref refuses bare sha1">)} 
      {
        (SQ <"\n"> <"\techo content >file && git add file && git commit -m one &&\n"> 
          <"\ttest_must_fail git symbolic-ref HEAD $(git rev-parse HEAD)\n">
        )
      }
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"HEAD cannot be removed">)} 
      {(SQ <"\n"> <"\ttest_must_fail git symbolic-ref -d HEAD\n">)}
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"symbolic-ref can be deleted">)} 
      {
        (SQ <"\n"> <"\tgit symbolic-ref NOTHEAD refs/heads/foo &&\n"> 
          <"\tgit symbolic-ref -d NOTHEAD &&\n"> <"\ttest_path_is_file .git/refs/heads/foo &&\n"> <"\ttest_path_is_missing .git/NOTHEAD\n">
        )
      }
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"symbolic-ref can delete dangling symref">)} 
      {
        (SQ <"\n"> <"\tgit symbolic-ref NOTHEAD refs/heads/missing &&\n"> 
          <"\tgit symbolic-ref -d NOTHEAD &&\n"> <"\ttest_path_is_missing .git/refs/heads/missing &&\n"> <"\ttest_path_is_missing .git/NOTHEAD\n">
        )
      }
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"symbolic-ref fails to delete missing FOO">)} 
      {
        (SQ <"\n"> <"\techo \"fatal: Cannot delete FOO, not a symbolic ref\" >expect &&\n"> 
          <"\ttest_must_fail git symbolic-ref -d FOO >actual 2>&1 &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"symbolic-ref fails to delete real ref">)} 
      {
        (SQ <"\n"> <"\techo \"fatal: Cannot delete refs/heads/foo, not a symbolic ref\" >expect &&\n"> 
          <"\ttest_must_fail git symbolic-ref -d refs/heads/foo >actual 2>&1 &&\n"> <"\ttest_path_is_file .git/refs/heads/foo &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(reset_to_sane)})
    (C {(test_expect_success)} {(SQ <"create large ref name">)} 
      {
        (SQ <"\n"> <"\t# make 256+ character ref; some systems may not handle that,\n"> 
          <"\t# so be gentle\n"> <"\tlong=0123456789abcdef &&\n"> <"\tlong=$long/$long/$long/$long &&\n"> 
          <"\tlong=$long/$long/$long/$long &&\n"> <"\tlong_ref=refs/heads/$long &&\n"> <"\ttree=$(git write-tree) &&\n"> 
          <"\tcommit=$(echo foo | git commit-tree $tree) &&\n"> <"\tif git update-ref $long_ref $commit; then\n"> <"\t\ttest_set_prereq LONG_REF\n"> <"\telse\n"> 
          <"\t\techo >&2 \"long refs not supported\"\n"> <"\tfi\n">
        )
      }
    )
    (C {(test_expect_success)} {(LONG_REF)} {(SQ <"symbolic-ref can point to large ref name">)} 
      {
        (SQ <"\n"> <"\tgit symbolic-ref HEAD $long_ref &&\n"> <"\techo $long_ref >expect &&\n"> 
          <"\tgit symbolic-ref HEAD >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(LONG_REF)} {(SQ <"we can parse long symbolic ref">)} 
      {
        (SQ <"\n"> <"\techo $commit >expect &&\n"> <"\tgit rev-parse --verify HEAD >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref reports failure in exit code">)} 
      {
        (SQ <"\n"> <"\ttest_when_finished \"rm -f .git/HEAD.lock\" &&\n"> <"\t>.git/HEAD.lock &&\n"> 
          <"\ttest_must_fail git symbolic-ref HEAD refs/heads/whatever\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref writes reflog entry">)} 
      {
        (SQ <"\n"> <"\tgit checkout -b log1 &&\n"> <"\ttest_commit one &&\n"> 
          <"\tgit checkout -b log2  &&\n"> <"\ttest_commit two &&\n"> <"\tgit checkout --orphan orphan &&\n"> 
          <"\tgit symbolic-ref -m create HEAD refs/heads/log1 &&\n"> <"\tgit symbolic-ref -m update HEAD refs/heads/log2 &&\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <"\tupdate\n"> <"\tcreate\n"> <"\tEOF\n"> <"\tgit log --format=%gs -g -2 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref does not create ref d/f conflicts">)} 
      {
        (SQ <"\n"> <"\tgit checkout -b df &&\n"> <"\ttest_commit df &&\n"> 
          <"\ttest_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df &&\n"> <"\tgit pack-refs --all --prune &&\n"> 
          <"\ttest_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"symbolic-ref handles existing pointer to invalid name">)} 
      {
        (SQ <"\n"> <"\thead=$(git rev-parse HEAD) &&\n"> 
          <"\tgit symbolic-ref HEAD refs/heads/outer &&\n"> <"\tgit update-ref refs/heads/outer/inner $head &&\n"> 
          <"\tgit symbolic-ref HEAD refs/heads/unrelated\n">
        )
      }
    )
    (C {(test_done)})
  ]
)