diff options
author | Patrick Steinhardt <ps@pks.im> | 2021-04-19 13:47:02 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-04-19 14:09:11 -0700 |
commit | 169a15ebd66dd23bf8c379ad33bced1578c848ef (patch) | |
tree | 15d10df534d51c91698be05e3db7fc240fe6676b | |
parent | pack-bitmap: implement object type filter (diff) | |
download | tgif-169a15ebd66dd23bf8c379ad33bced1578c848ef.tar.xz |
pack-bitmap: implement combined filter
When the user has multiple objects filters specified, then this is
internally represented by having a "combined" filter. These combined
filters aren't yet supported by bitmap indices and can thus not be
accelerated.
Fix this by implementing support for these combined filters. The
implementation is quite trivial: when there's a combined filter, we
simply recurse into `filter_bitmap()` for all of the sub-filters.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | pack-bitmap.c | 10 | ||||
-rwxr-xr-x | t/t6113-rev-list-bitmap-filters.sh | 7 |
2 files changed, 17 insertions, 0 deletions
diff --git a/pack-bitmap.c b/pack-bitmap.c index cd3f5c433e..7ce3ede7e4 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -966,6 +966,16 @@ static int filter_bitmap(struct bitmap_index *bitmap_git, return 0; } + if (filter->choice == LOFC_COMBINE) { + int i; + for (i = 0; i < filter->sub_nr; i++) { + if (filter_bitmap(bitmap_git, tip_objects, to_filter, + &filter->sub[i]) < 0) + return -1; + } + return 0; + } + /* filter choice not handled */ return -1; } diff --git a/t/t6113-rev-list-bitmap-filters.sh b/t/t6113-rev-list-bitmap-filters.sh index fb66735ac8..cb9db7df6f 100755 --- a/t/t6113-rev-list-bitmap-filters.sh +++ b/t/t6113-rev-list-bitmap-filters.sh @@ -98,4 +98,11 @@ test_expect_success 'object:type filter' ' 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_done |