(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'check pruning of dependent objects'>)}
          spids: [76]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: add
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{<echo>} {(DQ ($ Id.VSub_Number '$1'))}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {(DQ ($ Id.VSub_Number '$1'))}
                    )
                  ]
                  do_fork: T
                )
                (C {<git>} {<add>} {(DQ ($ Id.VSub_Number '$1'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: commit
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<test_tick>})
                (C {<add>} {(DQ ($ Id.VSub_Number '$1'))})
                (C {<git>} {<commit>} {<-m>} {(DQ ($ Id.VSub_Number '$1'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: maybe_repack
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (C {<test>} {<-n>} {(DQ ($ Id.VSub_DollarName '$repack'))})
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<git>} {<repack>} {<-ad>})]
                  spids: [167 178]
                )
              ]
            )
          ]
        )
    )
    (command.ForEach
      iter_name: repack
      iter_words: [{(SQ )} {<true>}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:title)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name repack>
                        suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonPlus ':+'> arg_word:{<repack>})
                      )
                    }
                  spids: [208]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:title)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name title>
                        suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{<loose>})
                      )
                    }
                  spids: [216]
                )
              ]
            )
            (C {<test_expect_success>} 
              {(DQ <'make repo completely empty ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\trm -rf .git &&\n'> <'\t\tgit init\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {(DQ <'disable reflogs ('> ($ Id.VSub_DollarName '$title') <')'>)} 
              {
                (SQ <'\n'> <'\t\tgit config core.logallrefupdates false &&\n'> 
                  <'\t\tgit reflog expire --expire=all --all\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <'setup basic history ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\tcommit base\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {(DQ <'create and abandon some objects ('> ($ Id.VSub_DollarName '$title') <')'>)} 
              {
                (SQ <'\n'> <'\t\tgit checkout -b experiment &&\n'> <'\t\tcommit abandon &&\n'> 
                  <'\t\tmaybe_repack &&\n'> <'\t\tgit checkout master &&\n'> <'\t\tgit branch -D experiment\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <'simulate time passing ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\tfind .git/objects -type f |\n'> <'\t\txargs test-chmtime -v -86400\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {
                (DQ <'start writing new commit with old blob ('> ($ Id.VSub_DollarName '$title') <')'>)
              } 
              {
                (SQ <'\n'> <'\t\ttree=$(\n'> <'\t\t\tGIT_INDEX_FILE=index.tmp &&\n'> 
                  <'\t\t\texport GIT_INDEX_FILE &&\n'> <'\t\t\tgit read-tree HEAD &&\n'> <'\t\t\tadd unrelated &&\n'> <'\t\t\tadd abandon &&\n'> 
                  <'\t\t\tgit write-tree\n'> <'\t\t)\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <'simultaneous gc ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\tgit gc --prune=12.hours.ago\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {(DQ <'finish writing out commit ('> ($ Id.VSub_DollarName '$title') <')'>)} 
              {
                (SQ <'\n'> <'\t\tcommit=$(echo foo | git commit-tree -p HEAD $tree) &&\n'> 
                  <'\t\tgit update-ref HEAD $commit\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <'repository passes fsck ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\tgit fsck\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {(DQ <'abandon objects again ('> ($ Id.VSub_DollarName '$title') <')'>)} 
              {
                (SQ <'\n'> <'\t\tgit reset --hard HEAD^ &&\n'> <'\t\tfind .git/objects -type f |\n'> 
                  <'\t\txargs test-chmtime -v -86400\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'start writing new commit with same tree ('> ($ Id.VSub_DollarName '$title') <')'>)
              } 
              {
                (SQ <'\n'> <'\t\ttree=$(\n'> <'\t\t\tGIT_INDEX_FILE=index.tmp &&\n'> 
                  <'\t\t\texport GIT_INDEX_FILE &&\n'> <'\t\t\tgit read-tree HEAD &&\n'> <'\t\t\tadd abandon &&\n'> <'\t\t\tadd unrelated &&\n'> 
                  <'\t\t\tgit write-tree\n'> <'\t\t)\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <'simultaneous gc ('> ($ Id.VSub_DollarName '$title') <')'>)} {(SQ <'\n'> <'\t\tgit gc --prune=12.hours.ago\n'> <'\t'>)}
            )
            (C {<test_expect_success>} 
              {(DQ <'finish writing out commit ('> ($ Id.VSub_DollarName '$title') <')'>)} 
              {
                (SQ <'\n'> <'\t\tcommit=$(echo foo | git commit-tree -p HEAD $tree) &&\n'> 
                  <'\t\tgit update-ref HEAD $commit\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'do not complain about existing broken links'>)} 
      {
        (SQ <'\n'> <'\tcat >broken-commit <<-\\EOF &&\n'> 
          <'\ttree 0000000000000000000000000000000000000001\n'> <'\tparent 0000000000000000000000000000000000000002\n'> 
          <'\tauthor whatever <whatever@example.com> 1234 -0000\n'> <'\tcommitter whatever <whatever@example.com> 1234 -0000\n'> <'\n'> <'\tsome message\n'> <'\tEOF\n'> 
          <'\tcommit=$(git hash-object -t commit -w broken-commit) &&\n'> <'\tgit gc 2>stderr &&\n'> <'\tverbose git cat-file -e $commit &&\n'> <'\ttest_must_be_empty stderr\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)