(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"git repack works correctly">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:fsha1) op:Equal rhs:{(SQ )} spids:[15])]
      spids: [15]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:csha1) op:Equal rhs:{(SQ )} spids:[17])]
      spids: [17]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:tsha1) op:Equal rhs:{(SQ )} spids:[19])]
      spids: [19]
    )
    (C {(test_expect_success)} {(SQ <"-A with -d option leaves unreachable objects unpacked">)} 
      {
        (SQ <"\n"> <"\techo content > file1 &&\n"> <"\tgit add . &&\n"> <"\ttest_tick &&\n"> 
          <"\tgit commit -m initial_commit &&\n"> <"\t# create a transient branch with unique content\n"> <"\tgit checkout -b transient_branch &&\n"> 
          <"\techo more content >> file1 &&\n"> <"\t# record the objects created in the database for file, commit, tree\n"> 
          <"\tfsha1=$(git hash-object file1) &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -a -m more_content &&\n"> 
          <"\tcsha1=$(git rev-parse HEAD^{commit}) &&\n"> <"\ttsha1=$(git rev-parse HEAD^{tree}) &&\n"> <"\tgit checkout master &&\n"> 
          <"\techo even more content >> file1 &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -a -m even_more_content &&\n"> 
          <"\t# delete the transient branch\n"> <"\tgit branch -D transient_branch &&\n"> <"\t# pack the repo\n"> <"\tgit repack -A -d -l &&\n"> 
          <"\t# verify objects are packed in repository\n"> <"\ttest 3 = $(git verify-pack -v -- .git/objects/pack/*.idx |\n"> 
          <"\t\t   egrep \"^($fsha1|$csha1|$tsha1) \" |\n"> <"\t\t   sort | uniq | wc -l) &&\n"> <"\tgit show $fsha1 &&\n"> <"\tgit show $csha1 &&\n"> 
          <"\tgit show $tsha1 &&\n"> <"\t# now expire the reflog, while keeping reachable ones but expiring\n"> 
          <"\t# unreachables immediately\n"> <"\ttest_tick &&\n"> <"\tsometimeago=$(( $test_tick - 10000 )) &&\n"> 
          <"\tgit reflog expire --expire=$sometimeago --expire-unreachable=$test_tick --all &&\n"> <"\t# and repack\n"> <"\tgit repack -A -d -l &&\n"> <"\t# verify objects are retained unpacked\n"> 
          <"\ttest 0 = $(git verify-pack -v -- .git/objects/pack/*.idx |\n"> <"\t\t   egrep \"^($fsha1|$csha1|$tsha1) \" |\n"> <"\t\t   sort | uniq | wc -l) &&\n"> 
          <"\tgit show $fsha1 &&\n"> <"\tgit show $csha1 &&\n"> <"\tgit show $tsha1\n">
        )
      }
    )
    (FuncDef
      name: compare_mtimes
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (C {(read)} {(tref)} {(rest)})
                (While
                  cond: [(Sentence child:(C {(read)} {(t)} {(rest)}) terminator:<Op_Semi ";">)]
                  body: 
                    (DoGroup
                      children: [
                        (AndOr
                          children: [
                            (C {(test)} {(DQ ($ VSub_Name "$tref"))} {(Lit_Other "=")} 
                              {(DQ ($ VSub_Name "$t"))}
                            )
                            (ControlFlow
                              token: <ControlFlow_Return return>
                              arg_word: {(1)}
                            )
                          ]
                          op_id: Op_DPipe
                        )
                      ]
                      spids: [101 123]
                    )
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [80]
        )
      spids: [75 79]
    )
    (C {(test_expect_success)} {(SQ <"-A without -d option leaves unreachable objects packed">)} 
      {
        (SQ <"\n"> <"\tfsha1path=$(echo \"$fsha1\" | sed -e \"s|\\(..\\)|\\1/|\") &&\n"> 
          <"\tfsha1path=\".git/objects/$fsha1path\" &&\n"> <"\tcsha1path=$(echo \"$csha1\" | sed -e \"s|\\(..\\)|\\1/|\") &&\n"> 
          <"\tcsha1path=\".git/objects/$csha1path\" &&\n"> <"\ttsha1path=$(echo \"$tsha1\" | sed -e \"s|\\(..\\)|\\1/|\") &&\n"> 
          <"\ttsha1path=\".git/objects/$tsha1path\" &&\n"> <"\tgit branch transient_branch $csha1 &&\n"> <"\tgit repack -a -d -l &&\n"> 
          <"\ttest ! -f \"$fsha1path\" &&\n"> <"\ttest ! -f \"$csha1path\" &&\n"> <"\ttest ! -f \"$tsha1path\" &&\n"> 
          <"\ttest 1 = $(ls -1 .git/objects/pack/pack-*.pack | wc -l) &&\n"> <"\tpackfile=$(ls .git/objects/pack/pack-*.pack) &&\n"> <"\tgit branch -D transient_branch &&\n"> 
          <"\ttest_tick &&\n"> <"\tgit repack -A -l &&\n"> <"\ttest ! -f \"$fsha1path\" &&\n"> <"\ttest ! -f \"$csha1path\" &&\n"> 
          <"\ttest ! -f \"$tsha1path\" &&\n"> <"\tgit show $fsha1 &&\n"> <"\tgit show $csha1 &&\n"> <"\tgit show $tsha1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"unpacked objects receive timestamp of pack file">)} 
      {
        (SQ <"\n"> <"\ttmppack=\".git/objects/pack/tmp_pack\" &&\n"> 
          <"\tln \"$packfile\" \"$tmppack\" &&\n"> <"\tgit repack -A -l -d &&\n"> 
          <"\ttest-chmtime -v +0 \"$tmppack\" \"$fsha1path\" \"$csha1path\" \"$tsha1path\" \\\n"> <"\t\t> mtimes &&\n"> <"\tcompare_mtimes < mtimes\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"do not bother loosening old objects">)} 
      {
        (SQ <"\n"> <"\tobj1=$(echo one | git hash-object -w --stdin) &&\n"> 
          <"\tobj2=$(echo two | git hash-object -w --stdin) &&\n"> <"\tpack1=$(echo $obj1 | git pack-objects .git/objects/pack/pack) &&\n"> 
          <"\tpack2=$(echo $obj2 | git pack-objects .git/objects/pack/pack) &&\n"> <"\tgit prune-packed &&\n"> <"\tgit cat-file -p $obj1 &&\n"> <"\tgit cat-file -p $obj2 &&\n"> 
          <"\ttest-chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&\n"> <"\tgit repack -A -d --unpack-unreachable=1.hour.ago &&\n"> <"\tgit cat-file -p $obj1 &&\n"> 
          <"\ttest_must_fail git cat-file -p $obj2\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"keep packed objects found only in index">)} 
      {
        (SQ <"\n"> <"\techo my-unique-content >file &&\n"> <"\tgit add file &&\n"> 
          <"\tgit commit -m \"make it reachable\" &&\n"> <"\tgit gc &&\n"> <"\tgit reset HEAD^ &&\n"> <"\tgit reflog expire --expire=now --all &&\n"> 
          <"\tgit add file &&\n"> <"\ttest-chmtime =-86400 .git/objects/pack/* &&\n"> <"\tgit gc --prune=1.hour.ago &&\n"> 
          <"\tgit cat-file blob :file\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"repack -k keeps unreachable packed objects">)} 
      {
        (SQ <"\n"> <"\t# create packed-but-unreachable object\n"> 
          <"\tsha1=$(echo unreachable-packed | git hash-object -w --stdin) &&\n"> <"\tpack=$(echo $sha1 | git pack-objects .git/objects/pack/pack) &&\n"> <"\tgit prune-packed &&\n"> 
          <"\n"> <"\t# -k should keep it\n"> <"\tgit repack -adk &&\n"> <"\tgit cat-file -p $sha1 &&\n"> <"\n"> 
          <"\t# and double check that without -k it would have been removed\n"> <"\tgit repack -ad &&\n"> <"\ttest_must_fail git cat-file -p $sha1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"repack -k packs unreachable loose objects">)} 
      {
        (SQ <"\n"> <"\t# create loose unreachable object\n"> 
          <"\tsha1=$(echo would-be-deleted-loose | git hash-object -w --stdin) &&\n"> <"\tobjpath=.git/objects/$(echo $sha1 | sed \"s,..,&/,\") &&\n"> <"\ttest_path_is_file $objpath &&\n"> 
          <"\n"> <"\t# and confirm that the loose object goes away, but we can\n"> 
          <"\t# still access it (ergo, it is packed)\n"> <"\tgit repack -adk &&\n"> <"\ttest_path_is_missing $objpath &&\n"> <"\tgit cat-file -p $sha1\n">
        )
      }
    )
    (C {(test_done)})
  ]
)