]> git.ipfire.org Git - thirdparty/git.git/blame - t/t5326-multi-pack-bitmaps.sh
t5326: test multi-pack bitmap behavior
[thirdparty/git.git] / t / t5326-multi-pack-bitmaps.sh
CommitLineData
c51f5a64
TB
1#!/bin/sh
2
3test_description='exercise basic multi-pack bitmap functionality'
4. ./test-lib.sh
5. "${TEST_DIRECTORY}/lib-bitmap.sh"
6
7# We'll be writing our own midx and bitmaps, so avoid getting confused by the
8# automatic ones.
9GIT_TEST_MULTI_PACK_INDEX=0
10GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0
11
12objdir=.git/objects
13midx=$objdir/pack/multi-pack-index
14
15# midx_pack_source <obj>
16midx_pack_source () {
17 test-tool read-midx --show-objects .git/objects | grep "^$1 " | cut -f2
18}
19
20setup_bitmap_history
21
22test_expect_success 'enable core.multiPackIndex' '
23 git config core.multiPackIndex true
24'
25
26test_expect_success 'create single-pack midx with bitmaps' '
27 git repack -ad &&
28 git multi-pack-index write --bitmap &&
29 test_path_is_file $midx &&
30 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
31 test_path_is_file $midx-$(midx_checksum $objdir).rev
32'
33
34basic_bitmap_tests
35
36test_expect_success 'create new additional packs' '
37 for i in $(test_seq 1 16)
38 do
39 test_commit "$i" &&
40 git repack -d || return 1
41 done &&
42
43 git checkout -b other2 HEAD~8 &&
44 for i in $(test_seq 1 8)
45 do
46 test_commit "side-$i" &&
47 git repack -d || return 1
48 done &&
49 git checkout second
50'
51
52test_expect_success 'create multi-pack midx with bitmaps' '
53 git multi-pack-index write --bitmap &&
54
55 ls $objdir/pack/pack-*.pack >packs &&
56 test_line_count = 25 packs &&
57
58 test_path_is_file $midx &&
59 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
60 test_path_is_file $midx-$(midx_checksum $objdir).rev
61'
62
63basic_bitmap_tests
64
65test_expect_success '--no-bitmap is respected when bitmaps exist' '
66 git multi-pack-index write --bitmap &&
67
68 test_commit respect--no-bitmap &&
69 git repack -d &&
70
71 test_path_is_file $midx &&
72 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
73 test_path_is_file $midx-$(midx_checksum $objdir).rev &&
74
75 git multi-pack-index write --no-bitmap &&
76
77 test_path_is_file $midx &&
78 test_path_is_missing $midx-$(midx_checksum $objdir).bitmap &&
79 test_path_is_missing $midx-$(midx_checksum $objdir).rev
80'
81
82test_expect_success 'setup midx with base from later pack' '
83 # Write a and b so that "a" is a delta on top of base "b", since Git
84 # prefers to delete contents out of a base rather than add to a shorter
85 # object.
86 test_seq 1 128 >a &&
87 test_seq 1 130 >b &&
88
89 git add a b &&
90 git commit -m "initial commit" &&
91
92 a=$(git rev-parse HEAD:a) &&
93 b=$(git rev-parse HEAD:b) &&
94
95 # In the first pack, "a" is stored as a delta to "b".
96 p1=$(git pack-objects .git/objects/pack/pack <<-EOF
97 $a
98 $b
99 EOF
100 ) &&
101
102 # In the second pack, "a" is missing, and "b" is not a delta nor base to
103 # any other object.
104 p2=$(git pack-objects .git/objects/pack/pack <<-EOF
105 $b
106 $(git rev-parse HEAD)
107 $(git rev-parse HEAD^{tree})
108 EOF
109 ) &&
110
111 git prune-packed &&
112 # Use the second pack as the preferred source, so that "b" occurs
113 # earlier in the MIDX object order, rendering "a" unusable for pack
114 # reuse.
115 git multi-pack-index write --bitmap --preferred-pack=pack-$p2.idx &&
116
117 have_delta $a $b &&
118 test $(midx_pack_source $a) != $(midx_pack_source $b)
119'
120
121rev_list_tests 'full bitmap with backwards delta'
122
123test_expect_success 'clone with bitmaps enabled' '
124 git clone --no-local --bare . clone-reverse-delta.git &&
125 test_when_finished "rm -fr clone-reverse-delta.git" &&
126
127 git rev-parse HEAD >expect &&
128 git --git-dir=clone-reverse-delta.git rev-parse HEAD >actual &&
129 test_cmp expect actual
130'
131
132bitmap_reuse_tests() {
133 from=$1
134 to=$2
135
136 test_expect_success "setup pack reuse tests ($from -> $to)" '
137 rm -fr repo &&
138 git init repo &&
139 (
140 cd repo &&
141 test_commit_bulk 16 &&
142 git tag old-tip &&
143
144 git config core.multiPackIndex true &&
145 if test "MIDX" = "$from"
146 then
147 git repack -Ad &&
148 git multi-pack-index write --bitmap
149 else
150 git repack -Adb
151 fi
152 )
153 '
154
155 test_expect_success "build bitmap from existing ($from -> $to)" '
156 (
157 cd repo &&
158 test_commit_bulk --id=further 16 &&
159 git tag new-tip &&
160
161 if test "MIDX" = "$to"
162 then
163 git repack -d &&
164 git multi-pack-index write --bitmap
165 else
166 git repack -Adb
167 fi
168 )
169 '
170
171 test_expect_success "verify resulting bitmaps ($from -> $to)" '
172 (
173 cd repo &&
174 git for-each-ref &&
175 git rev-list --test-bitmap refs/tags/old-tip &&
176 git rev-list --test-bitmap refs/tags/new-tip
177 )
178 '
179}
180
181bitmap_reuse_tests 'pack' 'MIDX'
182bitmap_reuse_tests 'MIDX' 'pack'
183bitmap_reuse_tests 'MIDX' 'MIDX'
184
185test_expect_success 'missing object closure fails gracefully' '
186 rm -fr repo &&
187 git init repo &&
188 test_when_finished "rm -fr repo" &&
189 (
190 cd repo &&
191
192 test_commit loose &&
193 test_commit packed &&
194
195 # Do not pass "--revs"; we want a pack without the "loose"
196 # commit.
197 git pack-objects $objdir/pack/pack <<-EOF &&
198 $(git rev-parse packed)
199 EOF
200
201 test_must_fail git multi-pack-index write --bitmap 2>err &&
202 grep "doesn.t have full closure" err &&
203 test_path_is_missing $midx
204 )
205'
206
207test_expect_success 'setup partial bitmaps' '
208 test_commit packed &&
209 git repack &&
210 test_commit loose &&
211 git multi-pack-index write --bitmap 2>err &&
212 test_path_is_file $midx &&
213 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
214 test_path_is_file $midx-$(midx_checksum $objdir).rev
215'
216
217basic_bitmap_tests HEAD~
218
219test_expect_success 'removing a MIDX clears stale bitmaps' '
220 rm -fr repo &&
221 git init repo &&
222 test_when_finished "rm -fr repo" &&
223 (
224 cd repo &&
225 test_commit base &&
226 git repack &&
227 git multi-pack-index write --bitmap &&
228
229 # Write a MIDX and bitmap; remove the MIDX but leave the bitmap.
230 stale_bitmap=$midx-$(midx_checksum $objdir).bitmap &&
231 stale_rev=$midx-$(midx_checksum $objdir).rev &&
232 rm $midx &&
233
234 # Then write a new MIDX.
235 test_commit new &&
236 git repack &&
237 git multi-pack-index write --bitmap &&
238
239 test_path_is_file $midx &&
240 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
241 test_path_is_file $midx-$(midx_checksum $objdir).rev &&
242 test_path_is_missing $stale_bitmap &&
243 test_path_is_missing $stale_rev
244 )
245'
246
247test_expect_success 'pack.preferBitmapTips' '
248 git init repo &&
249 test_when_finished "rm -fr repo" &&
250 (
251 cd repo &&
252
253 test_commit_bulk --message="%s" 103 &&
254
255 git log --format="%H" >commits.raw &&
256 sort <commits.raw >commits &&
257
258 git log --format="create refs/tags/%s %H" HEAD >refs &&
259 git update-ref --stdin <refs &&
260
261 git multi-pack-index write --bitmap &&
262 test_path_is_file $midx &&
263 test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&
264 test_path_is_file $midx-$(midx_checksum $objdir).rev &&
265
266 test-tool bitmap list-commits | sort >bitmaps &&
267 comm -13 bitmaps commits >before &&
268 test_line_count = 1 before &&
269
270 perl -ne "printf(\"create refs/tags/include/%d \", $.); print" \
271 <before | git update-ref --stdin &&
272
273 rm -fr $midx-$(midx_checksum $objdir).bitmap &&
274 rm -fr $midx-$(midx_checksum $objdir).rev &&
275 rm -fr $midx &&
276
277 git -c pack.preferBitmapTips=refs/tags/include \
278 multi-pack-index write --bitmap &&
279 test-tool bitmap list-commits | sort >bitmaps &&
280 comm -13 bitmaps commits >after &&
281
282 ! test_cmp before after
283 )
284'
285
286test_done