(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:prune span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:day)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Star
                    left: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Star
                        left: (arith_expr.ArithWord w:{(Id.Lit_Digits 60)})
                        right: (arith_expr.ArithWord w:{(Id.Lit_Digits 60)})
                      )
                    right: (arith_expr.ArithWord w:{(Id.Lit_Digits 24)})
                  )
              )
            }
          spids: [23]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:week)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Star
                    left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$day')})
                    right: (arith_expr.ArithWord w:{(Id.Lit_Digits 7)})
                  )
              )
            }
          spids: [33]
        )
      ]
    )
    (command.ShFunction
      name: add_blob
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:before)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:50)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(git)} {(count-objects)})
                                      (C {(sed)} {(DQ ('s/ .*//'))})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [49]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:BLOB)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:68)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(aleph_0)})
                                      (C {(git)} {(hash-object)} {(-w)} {(--stdin)})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [67]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:BLOB_FILE)
                      op: assign_op.Equal
                      rhs: 
                        {(.git/objects/) 
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:89)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {($ Id.VSub_DollarName '$BLOB')})
                                      (C {(sed)} {(DQ ('s/^../&') (Id.Lit_Other '\\') (//))})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [87]
                    )
                  ]
                )
                (C {(verbose)} {(test)} 
                  {
                    (word_part.ArithSub
                      anode: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Plus
                          left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                          right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$before')})
                        )
                    )
                  } {(Id.Lit_Equals '=')} 
                  {
                    (command_sub
                      left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:123)
                      command_list: 
                        (command.CommandList
                          children: [
                            (command.Pipeline
                              children: [(C {(git)} {(count-objects)}) (C {(sed)} {(DQ ('s/ .*//'))})]
                              negated: F
                            )
                          ]
                        )
                    )
                  }
                )
                (C {(test_path_is_file)} {($ Id.VSub_DollarName '$BLOB_FILE')})
                (C {(test-chmtime)} {(Id.Lit_Equals '=') (Id.Lit_Other '+') (0)} 
                  {($ Id.VSub_DollarName '$BLOB_FILE')}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:163) (Token id:Id.Lit_Chars val:'\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\t: > file &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:167) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\tgit gc\n' span_id:169) (Token id:Id.Lit_Chars val:'\n' span_id:170)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune stale packs' span_id:177))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:181) (Token id:Id.Lit_Chars val:'\n' span_id:182) 
          (Token
            id: Id.Lit_Chars
            val: '\torig_pack=$(echo .git/objects/pack/*.pack) &&\n'
            span_id: 183
          ) (Token id:Id.Lit_Chars val:'\t: > .git/objects/tmp_1.pack &&\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t: > .git/objects/tmp_2.pack &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-86501 .git/objects/tmp_1.pack &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\tgit prune --expire 1.day &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $orig_pack &&\n' span_id:188) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_file .git/objects/tmp_2.pack &&\n'
            span_id: 189
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/objects/tmp_1.pack\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\n' span_id:191)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune --expire' span_id:198))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) (Token id:Id.Lit_Chars val:'\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\tgit prune --expire=1.hour.ago &&\n' span_id:205) 
          (Token
            id: Id.Lit_Chars
            val: '\tverbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 206
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\ttest-chmtime =-86500 $BLOB_FILE &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\tgit prune --expire 1.day &&\n' span_id:209) 
          (Token
            id: Id.Lit_Chars
            val: '\tverbose test $before = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 210
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\n' span_id:212)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc: implicit prune --expire' span_id:219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) (Token id:Id.Lit_Chars val:'\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:225) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-$((2*$week-30)) $BLOB_FILE &&\n' span_id:226) 
          (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:227) 
          (Token
            id: Id.Lit_Chars
            val: '\tverbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 228
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:229) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-chmtime =-$((2*$week+1)) $BLOB_FILE &&\n'
            span_id: 230
          ) (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:231) 
          (Token
            id: Id.Lit_Chars
            val: '\tverbose test $before = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 232
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\n' span_id:234)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc: refuse to start with invalid gc.pruneExpire' span_id:241))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config gc.pruneExpire invalid &&\n'
            span_id: 247
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git gc\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\n' span_id:249)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc: start with ok gc.pruneExpire' span_id:256))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:260) (Token id:Id.Lit_Chars val:'\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config gc.pruneExpire 2.days.ago &&\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\tgit gc\n' span_id:263) (Token id:Id.Lit_Chars val:'\n' span_id:264)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune: prune nonsense parameters' span_id:271))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:275) (Token id:Id.Lit_Chars val:'\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git prune garbage &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\ttest_must_fail git prune --- &&\n' span_id:278) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git prune --no-such-option\n'
            span_id: 279
          ) (Token id:Id.Lit_Chars val:'\n' span_id:280)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune: prune unreachable heads' span_id:287))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:291) (Token id:Id.Lit_Chars val:'\n' span_id:292) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.logAllRefUpdates false &&\n'
            span_id: 293
          ) (Token id:Id.Lit_Chars val:'\tmv .git/logs .git/logs.old &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t: > file2 &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tgit add file2 &&\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m temporary &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\ttmp_head=$(git rev-list -1 HEAD) &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tgit reset HEAD^ &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\tgit prune &&\n' span_id:300) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git reset $tmp_head --\n'
            span_id: 301
          ) (Token id:Id.Lit_Chars val:'\n' span_id:302)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'prune: do not prune detached HEAD with no reflog'
            span_id: 309
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:313) (Token id:Id.Lit_Chars val:'\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\tgit checkout --detach --quiet &&\n' span_id:315) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m "detached commit" &&\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\t# verify that there is no reflogs\n' span_id:317) (Token id:Id.Lit_Chars val:'\t# (should be removed and disabled by previous test)\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/logs &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\tgit prune -n >prune_actual &&\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\t: >prune_expected &&\n' span_id:321) (Token id:Id.Lit_Chars val:'\ttest_cmp prune_actual prune_expected\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\n' span_id:323)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'prune: prune former HEAD after checking out branch'
            span_id: 330
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:334) (Token id:Id.Lit_Chars val:'\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\thead_sha1=$(git rev-parse HEAD) &&\n' span_id:336) (Token id:Id.Lit_Chars val:'\tgit checkout --quiet master &&\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\tgit prune -v >prune_actual &&\n' span_id:338) (Token id:Id.Lit_Chars val:'\tgrep "$head_sha1" prune_actual\n' span_id:339) 
          (Token id:Id.Lit_Chars val:'\n' span_id:340)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune: do not prune heads listed as an argument' span_id:347))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:351) (Token id:Id.Lit_Chars val:'\n' span_id:352) 
          (Token id:Id.Lit_Chars val:'\t: > file2 &&\n' span_id:353) (Token id:Id.Lit_Chars val:'\tgit add file2 &&\n' span_id:354) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m temporary &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\ttmp_head=$(git rev-list -1 HEAD) &&\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\tgit reset HEAD^ &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\tgit prune -- $tmp_head &&\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\tgit reset $tmp_head --\n' span_id:359) (Token id:Id.Lit_Chars val:'\n' span_id:360)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'gc --no-prune' span_id:367))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:371) (Token id:Id.Lit_Chars val:'\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-$((5001*$day)) $BLOB_FILE &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config gc.pruneExpire 2.days.ago &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\tgit gc --no-prune &&\n' span_id:376) 
          (Token
            id: Id.Lit_Chars
            val: '\tverbose test 1 = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 377
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\n' span_id:379)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc respects gc.pruneExpire' span_id:386))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:390) (Token id:Id.Lit_Chars val:'\n' span_id:391) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config gc.pruneExpire 5002.days.ago &&\n'
            span_id: 392
          ) (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\tgit config gc.pruneExpire 5000.days.ago &&\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\n' span_id:398)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'gc --prune=<date>' span_id:405))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:409) (Token id:Id.Lit_Chars val:'\n' span_id:410) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:411) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-$((5001*$day)) $BLOB_FILE &&\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\tgit gc --prune=5002.days.ago &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\tgit gc --prune=5000.days.ago &&\n' span_id:415) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\n' span_id:417)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'gc --prune=never' span_id:424))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:428) (Token id:Id.Lit_Chars val:'\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:430) (Token id:Id.Lit_Chars val:'\tgit gc --prune=never &&\n' span_id:431) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:432) (Token id:Id.Lit_Chars val:'\tgit gc --prune=now &&\n' span_id:433) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:434) (Token id:Id.Lit_Chars val:'\n' span_id:435)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc respects gc.pruneExpire=never' span_id:442))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:446) (Token id:Id.Lit_Chars val:'\n' span_id:447) 
          (Token id:Id.Lit_Chars val:'\tgit config gc.pruneExpire never &&\n' span_id:448) (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\tgit config gc.pruneExpire now &&\n' span_id:452) (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:453) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:454) (Token id:Id.Lit_Chars val:'\n' span_id:455)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune --expire=never' span_id:462))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:466) (Token id:Id.Lit_Chars val:'\n' span_id:467) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:468) (Token id:Id.Lit_Chars val:'\tgit prune --expire=never &&\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file $BLOB_FILE &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\tgit prune &&\n' span_id:471) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_missing $BLOB_FILE\n' span_id:472) (Token id:Id.Lit_Chars val:'\n' span_id:473)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'gc: prune old objects after local clone' span_id:480))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:484) 
          (Token id:Id.Lit_Chars val:'\tadd_blob &&\n' span_id:485) (Token id:Id.Lit_Chars val:'\ttest-chmtime =-$((2*$week+1)) $BLOB_FILE &&\n' span_id:486) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --no-hardlinks . aclone &&\n'
            span_id: 487
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:488) 
          (Token id:Id.Lit_Chars val:'\t\tcd aclone &&\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tverbose test 1 = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file $BLOB_FILE &&\n' span_id:491) 
          (Token id:Id.Lit_Chars val:'\t\tgit gc --prune &&\n' span_id:492) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tverbose test 0 = $(git count-objects | sed "s/ .*//") &&\n'
            span_id: 493
          ) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing $BLOB_FILE\n' span_id:494) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:495)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'garbage report in count-objects -v' span_id:502))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:506) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -f .git/objects/pack/fake*" &&\n'
            span_id: 507
          ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "rm -f .git/objects/pack/foo*" &&\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo.bar &&\n' span_id:510) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo.keep &&\n' span_id:511) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo.pack &&\n' span_id:512) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake.bar &&\n' span_id:513) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake.keep &&\n' span_id:514) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake.pack &&\n' span_id:515) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake.idx &&\n' span_id:516) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake2.keep &&\n' span_id:517) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake3.idx &&\n' span_id:518) 
          (Token id:Id.Lit_Chars val:'\tgit count-objects -v 2>stderr &&\n' span_id:519) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "index file .git/objects/pack/fake.idx is too small" stderr &&\n'
            span_id: 520
          ) (Token id:Id.Lit_Chars val:'\tgrep "^warning:" stderr | sort >actual &&\n' span_id:521) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<\\EOF &&\n' span_id:522) (Token id:Id.Lit_Chars val:'warning: garbage found: .git/objects/pack/fake.bar\n' span_id:523) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: garbage found: .git/objects/pack/foo\n'
            span_id: 524
          ) (Token id:Id.Lit_Chars val:'warning: garbage found: .git/objects/pack/foo.bar\n' span_id:525) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx or .pack: .git/objects/pack/fake2.keep\n'
            span_id: 526
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx: .git/objects/pack/foo.keep\n'
            span_id: 527
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx: .git/objects/pack/foo.pack\n'
            span_id: 528
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .pack: .git/objects/pack/fake3.idx\n'
            span_id: 529
          ) (Token id:Id.Lit_Chars val:'EOF\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:531)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clean pack garbage with gc' span_id:538))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:542) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -f .git/objects/pack/fake*" &&\n'
            span_id: 543
          ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "rm -f .git/objects/pack/foo*" &&\n' span_id:544) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo.keep &&\n' span_id:545) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/foo.pack &&\n' span_id:546) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake.idx &&\n' span_id:547) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake2.keep &&\n' span_id:548) 
          (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake2.idx &&\n' span_id:549) (Token id:Id.Lit_Chars val:'\t: >.git/objects/pack/fake3.keep &&\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\tgit gc &&\n' span_id:551) (Token id:Id.Lit_Chars val:'\tgit count-objects -v 2>stderr &&\n' span_id:552) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "^warning:" stderr | sort >actual &&\n'
            span_id: 553
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<\\EOF &&\n' span_id:554) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx or .pack: .git/objects/pack/fake3.keep\n'
            span_id: 555
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx: .git/objects/pack/foo.keep\n'
            span_id: 556
          ) 
          (Token
            id: Id.Lit_Chars
            val: 'warning: no corresponding .idx: .git/objects/pack/foo.pack\n'
            span_id: 557
          ) (Token id:Id.Lit_Chars val:'EOF\n' span_id:558) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:559)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune .git/shallow' span_id:566))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:570) 
          (Token
            id: Id.Lit_Chars
            val: '\tSHA1=$(echo hi|git commit-tree HEAD^{tree}) &&\n'
            span_id: 571
          ) (Token id:Id.Lit_Chars val:'\techo $SHA1 >.git/shallow &&\n' span_id:572) 
          (Token id:Id.Lit_Chars val:'\tgit prune --dry-run >out &&\n' span_id:573) (Token id:Id.Lit_Chars val:'\tgrep $SHA1 .git/shallow &&\n' span_id:574) 
          (Token id:Id.Lit_Chars val:'\tgrep $SHA1 out &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\tgit prune &&\n' span_id:576) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/shallow\n' span_id:577)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune: handle alternate object database' span_id:584))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:588) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo A &&\n' span_id:589) (Token id:Id.Lit_Chars val:'\tgit -C A commit --allow-empty -m "initial commit" &&\n' span_id:590) 
          (Token id:Id.Lit_Chars val:'\tgit clone --shared A B &&\n' span_id:591) (Token id:Id.Lit_Chars val:'\tgit -C B commit --allow-empty -m "next commit" &&\n' span_id:592) 
          (Token id:Id.Lit_Chars val:'\tgit -C B prune\n' span_id:593)
        )
      }
    )
    (C {(test_done)})
  ]
)