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