3 test_description
='pack-objects multi-pack reuse'
6 .
"$TEST_DIRECTORY"/lib-bitmap.sh
12 test_trace2_data pack-objects pack-reused
"$1"
15 test_packs_reused
() {
16 test_trace2_data pack-objects packs-reused
"$1"
20 # pack_position <object> </path/to/pack.idx
22 git show-index
>objects
&&
23 grep "$1" objects | cut
-d" " -f1
26 test_expect_success
'preferred pack is reused for single-pack reuse' '
27 test_config pack.allowPackReuse single &&
32 git repack -d || return 1
35 git multi-pack-index write --bitmap &&
38 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
39 git pack-objects --stdout --revs --all >/dev/null &&
41 test_pack_reused 3 <trace2.txt &&
42 test_packs_reused 1 <trace2.txt
45 test_expect_success
'enable multi-pack reuse' '
46 git config pack.allowPackReuse multi
49 test_expect_success
'reuse all objects from subset of bitmapped packs' '
53 git multi-pack-index write --bitmap &&
61 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
62 git pack-objects --stdout --revs <in >/dev/null &&
64 test_pack_reused 6 <trace2.txt &&
65 test_packs_reused 2 <trace2.txt
68 test_expect_success
'reuse all objects from all packs' '
70 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
71 git pack-objects --stdout --revs --all >/dev/null &&
73 test_pack_reused 9 <trace2.txt &&
74 test_packs_reused 3 <trace2.txt
77 test_expect_success
'reuse objects from first pack with middle gap' '
80 test_commit "$i" || return 1
83 # Set "pack.window" to zero to ensure that we do not create any
84 # deltas, which could alter the amount of pack reuse we perform
85 # (if, for e.g., we are not sending one or more bases).
86 D="$(git -c pack.window=0 pack-objects --all --unpacked $packdir/pack)" &&
88 d_pos="$(pack_position $(git rev-parse D) <$packdir/pack-$D.idx)" &&
89 e_pos="$(pack_position $(git rev-parse E) <$packdir/pack-$D.idx)" &&
90 f_pos="$(pack_position $(git rev-parse F) <$packdir/pack-$D.idx)" &&
92 # commits F, E, and D, should appear in that order at the
93 # beginning of the pack
94 test $f_pos -lt $e_pos &&
95 test $e_pos -lt $d_pos &&
97 # Ensure that the pack we are constructing sorts ahead of any
98 # other packs in lexical/bitmap order by choosing it as the
100 git multi-pack-index write --bitmap --preferred-pack="pack-$D.idx" &&
108 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
109 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
111 test_pack_reused 3 <trace2.txt &&
112 test_packs_reused 1 <trace2.txt
115 test_expect_success
'reuse objects from middle pack with middle gap' '
116 rm -fr $packdir/multi-pack-index* &&
118 # Ensure that the pack we are constructing sort into any
119 # position *but* the first one, by choosing a different pack as
121 git multi-pack-index write --bitmap --preferred-pack="pack-$A.idx" &&
129 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
130 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
132 test_pack_reused 3 <trace2.txt &&
133 test_packs_reused 1 <trace2.txt
136 test_expect_success
'omit delta with uninteresting base (same pack)' '
142 git commit -m "delta" &&
143 delta="$(git rev-parse HEAD)" &&
147 git commit -a -m "base" &&
148 base="$(git rev-parse HEAD)" &&
154 have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" &&
156 git multi-pack-index write --bitmap &&
159 $(git rev-parse other)
164 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
165 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
167 # We can only reuse the 3 objects corresponding to "other" from
170 # This is because even though we want "delta", we do not want
171 # "base", meaning that we have to inflate the delta/base-pair
172 # corresponding to the blob in commit "delta", which bypasses
173 # the pack-reuse mechanism.
175 # The remaining objects from the other pack are similarly not
176 # reused because their objects are on the uninteresting side of
178 test_pack_reused 3 <trace2.txt &&
179 test_packs_reused 1 <trace2.txt
182 test_expect_success
'omit delta from uninteresting base (cross pack)' '
184 $(git rev-parse $base)
185 ^$(git rev-parse $delta)
188 P="$(git pack-objects --revs $packdir/pack <in)" &&
190 git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" &&
193 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
194 git pack-objects --stdout --delta-base-offset --all >/dev/null &&
196 packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" &&
197 objects_nr="$(git rev-list --count --all --objects)" &&
199 test_pack_reused $(($objects_nr - 1)) <trace2.txt &&
200 test_packs_reused $packs_nr <trace2.txt