Browse Source

t5326: move tests to t/lib-bitmap.sh

In t5326, we have a handful of tests that we would like to run twice:
once using the MIDX's new `RIDX` chunk as the source of the
reverse-index cache, and once using the separate `.rev` file.

But because these tests mutate the state of the underlying repository,
and then make assumptions about those mutations occurring in a certain
sequence, simply running the tests twice in the same repository is
awkward.

Instead, extract the core of interesting tests into t/lib-bitmap.sh to
prepare for them to be run twice, each in a separate test script. This
means that they can each operate on a separate repository, removing any
concerns about mutating state.

For now, this patch is a strict cut-and-paste of some tests from t5326.
The tests which did not move are not interesting with respect to the
source of their reverse index data.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Reviewed-by: Derrick Stolee <dstolee@microsoft.com>
Reviewed-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Taylor Blau 3 years ago committed by Junio C Hamano
parent
commit
791170fa2b
  1. 177
      t/lib-bitmap.sh
  2. 173
      t/t5326-multi-pack-bitmaps.sh

177
t/lib-bitmap.sh

@ -1,6 +1,9 @@ @@ -1,6 +1,9 @@
# Helpers for scripts testing bitmap functionality; see t5310 for
# example usage.

objdir=.git/objects
midx=$objdir/pack/multi-pack-index

# Compare a file containing rev-list bitmap traversal output to its non-bitmap
# counterpart. You can't just use test_cmp for this, because the two produce
# subtly different output:
@ -264,3 +267,177 @@ have_delta () { @@ -264,3 +267,177 @@ have_delta () {
midx_checksum () {
test-tool read-midx --checksum "$1"
}

# midx_pack_source <obj>
midx_pack_source () {
test-tool read-midx --show-objects .git/objects | grep "^$1 " | cut -f2
}

test_rev_exists () {
commit="$1"

test_expect_success 'reverse index exists' '
GIT_TRACE2_EVENT=$(pwd)/event.trace \
git rev-list --test-bitmap "$commit" &&

test_path_is_file $midx-$(midx_checksum $objdir).rev &&
grep "\"category\":\"load_midx_revindex\",\"key\":\"source\",\"value\":\"rev\"" event.trace
'
}

midx_bitmap_core () {
setup_bitmap_history

test_expect_success 'create single-pack midx with bitmaps' '
git repack -ad &&
git multi-pack-index write --bitmap &&
test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD

basic_bitmap_tests

test_expect_success 'create new additional packs' '
for i in $(test_seq 1 16)
do
test_commit "$i" &&
git repack -d || return 1
done &&

git checkout -b other2 HEAD~8 &&
for i in $(test_seq 1 8)
do
test_commit "side-$i" &&
git repack -d || return 1
done &&
git checkout second
'

test_expect_success 'create multi-pack midx with bitmaps' '
git multi-pack-index write --bitmap &&

ls $objdir/pack/pack-*.pack >packs &&
test_line_count = 25 packs &&

test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD

basic_bitmap_tests

test_expect_success '--no-bitmap is respected when bitmaps exist' '
git multi-pack-index write --bitmap &&

test_commit respect--no-bitmap &&
git repack -d &&

test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&

git multi-pack-index write --no-bitmap &&

test_path_is_file $midx &&
test_path_is_missing $midx-$(midx_checksum $objdir).bitmap &&
test_path_is_missing $midx-$(midx_checksum $objdir).rev
'

test_expect_success 'setup midx with base from later pack' '
# Write a and b so that "a" is a delta on top of base "b", since Git
# prefers to delete contents out of a base rather than add to a shorter
# object.
test_seq 1 128 >a &&
test_seq 1 130 >b &&

git add a b &&
git commit -m "initial commit" &&

a=$(git rev-parse HEAD:a) &&
b=$(git rev-parse HEAD:b) &&

# In the first pack, "a" is stored as a delta to "b".
p1=$(git pack-objects .git/objects/pack/pack <<-EOF
$a
$b
EOF
) &&

# In the second pack, "a" is missing, and "b" is not a delta nor base to
# any other object.
p2=$(git pack-objects .git/objects/pack/pack <<-EOF
$b
$(git rev-parse HEAD)
$(git rev-parse HEAD^{tree})
EOF
) &&

git prune-packed &&
# Use the second pack as the preferred source, so that "b" occurs
# earlier in the MIDX object order, rendering "a" unusable for pack
# reuse.
git multi-pack-index write --bitmap --preferred-pack=pack-$p2.idx &&

have_delta $a $b &&
test $(midx_pack_source $a) != $(midx_pack_source $b)
'

rev_list_tests 'full bitmap with backwards delta'

test_expect_success 'clone with bitmaps enabled' '
git clone --no-local --bare . clone-reverse-delta.git &&
test_when_finished "rm -fr clone-reverse-delta.git" &&

git rev-parse HEAD >expect &&
git --git-dir=clone-reverse-delta.git rev-parse HEAD >actual &&
test_cmp expect actual
'

test_expect_success 'changing the preferred pack does not corrupt bitmaps' '
rm -fr repo &&
git init repo &&
test_when_finished "rm -fr repo" &&
(
cd repo &&

test_commit A &&
test_commit B &&

git rev-list --objects --no-object-names HEAD^ >A.objects &&
git rev-list --objects --no-object-names HEAD^.. >B.objects &&

A=$(git pack-objects $objdir/pack/pack <A.objects) &&
B=$(git pack-objects $objdir/pack/pack <B.objects) &&

cat >indexes <<-EOF &&
pack-$A.idx
pack-$B.idx
EOF

git multi-pack-index write --bitmap --stdin-packs \
--preferred-pack=pack-$A.pack <indexes &&
git rev-list --test-bitmap A &&

git multi-pack-index write --bitmap --stdin-packs \
--preferred-pack=pack-$B.pack <indexes &&
git rev-list --test-bitmap A
)
'
}

midx_bitmap_partial_tests () {
test_expect_success 'setup partial bitmaps' '
test_commit packed &&
git repack &&
test_commit loose &&
git multi-pack-index write --bitmap 2>err &&
test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD~

basic_bitmap_tests HEAD~
}

173
t/t5326-multi-pack-bitmaps.sh

@ -9,134 +9,7 @@ test_description='exercise basic multi-pack bitmap functionality' @@ -9,134 +9,7 @@ test_description='exercise basic multi-pack bitmap functionality'
GIT_TEST_MULTI_PACK_INDEX=0
GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0

objdir=.git/objects
midx=$objdir/pack/multi-pack-index

# midx_pack_source <obj>
midx_pack_source () {
test-tool read-midx --show-objects .git/objects | grep "^$1 " | cut -f2
}

test_rev_exists () {
commit="$1"

test_expect_success 'reverse index exists' '
GIT_TRACE2_EVENT=$(pwd)/event.trace \
git rev-list --test-bitmap "$commit" &&

test_path_is_file $midx-$(midx_checksum $objdir).rev &&
grep "\"category\":\"load_midx_revindex\",\"key\":\"source\",\"value\":\"rev\"" event.trace
'
}

setup_bitmap_history

test_expect_success 'create single-pack midx with bitmaps' '
git repack -ad &&
git multi-pack-index write --bitmap &&
test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD

basic_bitmap_tests

test_expect_success 'create new additional packs' '
for i in $(test_seq 1 16)
do
test_commit "$i" &&
git repack -d || return 1
done &&

git checkout -b other2 HEAD~8 &&
for i in $(test_seq 1 8)
do
test_commit "side-$i" &&
git repack -d || return 1
done &&
git checkout second
'

test_expect_success 'create multi-pack midx with bitmaps' '
git multi-pack-index write --bitmap &&

ls $objdir/pack/pack-*.pack >packs &&
test_line_count = 25 packs &&

test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD

basic_bitmap_tests

test_expect_success '--no-bitmap is respected when bitmaps exist' '
git multi-pack-index write --bitmap &&

test_commit respect--no-bitmap &&
git repack -d &&

test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap &&

git multi-pack-index write --no-bitmap &&

test_path_is_file $midx &&
test_path_is_missing $midx-$(midx_checksum $objdir).bitmap &&
test_path_is_missing $midx-$(midx_checksum $objdir).rev
'

test_expect_success 'setup midx with base from later pack' '
# Write a and b so that "a" is a delta on top of base "b", since Git
# prefers to delete contents out of a base rather than add to a shorter
# object.
test_seq 1 128 >a &&
test_seq 1 130 >b &&

git add a b &&
git commit -m "initial commit" &&

a=$(git rev-parse HEAD:a) &&
b=$(git rev-parse HEAD:b) &&

# In the first pack, "a" is stored as a delta to "b".
p1=$(git pack-objects .git/objects/pack/pack <<-EOF
$a
$b
EOF
) &&

# In the second pack, "a" is missing, and "b" is not a delta nor base to
# any other object.
p2=$(git pack-objects .git/objects/pack/pack <<-EOF
$b
$(git rev-parse HEAD)
$(git rev-parse HEAD^{tree})
EOF
) &&

git prune-packed &&
# Use the second pack as the preferred source, so that "b" occurs
# earlier in the MIDX object order, rendering "a" unusable for pack
# reuse.
git multi-pack-index write --bitmap --preferred-pack=pack-$p2.idx &&

have_delta $a $b &&
test $(midx_pack_source $a) != $(midx_pack_source $b)
'

rev_list_tests 'full bitmap with backwards delta'

test_expect_success 'clone with bitmaps enabled' '
git clone --no-local --bare . clone-reverse-delta.git &&
test_when_finished "rm -fr clone-reverse-delta.git" &&

git rev-parse HEAD >expect &&
git --git-dir=clone-reverse-delta.git rev-parse HEAD >actual &&
test_cmp expect actual
'
midx_bitmap_core

bitmap_reuse_tests() {
from=$1
@ -213,18 +86,7 @@ test_expect_success 'missing object closure fails gracefully' ' @@ -213,18 +86,7 @@ test_expect_success 'missing object closure fails gracefully' '
)
'

test_expect_success 'setup partial bitmaps' '
test_commit packed &&
git repack &&
test_commit loose &&
git multi-pack-index write --bitmap 2>err &&
test_path_is_file $midx &&
test_path_is_file $midx-$(midx_checksum $objdir).bitmap
'

test_rev_exists HEAD~

basic_bitmap_tests HEAD~
midx_bitmap_partial_tests

test_expect_success 'removing a MIDX clears stale bitmaps' '
rm -fr repo &&
@ -398,35 +260,4 @@ test_expect_success 'hash-cache values are propagated from pack bitmaps' ' @@ -398,35 +260,4 @@ test_expect_success 'hash-cache values are propagated from pack bitmaps' '
)
'

test_expect_success 'changing the preferred pack does not corrupt bitmaps' '
rm -fr repo &&
git init repo &&
test_when_finished "rm -fr repo" &&
(
cd repo &&

test_commit A &&
test_commit B &&

git rev-list --objects --no-object-names HEAD^ >A.objects &&
git rev-list --objects --no-object-names HEAD^.. >B.objects &&

A=$(git pack-objects $objdir/pack/pack <A.objects) &&
B=$(git pack-objects $objdir/pack/pack <B.objects) &&

cat >indexes <<-EOF &&
pack-$A.idx
pack-$B.idx
EOF

git multi-pack-index write --bitmap --stdin-packs \
--preferred-pack=pack-$A.pack <indexes &&
git rev-list --test-bitmap A &&

git multi-pack-index write --bitmap --stdin-packs \
--preferred-pack=pack-$B.pack <indexes &&
git rev-list --test-bitmap A
)
'

test_done

Loading…
Cancel
Save