git/t/t6113-rev-list-bitmap-filters.sh

161 lines
5.6 KiB
Bash
Raw Normal View History

#!/bin/sh
test_description='rev-list combining bitmaps and filters'
t6113: mark as leak-free This test does not leak since a96015a517 (pack-bitmap: plug leak in find_objects(), 2023-12-14) when the annotation TEST_PASSES_SANITIZE_LEAK=true was also added. Unfortunately it was added after test-lib.sh is sourced, which makes GIT_TEST_PASSING_SANITIZE_LEAK=check error: $ make SANITIZE=leak GIT_TEST_PASSING_SANITIZE_LEAK=check test T=t6113-rev-list-bitmap-filters.sh ... make[2]: Entering directory '/tmp/git/git/t' *** t6113-rev-list-bitmap-filters.sh *** in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true ok 1 - set up bitmapped repo ok 2 - filters fallback to non-bitmap traversal ok 3 - blob:none filter ok 4 - blob:none filter with specified blob ok 5 - blob:limit filter ok 6 - blob:limit filter with specified blob ok 7 - tree:0 filter ok 8 - tree:0 filter with specified blob, tree ok 9 - tree:1 filter ok 10 - object:type filter ok 11 - object:type filter with --filter-provided-objects ok 12 - combine filter ok 13 - combine filter with --filter-provided-objects ok 14 - bitmap traversal with --unpacked # passed all 14 test(s) 1..14 # faking up non-zero exit with --invert-exit-code make[2]: *** [Makefile:68: t6113-rev-list-bitmap-filters.sh] Error 1 make[2]: Leaving directory '/tmp/git/git/t' make[1]: *** [Makefile:55: test] Error 2 make[1]: Leaving directory '/tmp/git/git/t' make: *** [Makefile:3212: test] Error 2 Let's move the annotation before sourcing test-lib.sh, to make GIT_TEST_PASSING_SANITIZE_LEAK=check happy. Signed-off-by: Rubén Justo <rjusto@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-01-29 21:08:34 +00:00
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-bitmap.sh
test_expect_success 'set up bitmapped repo' '
# one commit will have bitmaps, the other will not
test_commit one &&
test_commit much-larger-blob-one &&
git repack -adb &&
test_commit two &&
test_commit much-larger-blob-two &&
git tag tag
'
test_expect_success 'filters fallback to non-bitmap traversal' '
# use a path-based filter, since they are inherently incompatible with
# bitmaps (i.e., this test will never get confused by later code to
# combine the features)
filter=$(echo "!one" | git hash-object -w --stdin) &&
git rev-list --objects --filter=sparse:oid=$filter HEAD >expect &&
git rev-list --use-bitmap-index \
--objects --filter=sparse:oid=$filter HEAD >actual &&
test_cmp expect actual
'
test_expect_success 'blob:none filter' '
git rev-list --objects --filter=blob:none HEAD >expect &&
git rev-list --use-bitmap-index \
--objects --filter=blob:none HEAD >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'blob:none filter with specified blob' '
git rev-list --objects --filter=blob:none HEAD HEAD:two.t >expect &&
git rev-list --use-bitmap-index \
--objects --filter=blob:none HEAD HEAD:two.t >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'blob:limit filter' '
git rev-list --objects --filter=blob:limit=5 HEAD >expect &&
git rev-list --use-bitmap-index \
--objects --filter=blob:limit=5 HEAD >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'blob:limit filter with specified blob' '
git rev-list --objects --filter=blob:limit=5 \
HEAD HEAD:much-larger-blob-two.t >expect &&
git rev-list --use-bitmap-index \
--objects --filter=blob:limit=5 \
HEAD HEAD:much-larger-blob-two.t >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'tree:0 filter' '
git rev-list --objects --filter=tree:0 HEAD >expect &&
git rev-list --use-bitmap-index \
--objects --filter=tree:0 HEAD >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'tree:0 filter with specified blob, tree' '
git rev-list --objects --filter=tree:0 HEAD HEAD:two.t >expect &&
git rev-list --use-bitmap-index \
--objects --filter=tree:0 HEAD HEAD:two.t >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'tree:1 filter' '
git rev-list --objects --filter=tree:1 HEAD >expect &&
git rev-list --use-bitmap-index \
--objects --filter=tree:1 HEAD >actual &&
test_cmp expect actual
'
test_expect_success 'object:type filter' '
git rev-list --objects --filter=object:type=tag tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter=object:type=tag tag >actual &&
test_cmp expect actual &&
git rev-list --objects --filter=object:type=commit tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter=object:type=commit tag >actual &&
test_bitmap_traversal expect actual &&
git rev-list --objects --filter=object:type=tree tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter=object:type=tree tag >actual &&
test_bitmap_traversal expect actual &&
git rev-list --objects --filter=object:type=blob tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter=object:type=blob tag >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'object:type filter with --filter-provided-objects' '
git rev-list --objects --filter-provided-objects --filter=object:type=tag tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter-provided-objects --filter=object:type=tag tag >actual &&
test_cmp expect actual &&
git rev-list --objects --filter-provided-objects --filter=object:type=commit tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter-provided-objects --filter=object:type=commit tag >actual &&
test_bitmap_traversal expect actual &&
git rev-list --objects --filter-provided-objects --filter=object:type=tree tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter-provided-objects --filter=object:type=tree tag >actual &&
test_bitmap_traversal expect actual &&
git rev-list --objects --filter-provided-objects --filter=object:type=blob tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter-provided-objects --filter=object:type=blob tag >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'combine filter' '
git rev-list --objects --filter=blob:limit=1000 --filter=object:type=blob tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter=blob:limit=1000 --filter=object:type=blob tag >actual &&
test_bitmap_traversal expect actual
'
test_expect_success 'combine filter with --filter-provided-objects' '
git rev-list --objects --filter-provided-objects --filter=blob:limit=1000 --filter=object:type=blob tag >expect &&
git rev-list --use-bitmap-index \
--objects --filter-provided-objects --filter=blob:limit=1000 --filter=object:type=blob tag >actual &&
test_bitmap_traversal expect actual &&
git cat-file --batch-check="%(objecttype) %(objectsize)" <actual >objects &&
while read objecttype objectsize
do
test "$objecttype" = blob || return 1
test "$objectsize" -le 1000 || return 1
done <objects
'
pack-bitmap: drop --unpacked non-commit objects from results When performing revision queries with `--objects` and `--use-bitmap-index`, the output may incorrectly contain objects which are packed, even when the `--unpacked` option is given. This affects traversals, but also other querying operations, like `--count`, `--disk-usage`, etc. Like in the previous commit, the fix is to exclude those objects from the result set before they are shown to the user (or, in this case, before the bitmap containing the result of the traversal is enumerated and its objects listed). This is performed by a new function in pack-bitmap.c, called `filter_packed_objects_from_bitmap()`. Note that we do not have to inspect individual bits in the result bitmap, since we know that the first N (where N is the number of objects in the bitmap's pack/MIDX) bits correspond to objects which packed by definition. In other words, for an object to have a bitmap position (not in the extended index), it must appear in either the bitmap's pack or one of the packs in its MIDX. This presents an appealing optimization to us, which is that we can simply memset() the corresponding number of `eword_t`'s to zero, provided that we handle any objects which spill into the next word (but don't occupy all 64 bits of the word itself). We only have to handle objects in the bitmap's extended index. These objects may (or may not) appear in one or more pack(s). Since these objects are known to not appear in either the bitmap's MIDX or pack, they may be stored as loose, appear in other pack(s), or both. Before returning a bitmap containing the result of the traversal back to the caller, drop any bits from the extended index which appear in one or more packs. This implements the correct behavior for rev-list operations which use the bitmap index to compute their result. Co-authored-by: Jeff King <peff@peff.net> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-11-06 22:56:33 +00:00
test_expect_success 'bitmap traversal with --unpacked' '
git repack -adb &&
test_commit unpacked &&
git rev-list --objects --no-object-names unpacked^.. >expect.raw &&
sort expect.raw >expect &&
git rev-list --use-bitmap-index --objects --all --unpacked >actual.raw &&
sort actual.raw >actual &&
test_cmp expect actual
'
test_done