]> git.ipfire.org Git - thirdparty/git.git/blob - t/t5332-multi-pack-reuse.sh
pack-bitmap: enable reuse from all bitmapped packs
[thirdparty/git.git] / t / t5332-multi-pack-reuse.sh
1 #!/bin/sh
2
3 test_description='pack-objects multi-pack reuse'
4
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/lib-bitmap.sh
7
8 objdir=.git/objects
9 packdir=$objdir/pack
10
11 test_pack_reused () {
12 test_trace2_data pack-objects pack-reused "$1"
13 }
14
15 test_packs_reused () {
16 test_trace2_data pack-objects packs-reused "$1"
17 }
18
19
20 # pack_position <object> </path/to/pack.idx
21 pack_position () {
22 git show-index >objects &&
23 grep "$1" objects | cut -d" " -f1
24 }
25
26 test_expect_success 'preferred pack is reused for single-pack reuse' '
27 test_config pack.allowPackReuse single &&
28
29 for i in A B
30 do
31 test_commit "$i" &&
32 git repack -d || return 1
33 done &&
34
35 git multi-pack-index write --bitmap &&
36
37 : >trace2.txt &&
38 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
39 git pack-objects --stdout --revs --all >/dev/null &&
40
41 test_pack_reused 3 <trace2.txt &&
42 test_packs_reused 1 <trace2.txt
43 '
44
45 test_expect_success 'enable multi-pack reuse' '
46 git config pack.allowPackReuse multi
47 '
48
49 test_expect_success 'reuse all objects from subset of bitmapped packs' '
50 test_commit C &&
51 git repack -d &&
52
53 git multi-pack-index write --bitmap &&
54
55 cat >in <<-EOF &&
56 $(git rev-parse C)
57 ^$(git rev-parse A)
58 EOF
59
60 : >trace2.txt &&
61 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
62 git pack-objects --stdout --revs <in >/dev/null &&
63
64 test_pack_reused 6 <trace2.txt &&
65 test_packs_reused 2 <trace2.txt
66 '
67
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 &&
72
73 test_pack_reused 9 <trace2.txt &&
74 test_packs_reused 3 <trace2.txt
75 '
76
77 test_expect_success 'reuse objects from first pack with middle gap' '
78 for i in D E F
79 do
80 test_commit "$i" || return 1
81 done &&
82
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)" &&
87
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)" &&
91
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 &&
96
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" &&
101
102 cat >in <<-EOF &&
103 $(git rev-parse E)
104 ^$(git rev-parse D)
105 EOF
106
107 : >trace2.txt &&
108 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
109 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
110
111 test_pack_reused 3 <trace2.txt &&
112 test_packs_reused 1 <trace2.txt
113 '
114
115 test_expect_success 'reuse objects from middle pack with middle gap' '
116 rm -fr $packdir/multi-pack-index* &&
117
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" &&
122
123 cat >in <<-EOF &&
124 $(git rev-parse E)
125 ^$(git rev-parse D)
126 EOF
127
128 : >trace2.txt &&
129 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
130 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
131
132 test_pack_reused 3 <trace2.txt &&
133 test_packs_reused 1 <trace2.txt
134 '
135
136 test_expect_success 'omit delta with uninteresting base (same pack)' '
137 git repack -adk &&
138
139 test_seq 32 >f &&
140 git add f &&
141 test_tick &&
142 git commit -m "delta" &&
143 delta="$(git rev-parse HEAD)" &&
144
145 test_seq 64 >f &&
146 test_tick &&
147 git commit -a -m "base" &&
148 base="$(git rev-parse HEAD)" &&
149
150 test_commit other &&
151
152 git repack -d &&
153
154 have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" &&
155
156 git multi-pack-index write --bitmap &&
157
158 cat >in <<-EOF &&
159 $(git rev-parse other)
160 ^$base
161 EOF
162
163 : >trace2.txt &&
164 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
165 git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
166
167 # We can only reuse the 3 objects corresponding to "other" from
168 # the latest pack.
169 #
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.
174 #
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
180 '
181
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)
186 EOF
187
188 P="$(git pack-objects --revs $packdir/pack <in)" &&
189
190 git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" &&
191
192 : >trace2.txt &&
193 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
194 git pack-objects --stdout --delta-base-offset --all >/dev/null &&
195
196 packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" &&
197 objects_nr="$(git rev-list --count --all --objects)" &&
198
199 test_pack_reused $(($objects_nr - 1)) <trace2.txt &&
200 test_packs_reused $packs_nr <trace2.txt
201 '
202
203 test_done