#!/bin/sh test_description='pack-objects multi-pack reuse' . ./test-lib.sh . "$TEST_DIRECTORY"/lib-bitmap.sh objdir=.git/objects packdir=$objdir/pack test_pack_reused () { test_trace2_data pack-objects pack-reused "$1" } test_packs_reused () { test_trace2_data pack-objects packs-reused "$1" } # pack_position objects && grep "$1" objects | cut -d" " -f1 } test_expect_success 'preferred pack is reused for single-pack reuse' ' test_config pack.allowPackReuse single && for i in A B do test_commit "$i" && git repack -d || return 1 done && git multi-pack-index write --bitmap && : >trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --revs --all >/dev/null && test_pack_reused 3 in <<-EOF && $(git rev-parse C) ^$(git rev-parse A) EOF : >trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --revs /dev/null && test_pack_reused 6 trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --revs --all >/dev/null && test_pack_reused 9 in <<-EOF && $(git rev-parse E) ^$(git rev-parse D) EOF : >trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --delta-base-offset --revs /dev/null && test_pack_reused 3 in <<-EOF && $(git rev-parse E) ^$(git rev-parse D) EOF : >trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --delta-base-offset --revs /dev/null && test_pack_reused 3 f && git add f && test_tick && git commit -m "delta" && delta="$(git rev-parse HEAD)" && test_seq 64 >f && test_tick && git commit -a -m "base" && base="$(git rev-parse HEAD)" && test_commit other && git repack -d && have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" && git multi-pack-index write --bitmap && cat >in <<-EOF && $(git rev-parse other) ^$base EOF : >trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --delta-base-offset --revs /dev/null && # We can only reuse the 3 objects corresponding to "other" from # the latest pack. # # This is because even though we want "delta", we do not want # "base", meaning that we have to inflate the delta/base-pair # corresponding to the blob in commit "delta", which bypasses # the pack-reuse mechanism. # # The remaining objects from the other pack are similarly not # reused because their objects are on the uninteresting side of # the query. test_pack_reused 3 in <<-EOF && $(git rev-parse $base) ^$(git rev-parse $delta) EOF P="$(git pack-objects --revs $packdir/pack trace2.txt && GIT_TRACE2_EVENT="$PWD/trace2.txt" \ git pack-objects --stdout --delta-base-offset --all >/dev/null && packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" && objects_nr="$(git rev-list --count --all --objects)" && test_pack_reused $(($objects_nr - 1))