mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Jeff King](/assets/img/avatar_default.png)
Just as the previous commit implemented BLOB_NONE, we can support BLOB_LIMIT filters by looking at the sizes of any blobs in the result and unsetting their bits as appropriate. This is slightly more expensive than BLOB_NONE, but still produces a noticeable speedup (these results are on git.git): Test HEAD~2 HEAD ------------------------------------------------------------------------------------ 5310.9: rev-list count with blob:none 1.80(1.77+0.02) 0.22(0.20+0.02) -87.8% 5310.10: rev-list count with blob:limit=1k 1.99(1.96+0.03) 0.29(0.25+0.03) -85.4% The implementation is similar to the BLOB_NONE one, with the exception that we have to go object-by-object while walking the blob-type bitmap (since we can't mask out the matches, but must look up the size individually for each blob). The trick with using ctz64() is taken from show_objects_for_type(), which likewise needs to find individual bits (but wants to quickly skip over big chunks without blobs). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
57 lines
1.8 KiB
Bash
Executable file
57 lines
1.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='rev-list combining bitmaps and filters'
|
|
. ./test-lib.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
|
|
'
|
|
|
|
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_done
|