(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:'git repack works correctly' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fsha1)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [15]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:csha1)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [17]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:tsha1)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [19]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '-A with -d option leaves unreachable objects unpacked'
            span_id: 25
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\techo content > file1 &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\tgit add . &&\n' span_id:31) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\tgit commit -m initial_commit &&\n' span_id:33) 
          (Token
            id: Id.Lit_Chars
            val: '\t# create a transient branch with unique content\n'
            span_id: 34
          ) (Token id:Id.Lit_Chars val:'\tgit checkout -b transient_branch &&\n' span_id:35) 
          (Token id:Id.Lit_Chars val:'\techo more content >> file1 &&\n' span_id:36) 
          (Token
            id: Id.Lit_Chars
            val: '\t# record the objects created in the database for file, commit, tree\n'
            span_id: 37
          ) (Token id:Id.Lit_Chars val:'\tfsha1=$(git hash-object file1) &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit commit -a -m more_content &&\n' span_id:40) 
          (Token
            id: Id.Lit_Chars
            val: '\tcsha1=$(git rev-parse HEAD^{commit}) &&\n'
            span_id: 41
          ) (Token id:Id.Lit_Chars val:'\ttsha1=$(git rev-parse HEAD^{tree}) &&\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\techo even more content >> file1 &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\tgit commit -a -m even_more_content &&\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\t# delete the transient branch\n' span_id:47) (Token id:Id.Lit_Chars val:'\tgit branch -D transient_branch &&\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\t# pack the repo\n' span_id:49) (Token id:Id.Lit_Chars val:'\tgit repack -A -d -l &&\n' span_id:50) 
          (Token
            id: Id.Lit_Chars
            val: '\t# verify objects are packed in repository\n'
            span_id: 51
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest 3 = $(git verify-pack -v -- .git/objects/pack/*.idx |\n'
            span_id: 52
          ) (Token id:Id.Lit_Chars val:'\t\t   egrep "^($fsha1|$csha1|$tsha1) " |\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\t\t   sort | uniq | wc -l) &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\tgit show $fsha1 &&\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\tgit show $csha1 &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tgit show $tsha1 &&\n' span_id:57) 
          (Token
            id: Id.Lit_Chars
            val: '\t# now expire the reflog, while keeping reachable ones but expiring\n'
            span_id: 58
          ) (Token id:Id.Lit_Chars val:'\t# unreachables immediately\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\tsometimeago=$(( $test_tick - 10000 )) &&\n' span_id:61) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit reflog expire --expire=$sometimeago --expire-unreachable=$test_tick --all &&\n'
            span_id: 62
          ) (Token id:Id.Lit_Chars val:'\t# and repack\n' span_id:63) 
          (Token id:Id.Lit_Chars val:'\tgit repack -A -d -l &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\t# verify objects are retained unpacked\n' span_id:65) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest 0 = $(git verify-pack -v -- .git/objects/pack/*.idx |\n'
            span_id: 66
          ) (Token id:Id.Lit_Chars val:'\t\t   egrep "^($fsha1|$csha1|$tsha1) " |\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\t\t   sort | uniq | wc -l) &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\tgit show $fsha1 &&\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\tgit show $csha1 &&\n' span_id:70) (Token id:Id.Lit_Chars val:'\tgit show $tsha1\n' span_id:71)
        )
      }
    )
    (command.ShFunction
      name: compare_mtimes
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(read)} {(tref)} {(rest)})
                (command.WhileUntil
                  keyword: (Token id:Id.KW_While val:while span_id:92)
                  cond: [
                    (command.Sentence
                      child: (C {(read)} {(t)} {(rest)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:99)
                    )
                  ]
                  body: 
                    (command.DoGroup
                      children: [
                        (command.AndOr
                          ops: [Id.Op_DPipe]
                          children: [
                            (C {(test)} {(DQ ($ Id.VSub_DollarName '$tref'))} {(Id.Lit_Equals '=')} 
                              {(DQ ($ Id.VSub_DollarName '$t'))}
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:118)
                              arg_word: {(1)}
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '-A without -d option leaves unreachable objects packed'
            span_id: 131
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:135) 
          (Token
            id: Id.Lit_Chars
            val: '\tfsha1path=$(echo "$fsha1" | sed -e "s|\\(..\\)|\\1/|") &&\n'
            span_id: 136
          ) (Token id:Id.Lit_Chars val:'\tfsha1path=".git/objects/$fsha1path" &&\n' span_id:137) 
          (Token
            id: Id.Lit_Chars
            val: '\tcsha1path=$(echo "$csha1" | sed -e "s|\\(..\\)|\\1/|") &&\n'
            span_id: 138
          ) (Token id:Id.Lit_Chars val:'\tcsha1path=".git/objects/$csha1path" &&\n' span_id:139) 
          (Token
            id: Id.Lit_Chars
            val: '\ttsha1path=$(echo "$tsha1" | sed -e "s|\\(..\\)|\\1/|") &&\n'
            span_id: 140
          ) (Token id:Id.Lit_Chars val:'\ttsha1path=".git/objects/$tsha1path" &&\n' span_id:141) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit branch transient_branch $csha1 &&\n'
            span_id: 142
          ) (Token id:Id.Lit_Chars val:'\tgit repack -a -d -l &&\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f "$fsha1path" &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\ttest ! -f "$csha1path" &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f "$tsha1path" &&\n' span_id:146) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest 1 = $(ls -1 .git/objects/pack/pack-*.pack | wc -l) &&\n'
            span_id: 147
          ) (Token id:Id.Lit_Chars val:'\tpackfile=$(ls .git/objects/pack/pack-*.pack) &&\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tgit branch -D transient_branch &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\tgit repack -A -l &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\ttest ! -f "$fsha1path" &&\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f "$csha1path" &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\ttest ! -f "$tsha1path" &&\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\tgit show $fsha1 &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\tgit show $csha1 &&\n' span_id:156) 
          (Token id:Id.Lit_Chars val:'\tgit show $tsha1\n' span_id:157)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'unpacked objects receive timestamp of pack file' span_id:164))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:168) 
          (Token
            id: Id.Lit_Chars
            val: '\ttmppack=".git/objects/pack/tmp_pack" &&\n'
            span_id: 169
          ) (Token id:Id.Lit_Chars val:'\tln "$packfile" "$tmppack" &&\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\tgit repack -A -l -d &&\n' span_id:171) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-chmtime -v +0 "$tmppack" "$fsha1path" "$csha1path" "$tsha1path" \\\n'
            span_id: 172
          ) (Token id:Id.Lit_Chars val:'\t\t> mtimes &&\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\tcompare_mtimes < mtimes\n' span_id:174)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not bother loosening old objects' span_id:181))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) 
          (Token
            id: Id.Lit_Chars
            val: '\tobj1=$(echo one | git hash-object -w --stdin) &&\n'
            span_id: 186
          ) (Token id:Id.Lit_Chars val:'\tobj2=$(echo two | git hash-object -w --stdin) &&\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\tpack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&\n'
            span_id: 188
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tpack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&\n'
            span_id: 189
          ) (Token id:Id.Lit_Chars val:'\tgit prune-packed &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file -p $obj1 &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\tgit cat-file -p $obj2 &&\n' span_id:192) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&\n'
            span_id: 193
          ) (Token id:Id.Lit_Chars val:'\tgit repack -A -d --unpack-unreachable=1.hour.ago &&\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file -p $obj1 &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cat-file -p $obj2\n' span_id:196)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'keep packed objects found only in index' span_id:203))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\techo my-unique-content >file &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:209) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "make it reachable" &&\n'
            span_id: 210
          ) (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\tgit reset HEAD^ &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\tgit reflog expire --expire=now --all &&\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:214) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-86400 .git/objects/pack/* &&\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\tgit gc --prune=1.hour.ago &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\tgit cat-file blob :file\n' span_id:217)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'repack -k keeps unreachable packed objects' span_id:224))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:228) 
          (Token
            id: Id.Lit_Chars
            val: '\t# create packed-but-unreachable object\n'
            span_id: 229
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(echo unreachable-packed | git hash-object -w --stdin) &&\n'
            span_id: 230
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tpack=$(echo $sha1 | git pack-objects .git/objects/pack/pack) &&\n'
            span_id: 231
          ) (Token id:Id.Lit_Chars val:'\tgit prune-packed &&\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\n' span_id:233) (Token id:Id.Lit_Chars val:'\t# -k should keep it\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'\tgit repack -adk &&\n' span_id:235) (Token id:Id.Lit_Chars val:'\tgit cat-file -p $sha1 &&\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'\n' span_id:237) 
          (Token
            id: Id.Lit_Chars
            val: '\t# and double check that without -k it would have been removed\n'
            span_id: 238
          ) (Token id:Id.Lit_Chars val:'\tgit repack -ad &&\n' span_id:239) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cat-file -p $sha1\n'
            span_id: 240
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'repack -k packs unreachable loose objects' span_id:247))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'\t# create loose unreachable object\n' span_id:252) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(echo would-be-deleted-loose | git hash-object -w --stdin) &&\n'
            span_id: 253
          ) (Token id:Id.Lit_Chars val:'\tobjpath=.git/objects/$(echo $sha1 | sed "s,..,&/,") &&\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file $objpath &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\n' span_id:256) 
          (Token
            id: Id.Lit_Chars
            val: '\t# and confirm that the loose object goes away, but we can\n'
            span_id: 257
          ) (Token id:Id.Lit_Chars val:'\t# still access it (ergo, it is packed)\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\tgit repack -adk &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $objpath &&\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file -p $sha1\n' span_id:261)
        )
      }
    )
    (C {(test_done)})
  ]
)