t5310: test delta reuse with bitmaps

Commit 6a1e32d532 (pack-objects: reuse on-disk deltas for thin "have" objects, 2018-08-21) taught pack-objects a new optimization trick. Since this wasn't meant to change user-visible behavior, but only produce smaller packs more quickly, testing focused on t/perf/p5311. However, since people don't run perf tests very often, we should make sure that the feature is exercised in the regular test suite. This patch does so. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 1, 2018 at 03:48 UTC c0d61dfc0b248f100987d92545016bce71f92663
1 file changed +93
t/t5310-pack-bitmaps.sh
+93
@@ -342,4 +342,97 @@ test_expect_success 'truncated bitmap fails gracefully' '
342 test_i18ngrep corrupt stderr
343 '
344
345 +# have_delta <obj> <expected_base>
346 +#
347 +# Note that because this relies on cat-file, it might find _any_ copy of an
348 +# object in the repository. The caller is responsible for making sure
349 +# there's only one (e.g., via "repack -ad", or having just fetched a copy).
350 +have_delta () {
351 + echo $2 >expect &&
352 + echo $1 | git cat-file --batch-check="%(deltabase)" >actual &&
353 + test_cmp expect actual
354 +}
355 +
356 +# Create a state of history with these properties:
357 +#
358 +# - refs that allow a client to fetch some new history, while sharing some old
359 +# history with the server; we use branches delta-reuse-old and
360 +# delta-reuse-new here
361 +#
362 +# - the new history contains an object that is stored on the server as a delta
363 +# against a base that is in the old history
364 +#
365 +# - the base object is not immediately reachable from the tip of the old
366 +# history; finding it would involve digging down through history we know the
367 +# other side has
368 +#
369 +# This should result in a state where fetching from old->new would not
370 +# traditionally reuse the on-disk delta (because we'd have to dig to realize
371 +# that the client has it), but we will do so if bitmaps can tell us cheaply
372 +# that the other side has it.
373 +test_expect_success 'set up thin delta-reuse parent' '
374 + # This first commit contains the buried base object.
375 + test-tool genrandom delta 16384 >file &&
376 + git add file &&
377 + git commit -m "delta base" &&
378 + base=$(git rev-parse --verify HEAD:file) &&
379 +
380 + # These intermediate commits bury the base back in history.
381 + # This becomes the "old" state.
382 + for i in 1 2 3 4 5
383 + do
384 + echo $i >file &&
385 + git commit -am "intermediate $i" || return 1
386 + done &&
387 + git branch delta-reuse-old &&
388 +
389 + # And now our new history has a delta against the buried base. Note
390 + # that this must be smaller than the original file, since pack-objects
391 + # prefers to create deltas from smaller objects to larger.
392 + test-tool genrandom delta 16300 >file &&
393 + git commit -am "delta result" &&
394 + delta=$(git rev-parse --verify HEAD:file) &&
395 + git branch delta-reuse-new &&
396 +
397 + # Repack with bitmaps and double check that we have the expected delta
398 + # relationship.
399 + git repack -adb &&
400 + have_delta $delta $base
401 +'
402 +
403 +# Now we can sanity-check the non-bitmap behavior (that the server is not able
404 +# to reuse the delta). This isn't strictly something we care about, so this
405 +# test could be scrapped in the future. But it makes sure that the next test is
406 +# actually triggering the feature we want.
407 +#
408 +# Note that our tools for working with on-the-wire "thin" packs are limited. So
409 +# we actually perform the fetch, retain the resulting pack, and inspect the
410 +# result.
411 +test_expect_success 'fetch without bitmaps ignores delta against old base' '
412 + test_config pack.usebitmaps false &&
413 + test_when_finished "rm -rf client.git" &&
414 + git init --bare client.git &&
415 + (
416 + cd client.git &&
417 + git config transfer.unpackLimit 1 &&
418 + git fetch .. delta-reuse-old:delta-reuse-old &&
419 + git fetch .. delta-reuse-new:delta-reuse-new &&
420 + have_delta $delta $ZERO_OID
421 + )
422 +'
423 +
424 +# And do the same for the bitmap case, where we do expect to find the delta.
425 +test_expect_success 'fetch with bitmaps can reuse old base' '
426 + test_config pack.usebitmaps true &&
427 + test_when_finished "rm -rf client.git" &&
428 + git init --bare client.git &&
429 + (
430 + cd client.git &&
431 + git config transfer.unpackLimit 1 &&
432 + git fetch .. delta-reuse-old:delta-reuse-old &&
433 + git fetch .. delta-reuse-new:delta-reuse-new &&
434 + have_delta $delta $base
435 + )
436 +'
437 +
438 test_done