(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git pack-refs should not change the branch semantic\n'> <'\n'> 
                <'This test runs git pack-refs and git show-ref and checks that the branch\n'> <'semantic is still the same.\n'>
              )
            }
          spids: [16]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {(SQ <'enable reflogs'>)} 
      {(SQ <'\n'> <'\tgit config core.logallrefupdates true\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'prepare a trivial repository'>)} 
      {
        (SQ <'echo Hello > A &&\n'> <'     git update-index --add A &&\n'> 
          <'     git commit -m "Initial commit." &&\n'> <'     HEAD=$(git rev-parse --verify HEAD)'>
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SHA1)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [59]
        )
      ]
    )
    (C {<test_expect_success>} {(SQ <'see if git show-ref works as expected'>)} 
      {
        (SQ <'git branch a &&\n'> <'     SHA1=$(cat .git/refs/heads/a) &&\n'> 
          <'     echo "$SHA1 refs/heads/a" >expect &&\n'> <'     git show-ref a >result &&\n'> <'     test_cmp expect result'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'see if a branch still exists when packed'>)} 
      {
        (SQ <'git branch b &&\n'> <'     git pack-refs --all &&\n'> 
          <'     rm -f .git/refs/heads/b &&\n'> <'     echo "$SHA1 refs/heads/b" >expect &&\n'> <'     git show-ref b >result &&\n'> 
          <'     test_cmp expect result'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git branch c/d should barf if branch c exists'>)} 
      {
        (SQ <'\n'> <'     git branch c &&\n'> <'     git pack-refs --all &&\n'> 
          <'     rm -f .git/refs/heads/c &&\n'> <'     test_must_fail git branch c/d\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'see if a branch still exists after git pack-refs --prune'>)} 
      {
        (SQ <'git branch e &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     echo "$SHA1 refs/heads/e" >expect &&\n'> <'     git show-ref e >result &&\n'> <'     test_cmp expect result'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'see if git pack-refs --prune remove ref files'>)} 
      {
        (SQ <'\n'> <'     git branch f &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     ! test -f .git/refs/heads/f\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'see if git pack-refs --prune removes empty dirs'>)} 
      {
        (SQ <'\n'> <'     git branch r/s/t &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     ! test -e .git/refs/heads/r\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git branch g should work when git branch g/h has been deleted'>)} 
      {
        (SQ <'git branch g/h &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     git branch -d g/h &&\n'> <'     git branch g &&\n'> <'     git pack-refs --all &&\n'> <'     git branch -d g'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git branch i/j/k should barf if branch i exists'>)} 
      {
        (SQ <'\n'> <'     git branch i &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     test_must_fail git branch i/j/k\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'test git branch k after branch k/l/m and k/lm have been deleted'>)} 
      {
        (SQ <'git branch k/l &&\n'> <'     git branch k/lm &&\n'> <'     git branch -d k/l &&\n'> 
          <'     git branch k/l/m &&\n'> <'     git branch -d k/l/m &&\n'> <'     git branch -d k/lm &&\n'> <'     git branch k'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'test git branch n after some branch deletion and pruning'>)} 
      {
        (SQ <'git branch n/o &&\n'> <'     git branch n/op &&\n'> <'     git branch -d n/o &&\n'> 
          <'     git branch n/o/p &&\n'> <'     git branch -d n/op &&\n'> <'     git pack-refs --all --prune &&\n'> 
          <'     git branch -d n/o/p &&\n'> <'     git branch n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'see if up-to-date packed refs are preserved'>)} 
      {
        (SQ <'git branch q &&\n'> <'\t git pack-refs --all --prune &&\n'> 
          <'\t git update-ref refs/heads/q refs/heads/q &&\n'> <'\t ! test -f .git/refs/heads/q'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'pack, prune and repack'>)} 
      {
        (SQ <'\n'> <'\tgit tag foo &&\n'> <'\tgit pack-refs --all --prune &&\n'> 
          <'\tgit show-ref >all-of-them &&\n'> <'\tgit pack-refs &&\n'> <'\tgit show-ref >again &&\n'> <'\ttest_cmp all-of-them again\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'explicit pack-refs with dangling packed reference'>)} 
      {
        (SQ <'\n'> <'\tgit commit --allow-empty -m "soon to be garbage-collected" &&\n'> 
          <'\tgit pack-refs --all &&\n'> <'\tgit reset --hard HEAD^ &&\n'> <'\tgit reflog expire --expire=all --all &&\n'> 
          <'\tgit prune --expire=all &&\n'> <'\tgit pack-refs --all 2>result &&\n'> <'\ttest_cmp /dev/null result\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'delete ref with dangling packed version'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b lamb &&\n'> 
          <'\tgit commit --allow-empty -m "future garbage" &&\n'> <'\tgit pack-refs --all &&\n'> <'\tgit reset --hard HEAD^ &&\n'> <'\tgit checkout master &&\n'> 
          <'\tgit reflog expire --expire=all --all &&\n'> <'\tgit prune --expire=all &&\n'> <'\tgit branch -d lamb 2>result &&\n'> 
          <'\ttest_cmp /dev/null result\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'delete ref while another dangling packed ref'>)} 
      {
        (SQ <'\n'> <'\tgit branch lamb &&\n'> <'\tgit commit --allow-empty -m "future garbage" &&\n'> 
          <'\tgit pack-refs --all &&\n'> <'\tgit reset --hard HEAD^ &&\n'> <'\tgit reflog expire --expire=all --all &&\n'> 
          <'\tgit prune --expire=all &&\n'> <'\tgit branch -d lamb 2>result &&\n'> <'\ttest_cmp /dev/null result\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'pack ref directly below refs/'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref refs/top HEAD &&\n'> <'\tgit pack-refs --all --prune &&\n'> 
          <'\tgrep refs/top .git/packed-refs &&\n'> <'\ttest_path_is_missing .git/refs/top\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'do not pack ref in refs/bisect'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref refs/bisect/local HEAD &&\n'> 
          <'\tgit pack-refs --all --prune &&\n'> <'\t! grep refs/bisect/local .git/packed-refs >/dev/null &&\n'> 
          <'\ttest_path_is_file .git/refs/bisect/local\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'disable reflogs'>)} 
      {(SQ <'\n'> <'\tgit config core.logallrefupdates false &&\n'> <'\trm -rf .git/logs\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'create packed foo/bar/baz branch'>)} 
      {
        (SQ <'\n'> <'\tgit branch foo/bar/baz &&\n'> <'\tgit pack-refs --all --prune &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/foo/bar/baz &&\n'> <'\ttest_must_fail git reflog exists refs/heads/foo/bar/baz\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'notice d/f conflict with existing directory'>)} 
      {(SQ <'\n'> <'\ttest_must_fail git branch foo &&\n'> <'\ttest_must_fail git branch foo/bar\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'existing directory reports concrete ref'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git branch foo 2>stderr &&\n'> 
          <'\tgrep refs/heads/foo/bar/baz stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'notice d/f conflict with existing ref'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git branch foo/bar/baz/extra &&\n'> 
          <'\ttest_must_fail git branch foo/bar/baz/lots/of/extra/components\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'timeout if packed-refs.lock exists'>)} 
      {
        (SQ <'\n'> <'\tLOCK=.git/packed-refs.lock &&\n'> <'\t>"$LOCK" &&\n'> 
          <'\ttest_when_finished "rm -f $LOCK" &&\n'> <'\ttest_must_fail git pack-refs --all --prune\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'retry acquiring packed-refs.lock'>)} 
      {
        (SQ <'\n'> <'\tLOCK=.git/packed-refs.lock &&\n'> <'\t>"$LOCK" &&\n'> 
          <'\ttest_when_finished "wait; rm -f $LOCK" &&\n'> <'\t{\n'> <'\t\t( sleep 1 ; rm -f $LOCK ) &\n'> <'\t} &&\n'> 
          <'\tgit -c core.packedrefstimeout=3000 pack-refs --all --prune\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)