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