|
1 | 1 | # Helpers for scripts testing bitmap functionality; see t5310 for |
2 | 2 | # example usage. |
3 | 3 |
|
| 4 | +objdir=.git/objects |
| 5 | +midx=$objdir/pack/multi-pack-index |
| 6 | + |
4 | 7 | # Compare a file containing rev-list bitmap traversal output to its non-bitmap |
5 | 8 | # counterpart. You can't just use test_cmp for this, because the two produce |
6 | 9 | # subtly different output: |
@@ -264,3 +267,185 @@ have_delta () { |
264 | 267 | midx_checksum () { |
265 | 268 | test-tool read-midx --checksum "$1" |
266 | 269 | } |
| 270 | + |
| 271 | +# midx_pack_source <obj> |
| 272 | +midx_pack_source () { |
| 273 | + test-tool read-midx --show-objects .git/objects | grep "^$1 " | cut -f2 |
| 274 | +} |
| 275 | + |
| 276 | +test_rev_exists () { |
| 277 | + commit="$1" |
| 278 | + kind="$2" |
| 279 | + |
| 280 | + test_expect_success "reverse index exists ($kind)" ' |
| 281 | + GIT_TRACE2_EVENT=$(pwd)/event.trace \ |
| 282 | + git rev-list --test-bitmap "$commit" && |
| 283 | +
|
| 284 | + if test "rev" = "$kind" |
| 285 | + then |
| 286 | + test_path_is_file $midx-$(midx_checksum $objdir).rev |
| 287 | + fi && |
| 288 | + grep "\"category\":\"load_midx_revindex\",\"key\":\"source\",\"value\":\"$kind\"" event.trace |
| 289 | + ' |
| 290 | +} |
| 291 | + |
| 292 | +midx_bitmap_core () { |
| 293 | + rev_kind="${1:-midx}" |
| 294 | + |
| 295 | + setup_bitmap_history |
| 296 | + |
| 297 | + test_expect_success 'create single-pack midx with bitmaps' ' |
| 298 | + git repack -ad && |
| 299 | + git multi-pack-index write --bitmap && |
| 300 | + test_path_is_file $midx && |
| 301 | + test_path_is_file $midx-$(midx_checksum $objdir).bitmap |
| 302 | + ' |
| 303 | + |
| 304 | + test_rev_exists HEAD "$rev_kind" |
| 305 | + |
| 306 | + basic_bitmap_tests |
| 307 | + |
| 308 | + test_expect_success 'create new additional packs' ' |
| 309 | + for i in $(test_seq 1 16) |
| 310 | + do |
| 311 | + test_commit "$i" && |
| 312 | + git repack -d || return 1 |
| 313 | + done && |
| 314 | +
|
| 315 | + git checkout -b other2 HEAD~8 && |
| 316 | + for i in $(test_seq 1 8) |
| 317 | + do |
| 318 | + test_commit "side-$i" && |
| 319 | + git repack -d || return 1 |
| 320 | + done && |
| 321 | + git checkout second |
| 322 | + ' |
| 323 | + |
| 324 | + test_expect_success 'create multi-pack midx with bitmaps' ' |
| 325 | + git multi-pack-index write --bitmap && |
| 326 | +
|
| 327 | + ls $objdir/pack/pack-*.pack >packs && |
| 328 | + test_line_count = 25 packs && |
| 329 | +
|
| 330 | + test_path_is_file $midx && |
| 331 | + test_path_is_file $midx-$(midx_checksum $objdir).bitmap |
| 332 | + ' |
| 333 | + |
| 334 | + test_rev_exists HEAD "$rev_kind" |
| 335 | + |
| 336 | + basic_bitmap_tests |
| 337 | + |
| 338 | + test_expect_success '--no-bitmap is respected when bitmaps exist' ' |
| 339 | + git multi-pack-index write --bitmap && |
| 340 | +
|
| 341 | + test_commit respect--no-bitmap && |
| 342 | + git repack -d && |
| 343 | +
|
| 344 | + test_path_is_file $midx && |
| 345 | + test_path_is_file $midx-$(midx_checksum $objdir).bitmap && |
| 346 | +
|
| 347 | + git multi-pack-index write --no-bitmap && |
| 348 | +
|
| 349 | + test_path_is_file $midx && |
| 350 | + test_path_is_missing $midx-$(midx_checksum $objdir).bitmap && |
| 351 | + test_path_is_missing $midx-$(midx_checksum $objdir).rev |
| 352 | + ' |
| 353 | + |
| 354 | + test_expect_success 'setup midx with base from later pack' ' |
| 355 | + # Write a and b so that "a" is a delta on top of base "b", since Git |
| 356 | + # prefers to delete contents out of a base rather than add to a shorter |
| 357 | + # object. |
| 358 | + test_seq 1 128 >a && |
| 359 | + test_seq 1 130 >b && |
| 360 | +
|
| 361 | + git add a b && |
| 362 | + git commit -m "initial commit" && |
| 363 | +
|
| 364 | + a=$(git rev-parse HEAD:a) && |
| 365 | + b=$(git rev-parse HEAD:b) && |
| 366 | +
|
| 367 | + # In the first pack, "a" is stored as a delta to "b". |
| 368 | + p1=$(git pack-objects .git/objects/pack/pack <<-EOF |
| 369 | + $a |
| 370 | + $b |
| 371 | + EOF |
| 372 | + ) && |
| 373 | +
|
| 374 | + # In the second pack, "a" is missing, and "b" is not a delta nor base to |
| 375 | + # any other object. |
| 376 | + p2=$(git pack-objects .git/objects/pack/pack <<-EOF |
| 377 | + $b |
| 378 | + $(git rev-parse HEAD) |
| 379 | + $(git rev-parse HEAD^{tree}) |
| 380 | + EOF |
| 381 | + ) && |
| 382 | +
|
| 383 | + git prune-packed && |
| 384 | + # Use the second pack as the preferred source, so that "b" occurs |
| 385 | + # earlier in the MIDX object order, rendering "a" unusable for pack |
| 386 | + # reuse. |
| 387 | + git multi-pack-index write --bitmap --preferred-pack=pack-$p2.idx && |
| 388 | +
|
| 389 | + have_delta $a $b && |
| 390 | + test $(midx_pack_source $a) != $(midx_pack_source $b) |
| 391 | + ' |
| 392 | + |
| 393 | + rev_list_tests 'full bitmap with backwards delta' |
| 394 | + |
| 395 | + test_expect_success 'clone with bitmaps enabled' ' |
| 396 | + git clone --no-local --bare . clone-reverse-delta.git && |
| 397 | + test_when_finished "rm -fr clone-reverse-delta.git" && |
| 398 | +
|
| 399 | + git rev-parse HEAD >expect && |
| 400 | + git --git-dir=clone-reverse-delta.git rev-parse HEAD >actual && |
| 401 | + test_cmp expect actual |
| 402 | + ' |
| 403 | + |
| 404 | + test_expect_success 'changing the preferred pack does not corrupt bitmaps' ' |
| 405 | + rm -fr repo && |
| 406 | + git init repo && |
| 407 | + test_when_finished "rm -fr repo" && |
| 408 | + ( |
| 409 | + cd repo && |
| 410 | +
|
| 411 | + test_commit A && |
| 412 | + test_commit B && |
| 413 | +
|
| 414 | + git rev-list --objects --no-object-names HEAD^ >A.objects && |
| 415 | + git rev-list --objects --no-object-names HEAD^.. >B.objects && |
| 416 | +
|
| 417 | + A=$(git pack-objects $objdir/pack/pack <A.objects) && |
| 418 | + B=$(git pack-objects $objdir/pack/pack <B.objects) && |
| 419 | +
|
| 420 | + cat >indexes <<-EOF && |
| 421 | + pack-$A.idx |
| 422 | + pack-$B.idx |
| 423 | + EOF |
| 424 | +
|
| 425 | + git multi-pack-index write --bitmap --stdin-packs \ |
| 426 | + --preferred-pack=pack-$A.pack <indexes && |
| 427 | + git rev-list --test-bitmap A && |
| 428 | +
|
| 429 | + git multi-pack-index write --bitmap --stdin-packs \ |
| 430 | + --preferred-pack=pack-$B.pack <indexes && |
| 431 | + git rev-list --test-bitmap A |
| 432 | + ) |
| 433 | + ' |
| 434 | +} |
| 435 | + |
| 436 | +midx_bitmap_partial_tests () { |
| 437 | + rev_kind="${1:-midx}" |
| 438 | + |
| 439 | + test_expect_success 'setup partial bitmaps' ' |
| 440 | + test_commit packed && |
| 441 | + git repack && |
| 442 | + test_commit loose && |
| 443 | + git multi-pack-index write --bitmap 2>err && |
| 444 | + test_path_is_file $midx && |
| 445 | + test_path_is_file $midx-$(midx_checksum $objdir).bitmap |
| 446 | + ' |
| 447 | + |
| 448 | + test_rev_exists HEAD~ "$rev_kind" |
| 449 | + |
| 450 | + basic_bitmap_tests HEAD~ |
| 451 | +} |
0 commit comments