]> git.ipfire.org Git - thirdparty/git.git/blame - t/t5332-multi-pack-reuse.sh
pack-objects: enable multi-pack reuse via `feature.experimental`
[thirdparty/git.git] / t / t5332-multi-pack-reuse.sh
CommitLineData
af626ac0
TB
1#!/bin/sh
2
3test_description='pack-objects multi-pack reuse'
4
5. ./test-lib.sh
6. "$TEST_DIRECTORY"/lib-bitmap.sh
7
8objdir=.git/objects
9packdir=$objdir/pack
10
11test_pack_reused () {
12 test_trace2_data pack-objects pack-reused "$1"
13}
14
15test_packs_reused () {
16 test_trace2_data pack-objects packs-reused "$1"
17}
18
19
20# pack_position <object> </path/to/pack.idx
21pack_position () {
22 git show-index >objects &&
23 grep "$1" objects | cut -d" " -f1
24}
25
7c01878e
TB
26# test_pack_objects_reused_all <pack-reused> <packs-reused>
27test_pack_objects_reused_all () {
28 : >trace2.txt &&
29 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
30 git pack-objects --stdout --revs --all --delta-base-offset \
31 >/dev/null &&
32
33 test_pack_reused "$1" <trace2.txt &&
34 test_packs_reused "$2" <trace2.txt
35}
36
37# test_pack_objects_reused <pack-reused> <packs-reused>
38test_pack_objects_reused () {
39 : >trace2.txt &&
40 GIT_TRACE2_EVENT="$PWD/trace2.txt" \
41 git pack-objects --stdout --revs >/dev/null &&
42
43 test_pack_reused "$1" <trace2.txt &&
44 test_packs_reused "$2" <trace2.txt
45}
46
af626ac0
TB
47test_expect_success 'preferred pack is reused for single-pack reuse' '
48 test_config pack.allowPackReuse single &&
49
50 for i in A B
51 do
52 test_commit "$i" &&
53 git repack -d || return 1
54 done &&
55
56 git multi-pack-index write --bitmap &&
57
7c01878e 58 test_pack_objects_reused_all 3 1
af626ac0
TB
59'
60
23c1e713
TB
61test_expect_success 'multi-pack reuse is disabled by default' '
62 test_pack_objects_reused_all 3 1
63'
64
65test_expect_success 'feature.experimental implies multi-pack reuse' '
66 test_config feature.experimental true &&
67
68 test_pack_objects_reused_all 6 2
69'
70
71test_expect_success 'multi-pack reuse can be disabled with feature.experimental' '
72 test_config feature.experimental true &&
73 test_config pack.allowPackReuse single &&
74
75 test_pack_objects_reused_all 3 1
76'
7c01878e 77
af626ac0
TB
78test_expect_success 'enable multi-pack reuse' '
79 git config pack.allowPackReuse multi
80'
81
82test_expect_success 'reuse all objects from subset of bitmapped packs' '
83 test_commit C &&
84 git repack -d &&
85
86 git multi-pack-index write --bitmap &&
87
88 cat >in <<-EOF &&
89 $(git rev-parse C)
90 ^$(git rev-parse A)
91 EOF
92
7c01878e 93 test_pack_objects_reused 6 2 <in
af626ac0
TB
94'
95
96test_expect_success 'reuse all objects from all packs' '
7c01878e 97 test_pack_objects_reused_all 9 3
af626ac0
TB
98'
99
100test_expect_success 'reuse objects from first pack with middle gap' '
101 for i in D E F
102 do
103 test_commit "$i" || return 1
104 done &&
105
106 # Set "pack.window" to zero to ensure that we do not create any
107 # deltas, which could alter the amount of pack reuse we perform
108 # (if, for e.g., we are not sending one or more bases).
109 D="$(git -c pack.window=0 pack-objects --all --unpacked $packdir/pack)" &&
110
111 d_pos="$(pack_position $(git rev-parse D) <$packdir/pack-$D.idx)" &&
112 e_pos="$(pack_position $(git rev-parse E) <$packdir/pack-$D.idx)" &&
113 f_pos="$(pack_position $(git rev-parse F) <$packdir/pack-$D.idx)" &&
114
115 # commits F, E, and D, should appear in that order at the
116 # beginning of the pack
117 test $f_pos -lt $e_pos &&
118 test $e_pos -lt $d_pos &&
119
120 # Ensure that the pack we are constructing sorts ahead of any
121 # other packs in lexical/bitmap order by choosing it as the
122 # preferred pack.
123 git multi-pack-index write --bitmap --preferred-pack="pack-$D.idx" &&
124
125 cat >in <<-EOF &&
126 $(git rev-parse E)
127 ^$(git rev-parse D)
128 EOF
129
7c01878e 130 test_pack_objects_reused 3 1 <in
af626ac0
TB
131'
132
133test_expect_success 'reuse objects from middle pack with middle gap' '
134 rm -fr $packdir/multi-pack-index* &&
135
136 # Ensure that the pack we are constructing sort into any
137 # position *but* the first one, by choosing a different pack as
138 # the preferred one.
139 git multi-pack-index write --bitmap --preferred-pack="pack-$A.idx" &&
140
141 cat >in <<-EOF &&
142 $(git rev-parse E)
143 ^$(git rev-parse D)
144 EOF
145
7c01878e 146 test_pack_objects_reused 3 1 <in
af626ac0
TB
147'
148
149test_expect_success 'omit delta with uninteresting base (same pack)' '
150 git repack -adk &&
151
152 test_seq 32 >f &&
153 git add f &&
154 test_tick &&
155 git commit -m "delta" &&
156 delta="$(git rev-parse HEAD)" &&
157
158 test_seq 64 >f &&
159 test_tick &&
160 git commit -a -m "base" &&
161 base="$(git rev-parse HEAD)" &&
162
163 test_commit other &&
164
165 git repack -d &&
166
167 have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" &&
168
169 git multi-pack-index write --bitmap &&
170
171 cat >in <<-EOF &&
172 $(git rev-parse other)
173 ^$base
174 EOF
175
af626ac0
TB
176 # We can only reuse the 3 objects corresponding to "other" from
177 # the latest pack.
178 #
179 # This is because even though we want "delta", we do not want
180 # "base", meaning that we have to inflate the delta/base-pair
181 # corresponding to the blob in commit "delta", which bypasses
182 # the pack-reuse mechanism.
183 #
184 # The remaining objects from the other pack are similarly not
185 # reused because their objects are on the uninteresting side of
186 # the query.
7c01878e 187 test_pack_objects_reused 3 1 <in
af626ac0
TB
188'
189
190test_expect_success 'omit delta from uninteresting base (cross pack)' '
191 cat >in <<-EOF &&
192 $(git rev-parse $base)
193 ^$(git rev-parse $delta)
194 EOF
195
196 P="$(git pack-objects --revs $packdir/pack <in)" &&
197
198 git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" &&
199
af626ac0
TB
200 packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" &&
201 objects_nr="$(git rev-list --count --all --objects)" &&
202
7c01878e 203 test_pack_objects_reused_all $(($objects_nr - 1)) $packs_nr
af626ac0
TB
204'
205
206test_done