pack-bitmap: enable reuse from all bitmapped packs
[git/gitster.git] / t / t5332-multi-pack-reuse.sh
blob2ba788b0421b6a7dcaf8f8ff420f5ec97cdab72b
1 #!/bin/sh
3 test_description='pack-objects multi-pack reuse'
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/lib-bitmap.sh
8 objdir=.git/objects
9 packdir=$objdir/pack
11 test_pack_reused () {
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
21 pack_position () {
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 &&
29 for i in A B
31 test_commit "$i" &&
32 git repack -d || return 1
33 done &&
35 git multi-pack-index write --bitmap &&
37 : >trace2.txt &&
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' '
50 test_commit C &&
51 git repack -d &&
53 git multi-pack-index write --bitmap &&
55 cat >in <<-EOF &&
56 $(git rev-parse C)
57 ^$(git rev-parse A)
58 EOF
60 : >trace2.txt &&
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' '
69 : >trace2.txt &&
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' '
78 for i in D E F
80 test_commit "$i" || return 1
81 done &&
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
99 # preferred pack.
100 git multi-pack-index write --bitmap --preferred-pack="pack-$D.idx" &&
102 cat >in <<-EOF &&
103 $(git rev-parse E)
104 ^$(git rev-parse D)
107 : >trace2.txt &&
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
120 # the preferred one.
121 git multi-pack-index write --bitmap --preferred-pack="pack-$A.idx" &&
123 cat >in <<-EOF &&
124 $(git rev-parse E)
125 ^$(git rev-parse D)
128 : >trace2.txt &&
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)' '
137 git repack -adk &&
139 test_seq 32 >f &&
140 git add f &&
141 test_tick &&
142 git commit -m "delta" &&
143 delta="$(git rev-parse HEAD)" &&
145 test_seq 64 >f &&
146 test_tick &&
147 git commit -a -m "base" &&
148 base="$(git rev-parse HEAD)" &&
150 test_commit other &&
152 git repack -d &&
154 have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" &&
156 git multi-pack-index write --bitmap &&
158 cat >in <<-EOF &&
159 $(git rev-parse other)
160 ^$base
163 : >trace2.txt &&
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
168 # the latest pack.
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
177 # the query.
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)' '
183 cat >in <<-EOF &&
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" &&
192 : >trace2.txt &&
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
203 test_done