(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description spids:[76]) op: Equal rhs: {(SQ <'check pruning of dependent objects'>)} spids: [76] ) ] spids: [76] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: add body: (BraceGroup children: [ (AndOr ops: [Op_DAmp] children: [ (SimpleCommand words: [{(echo)} {(DQ ($ VSub_Number '$1'))}] redirects: [ (Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(DQ ($ VSub_Number '$1'))} ) ] ) (C {(git)} {(add)} {(DQ ($ VSub_Number '$1'))}) ] ) ] spids: [97] ) spids: [92 96] ) (FuncDef name: commit body: (BraceGroup children: [ (AndOr ops: [Op_DAmp Op_DAmp] children: [ (C {(test_tick)}) (C {(add)} {(DQ ($ VSub_Number '$1'))}) (C {(git)} {(commit)} {(-m)} {(DQ ($ VSub_Number '$1'))}) ] ) ] spids: [129] ) spids: [124 128] ) (FuncDef name: maybe_repack body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (C {(test)} {(-n)} {(DQ ($ VSub_Name '$repack'))}) terminator: <Op_Semi ';'> ) ] action: [(C {(git)} {(repack)} {(-ad)})] spids: [16777215 178] ) ] spids: [16777215 188] ) ] spids: [164] ) spids: [159 163] ) (ForEach iter_name: repack iter_words: [{(SQ )} {(true)}] do_arg_iter: F body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:title spids:[208]) op: Equal rhs: { (BracedVarSub token: <VSub_Name repack> suffix_op: (StringUnary op_id:VTest_ColonPlus arg_word:{(repack)}) spids: [209 213] ) } spids: [208] ) ] spids: [208] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:title spids:[216]) op: Equal rhs: { (BracedVarSub token: <VSub_Name title> suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(loose)}) spids: [217 221] ) } spids: [216] ) ] spids: [216] ) (C {(test_expect_success)} {(DQ ('make repo completely empty (') ($ VSub_Name '$title') (')'))} {(SQ <'\n'> <'\t\trm -rf .git &&\n'> <'\t\tgit init\n'> <'\t'>)} ) (C {(test_expect_success)} {(DQ ('disable reflogs (') ($ VSub_Name '$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 (') ($ VSub_Name '$title') (')'))} {(SQ <'\n'> <'\t\tcommit base\n'> <'\t'>)} ) (C {(test_expect_success)} {(DQ ('create and abandon some objects (') ($ VSub_Name '$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 (') ($ VSub_Name '$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 (') ($ VSub_Name '$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 (') ($ VSub_Name '$title') (')'))} {(SQ <'\n'> <'\t\tgit gc --prune=12.hours.ago\n'> <'\t'>)} ) (C {(test_expect_success)} {(DQ ('finish writing out commit (') ($ VSub_Name '$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 (') ($ VSub_Name '$title') (')'))} {(SQ <'\n'> <'\t\tgit fsck\n'> <'\t'>)} ) (C {(test_expect_success)} {(DQ ('abandon objects again (') ($ VSub_Name '$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 (') ($ VSub_Name '$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 (') ($ VSub_Name '$title') (')'))} {(SQ <'\n'> <'\t\tgit gc --prune=12.hours.ago\n'> <'\t'>)} ) (C {(test_expect_success)} {(DQ ('finish writing out commit (') ($ VSub_Name '$title') (')'))} { (SQ <'\n'> <'\t\tcommit=$(echo foo | git commit-tree -p HEAD $tree) &&\n'> <'\t\tgit update-ref HEAD $commit\n'> <'\t'> ) } ) ] spids: [205 464] ) spids: [198 203] ) (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)}) ] )