(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: [ (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 op_id: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 op_id: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>}) ] )