#!/bin/sh test_description='git repack --geometric works correctly' . ./test-lib.sh GIT_TEST_MULTI_PACK_INDEX=0 objdir=.git/objects midx=$objdir/pack/multi-pack-index test_expect_success '--geometric with no packs' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && git repack --write-midx --geometric 2 >out && test_i18ngrep "Nothing new to pack" out ) ' test_expect_success '--geometric with one pack' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && test_commit "base" && git repack -d && git repack --geometric 2 >out && test_i18ngrep "Nothing new to pack" out ) ' test_expect_success '--geometric with an intact progression' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && # These packs already form a geometric progression. test_commit_bulk --start=1 1 && # 3 objects test_commit_bulk --start=2 2 && # 6 objects test_commit_bulk --start=4 4 && # 12 objects find $objdir/pack -name "*.pack" | sort >expect && git repack --geometric 2 -d && find $objdir/pack -name "*.pack" | sort >actual && test_cmp expect actual ) ' test_expect_success '--geometric with loose objects' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && # These packs already form a geometric progression. test_commit_bulk --start=1 1 && # 3 objects test_commit_bulk --start=2 2 && # 6 objects # The loose objects are packed together, breaking the # progression. test_commit loose && # 3 objects find $objdir/pack -name "*.pack" | sort >before && git repack --geometric 2 -d && find $objdir/pack -name "*.pack" | sort >after && comm -13 before after >new && comm -23 before after >removed && test_line_count = 1 new && test_must_be_empty removed && git repack --geometric 2 -d && find $objdir/pack -name "*.pack" | sort >after && # The progression (3, 3, 6) is combined into one new pack. test_line_count = 1 after ) ' test_expect_success '--geometric with small-pack rollup' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && test_commit_bulk --start=1 1 && # 3 objects test_commit_bulk --start=2 1 && # 3 objects find $objdir/pack -name "*.pack" | sort >small && test_commit_bulk --start=3 4 && # 12 objects test_commit_bulk --start=7 8 && # 24 objects find $objdir/pack -name "*.pack" | sort >before && git repack --geometric 2 -d && # Three packs in total; two of the existing large ones, and one # new one. find $objdir/pack -name "*.pack" | sort >after && test_line_count = 3 after && comm -3 small before | tr -d "\t" >large && grep -qFf large after ) ' test_expect_success '--geometric with small- and large-pack rollup' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && # size(small1) + size(small2) > size(medium) / 2 test_commit_bulk --start=1 1 && # 3 objects test_commit_bulk --start=2 1 && # 3 objects test_commit_bulk --start=2 3 && # 7 objects test_commit_bulk --start=6 9 && # 27 objects && find $objdir/pack -name "*.pack" | sort >before && git repack --geometric 2 -d && find $objdir/pack -name "*.pack" | sort >after && comm -12 before after >untouched && # Two packs in total; the largest pack from before running "git # repack", and one new one. test_line_count = 1 untouched && test_line_count = 2 after ) ' test_expect_success '--geometric ignores kept packs' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && test_commit kept && # 3 objects test_commit pack && # 3 objects KEPT=$(git pack-objects --revs $objdir/pack/pack <<-EOF refs/tags/kept EOF ) && PACK=$(git pack-objects --revs $objdir/pack/pack <<-EOF refs/tags/pack ^refs/tags/kept EOF ) && # neither pack contains more than twice the number of objects in # the other, so they should be combined. but, marking one as # .kept on disk will "freeze" it, so the pack structure should # remain unchanged. touch $objdir/pack/pack-$KEPT.keep && find $objdir/pack -name "*.pack" | sort >before && git repack --geometric 2 -d && find $objdir/pack -name "*.pack" | sort >after && # both packs should still exist test_path_is_file $objdir/pack/pack-$KEPT.pack && test_path_is_file $objdir/pack/pack-$PACK.pack && # and no new packs should be created test_cmp before after && # Passing --pack-kept-objects causes packs with a .keep file to # be repacked, too. git repack --geometric 2 -d --pack-kept-objects && find $objdir/pack -name "*.pack" >after && test_line_count = 1 after ) ' test_expect_success '--geometric chooses largest MIDX preferred pack' ' git init geometric && test_when_finished "rm -fr geometric" && ( cd geometric && # These packs already form a geometric progression. test_commit_bulk --start=1 1 && # 3 objects test_commit_bulk --start=2 2 && # 6 objects ls $objdir/pack/pack-*.idx >before && test_commit_bulk --start=4 4 && # 12 objects ls $objdir/pack/pack-*.idx >after && git repack --geometric 2 -dbm && comm -3 before after | xargs -n 1 basename >expect && test-tool read-midx --preferred-pack $objdir >actual && test_cmp expect actual ) ' test_done