]> git.ipfire.org Git - thirdparty/git.git/blob - t/t5317-pack-objects-filter-objects.sh
t/*: fix ordering of expected/observed arguments
[thirdparty/git.git] / t / t5317-pack-objects-filter-objects.sh
1 #!/bin/sh
2
3 test_description='git pack-objects using object filtering'
4
5 . ./test-lib.sh
6
7 # Test blob:none filter.
8
9 test_expect_success 'setup r1' '
10 echo "{print \$1}" >print_1.awk &&
11 echo "{print \$2}" >print_2.awk &&
12
13 git init r1 &&
14 for n in 1 2 3 4 5
15 do
16 echo "This is file: $n" > r1/file.$n
17 git -C r1 add file.$n
18 git -C r1 commit -m "$n"
19 done
20 '
21
22 test_expect_success 'verify blob count in normal packfile' '
23 git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 |
24 awk -f print_2.awk |
25 sort >expected &&
26
27 git -C r1 pack-objects --rev --stdout >all.pack <<-EOF &&
28 HEAD
29 EOF
30 git -C r1 index-pack ../all.pack &&
31
32 git -C r1 verify-pack -v ../all.pack |
33 grep blob |
34 awk -f print_1.awk |
35 sort >observed &&
36
37 test_cmp expected observed
38 '
39
40 test_expect_success 'verify blob:none packfile has no blobs' '
41 git -C r1 pack-objects --rev --stdout --filter=blob:none >filter.pack <<-EOF &&
42 HEAD
43 EOF
44 git -C r1 index-pack ../filter.pack &&
45
46 git -C r1 verify-pack -v ../filter.pack |
47 grep blob |
48 awk -f print_1.awk |
49 sort >observed &&
50
51 nr=$(wc -l <observed) &&
52 test 0 -eq $nr
53 '
54
55 test_expect_success 'verify normal and blob:none packfiles have same commits/trees' '
56 git -C r1 verify-pack -v ../all.pack |
57 grep -E "commit|tree" |
58 awk -f print_1.awk |
59 sort >expected &&
60
61 git -C r1 verify-pack -v ../filter.pack |
62 grep -E "commit|tree" |
63 awk -f print_1.awk |
64 sort >observed &&
65
66 test_cmp expected observed
67 '
68
69 # Test blob:limit=<n>[kmg] filter.
70 # We boundary test around the size parameter. The filter is strictly less than
71 # the value, so size 500 and 1000 should have the same results, but 1001 should
72 # filter more.
73
74 test_expect_success 'setup r2' '
75 git init r2 &&
76 for n in 1000 10000
77 do
78 printf "%"$n"s" X > r2/large.$n
79 git -C r2 add large.$n
80 git -C r2 commit -m "$n"
81 done
82 '
83
84 test_expect_success 'verify blob count in normal packfile' '
85 git -C r2 ls-files -s large.1000 large.10000 |
86 awk -f print_2.awk |
87 sort >expected &&
88
89 git -C r2 pack-objects --rev --stdout >all.pack <<-EOF &&
90 HEAD
91 EOF
92 git -C r2 index-pack ../all.pack &&
93
94 git -C r2 verify-pack -v ../all.pack |
95 grep blob |
96 awk -f print_1.awk |
97 sort >observed &&
98
99 test_cmp expected observed
100 '
101
102 test_expect_success 'verify blob:limit=500 omits all blobs' '
103 git -C r2 pack-objects --rev --stdout --filter=blob:limit=500 >filter.pack <<-EOF &&
104 HEAD
105 EOF
106 git -C r2 index-pack ../filter.pack &&
107
108 git -C r2 verify-pack -v ../filter.pack |
109 grep blob |
110 awk -f print_1.awk |
111 sort >observed &&
112
113 nr=$(wc -l <observed) &&
114 test 0 -eq $nr
115 '
116
117 test_expect_success 'verify blob:limit=1000' '
118 git -C r2 pack-objects --rev --stdout --filter=blob:limit=1000 >filter.pack <<-EOF &&
119 HEAD
120 EOF
121 git -C r2 index-pack ../filter.pack &&
122
123 git -C r2 verify-pack -v ../filter.pack |
124 grep blob |
125 awk -f print_1.awk |
126 sort >observed &&
127
128 nr=$(wc -l <observed) &&
129 test 0 -eq $nr
130 '
131
132 test_expect_success 'verify blob:limit=1001' '
133 git -C r2 ls-files -s large.1000 |
134 awk -f print_2.awk |
135 sort >expected &&
136
137 git -C r2 pack-objects --rev --stdout --filter=blob:limit=1001 >filter.pack <<-EOF &&
138 HEAD
139 EOF
140 git -C r2 index-pack ../filter.pack &&
141
142 git -C r2 verify-pack -v ../filter.pack |
143 grep blob |
144 awk -f print_1.awk |
145 sort >observed &&
146
147 test_cmp expected observed
148 '
149
150 test_expect_success 'verify blob:limit=10001' '
151 git -C r2 ls-files -s large.1000 large.10000 |
152 awk -f print_2.awk |
153 sort >expected &&
154
155 git -C r2 pack-objects --rev --stdout --filter=blob:limit=10001 >filter.pack <<-EOF &&
156 HEAD
157 EOF
158 git -C r2 index-pack ../filter.pack &&
159
160 git -C r2 verify-pack -v ../filter.pack |
161 grep blob |
162 awk -f print_1.awk |
163 sort >observed &&
164
165 test_cmp expected observed
166 '
167
168 test_expect_success 'verify blob:limit=1k' '
169 git -C r2 ls-files -s large.1000 |
170 awk -f print_2.awk |
171 sort >expected &&
172
173 git -C r2 pack-objects --rev --stdout --filter=blob:limit=1k >filter.pack <<-EOF &&
174 HEAD
175 EOF
176 git -C r2 index-pack ../filter.pack &&
177
178 git -C r2 verify-pack -v ../filter.pack |
179 grep blob |
180 awk -f print_1.awk |
181 sort >observed &&
182
183 test_cmp expected observed
184 '
185
186 test_expect_success 'verify explicitly specifying oversized blob in input' '
187 git -C r2 ls-files -s large.1000 large.10000 |
188 awk -f print_2.awk |
189 sort >expected &&
190
191 git -C r2 pack-objects --rev --stdout --filter=blob:limit=1k >filter.pack <<-EOF &&
192 HEAD
193 $(git -C r2 rev-parse HEAD:large.10000)
194 EOF
195 git -C r2 index-pack ../filter.pack &&
196
197 git -C r2 verify-pack -v ../filter.pack |
198 grep blob |
199 awk -f print_1.awk |
200 sort >observed &&
201
202 test_cmp expected observed
203 '
204
205 test_expect_success 'verify blob:limit=1m' '
206 git -C r2 ls-files -s large.1000 large.10000 |
207 awk -f print_2.awk |
208 sort >expected &&
209
210 git -C r2 pack-objects --rev --stdout --filter=blob:limit=1m >filter.pack <<-EOF &&
211 HEAD
212 EOF
213 git -C r2 index-pack ../filter.pack &&
214
215 git -C r2 verify-pack -v ../filter.pack |
216 grep blob |
217 awk -f print_1.awk |
218 sort >observed &&
219
220 test_cmp expected observed
221 '
222
223 test_expect_success 'verify normal and blob:limit packfiles have same commits/trees' '
224 git -C r2 verify-pack -v ../all.pack |
225 grep -E "commit|tree" |
226 awk -f print_1.awk |
227 sort >expected &&
228
229 git -C r2 verify-pack -v ../filter.pack |
230 grep -E "commit|tree" |
231 awk -f print_1.awk |
232 sort >observed &&
233
234 test_cmp expected observed
235 '
236
237 # Test sparse:path=<path> filter.
238 # Use a local file containing a sparse-checkout specification to filter
239 # out blobs not required for the corresponding sparse-checkout. We do not
240 # require sparse-checkout to actually be enabled.
241
242 test_expect_success 'setup r3' '
243 git init r3 &&
244 mkdir r3/dir1 &&
245 for n in sparse1 sparse2
246 do
247 echo "This is file: $n" > r3/$n
248 git -C r3 add $n
249 echo "This is file: dir1/$n" > r3/dir1/$n
250 git -C r3 add dir1/$n
251 done &&
252 git -C r3 commit -m "sparse" &&
253 echo dir1/ >pattern1 &&
254 echo sparse1 >pattern2
255 '
256
257 test_expect_success 'verify blob count in normal packfile' '
258 git -C r3 ls-files -s sparse1 sparse2 dir1/sparse1 dir1/sparse2 |
259 awk -f print_2.awk |
260 sort >expected &&
261
262 git -C r3 pack-objects --rev --stdout >all.pack <<-EOF &&
263 HEAD
264 EOF
265 git -C r3 index-pack ../all.pack &&
266
267 git -C r3 verify-pack -v ../all.pack |
268 grep blob |
269 awk -f print_1.awk |
270 sort >observed &&
271
272 test_cmp expected observed
273 '
274
275 test_expect_success 'verify sparse:path=pattern1' '
276 git -C r3 ls-files -s dir1/sparse1 dir1/sparse2 |
277 awk -f print_2.awk |
278 sort >expected &&
279
280 git -C r3 pack-objects --rev --stdout --filter=sparse:path=../pattern1 >filter.pack <<-EOF &&
281 HEAD
282 EOF
283 git -C r3 index-pack ../filter.pack &&
284
285 git -C r3 verify-pack -v ../filter.pack |
286 grep blob |
287 awk -f print_1.awk |
288 sort >observed &&
289
290 test_cmp expected observed
291 '
292
293 test_expect_success 'verify normal and sparse:path=pattern1 packfiles have same commits/trees' '
294 git -C r3 verify-pack -v ../all.pack |
295 grep -E "commit|tree" |
296 awk -f print_1.awk |
297 sort >expected &&
298
299 git -C r3 verify-pack -v ../filter.pack |
300 grep -E "commit|tree" |
301 awk -f print_1.awk |
302 sort >observed &&
303
304 test_cmp expected observed
305 '
306
307 test_expect_success 'verify sparse:path=pattern2' '
308 git -C r3 ls-files -s sparse1 dir1/sparse1 |
309 awk -f print_2.awk |
310 sort >expected &&
311
312 git -C r3 pack-objects --rev --stdout --filter=sparse:path=../pattern2 >filter.pack <<-EOF &&
313 HEAD
314 EOF
315 git -C r3 index-pack ../filter.pack &&
316
317 git -C r3 verify-pack -v ../filter.pack |
318 grep blob |
319 awk -f print_1.awk |
320 sort >observed &&
321
322 test_cmp expected observed
323 '
324
325 test_expect_success 'verify normal and sparse:path=pattern2 packfiles have same commits/trees' '
326 git -C r3 verify-pack -v ../all.pack |
327 grep -E "commit|tree" |
328 awk -f print_1.awk |
329 sort >expected &&
330
331 git -C r3 verify-pack -v ../filter.pack |
332 grep -E "commit|tree" |
333 awk -f print_1.awk |
334 sort >observed &&
335
336 test_cmp expected observed
337 '
338
339 # Test sparse:oid=<oid-ish> filter.
340 # Like sparse:path, but we get the sparse-checkout specification from
341 # a blob rather than a file on disk.
342
343 test_expect_success 'setup r4' '
344 git init r4 &&
345 mkdir r4/dir1 &&
346 for n in sparse1 sparse2
347 do
348 echo "This is file: $n" > r4/$n
349 git -C r4 add $n
350 echo "This is file: dir1/$n" > r4/dir1/$n
351 git -C r4 add dir1/$n
352 done &&
353 echo dir1/ >r4/pattern &&
354 git -C r4 add pattern &&
355 git -C r4 commit -m "pattern"
356 '
357
358 test_expect_success 'verify blob count in normal packfile' '
359 git -C r4 ls-files -s pattern sparse1 sparse2 dir1/sparse1 dir1/sparse2 |
360 awk -f print_2.awk |
361 sort >expected &&
362
363 git -C r4 pack-objects --rev --stdout >all.pack <<-EOF &&
364 HEAD
365 EOF
366 git -C r4 index-pack ../all.pack &&
367
368 git -C r4 verify-pack -v ../all.pack |
369 grep blob |
370 awk -f print_1.awk |
371 sort >observed &&
372
373 test_cmp expected observed
374 '
375
376 test_expect_success 'verify sparse:oid=OID' '
377 git -C r4 ls-files -s dir1/sparse1 dir1/sparse2 |
378 awk -f print_2.awk |
379 sort >expected &&
380
381 oid=$(git -C r4 ls-files -s pattern | awk -f print_2.awk) &&
382 git -C r4 pack-objects --rev --stdout --filter=sparse:oid=$oid >filter.pack <<-EOF &&
383 HEAD
384 EOF
385 git -C r4 index-pack ../filter.pack &&
386
387 git -C r4 verify-pack -v ../filter.pack |
388 grep blob |
389 awk -f print_1.awk |
390 sort >observed &&
391
392 test_cmp expected observed
393 '
394
395 test_expect_success 'verify sparse:oid=oid-ish' '
396 git -C r4 ls-files -s dir1/sparse1 dir1/sparse2 |
397 awk -f print_2.awk |
398 sort >expected &&
399
400 git -C r4 pack-objects --rev --stdout --filter=sparse:oid=master:pattern >filter.pack <<-EOF &&
401 HEAD
402 EOF
403 git -C r4 index-pack ../filter.pack &&
404
405 git -C r4 verify-pack -v ../filter.pack |
406 grep blob |
407 awk -f print_1.awk |
408 sort >observed &&
409
410 test_cmp expected observed
411 '
412
413 # Delete some loose objects and use pack-objects, but WITHOUT any filtering.
414 # This models previously omitted objects that we did not receive.
415
416 test_expect_success 'setup r1 - delete loose blobs' '
417 git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 |
418 awk -f print_2.awk |
419 sort >expected &&
420
421 for id in `cat expected | sed "s|..|&/|"`
422 do
423 rm r1/.git/objects/$id
424 done
425 '
426
427 test_expect_success 'verify pack-objects fails w/ missing objects' '
428 test_must_fail git -C r1 pack-objects --rev --stdout >miss.pack <<-EOF
429 HEAD
430 EOF
431 '
432
433 test_expect_success 'verify pack-objects fails w/ --missing=error' '
434 test_must_fail git -C r1 pack-objects --rev --stdout --missing=error >miss.pack <<-EOF
435 HEAD
436 EOF
437 '
438
439 test_expect_success 'verify pack-objects w/ --missing=allow-any' '
440 git -C r1 pack-objects --rev --stdout --missing=allow-any >miss.pack <<-EOF
441 HEAD
442 EOF
443 '
444
445 test_done