Re: [PATCH v2 03/15] rev-list: fallback to non-bitmap traversal when filtering
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Feb 15, 2020, 00:22 UTC
- Message-ID
- <20200215002232.GF11400@syl.local>
- In-Reply-To
- <20200214182213.GC150965@coredump.intra.peff.net>
On Fri, Feb 14, 2020 at 01:22:13PM -0500, Jeff King wrote:
Show 10 quoted lines
> The "--use-bitmap-index" option is usually aspirational: if we have > bitmaps and the request can be fulfilled more quickly using them we'll > do so, but otherwise fall back to a non-bitmap traversal. > > The exception is object filtering, which explicitly dies if the two > options are combined. Let's convert this to the usual fallback behavior. > This is a minor convenience for now (since the caller can easily know > that --filter and --use-bitmap-index don't combine), but will become > much more useful as we start to support _some_ filters with bitmaps, but > not others.
Yeah, I think that this convenience is worth it early on instead of lumping in these changes in a future patch.
Show 58 quoted lines
> The test infrastructure here is bigger than necessary for checking this
> one small feature. But it will serve as the basis for more filtering
> bitmap tests in future patches.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> builtin/rev-list.c | 4 ++--
> t/t6113-rev-list-bitmap-filters.sh | 24 ++++++++++++++++++++++++
> 2 files changed, 26 insertions(+), 2 deletions(-)
> create mode 100755 t/t6113-rev-list-bitmap-filters.sh
>
> diff --git a/builtin/rev-list.c b/builtin/rev-list.c
> index e28d62ec64..bce406bd1e 100644
> --- a/builtin/rev-list.c
> +++ b/builtin/rev-list.c
> @@ -521,8 +521,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
> if (revs.show_notes)
> die(_("rev-list does not support display of notes"));
>
> - if (filter_options.choice && use_bitmap_index)
> - die(_("cannot combine --use-bitmap-index with object filtering"));
> + if (filter_options.choice)
> + use_bitmap_index = 0;
>
> save_commit_buffer = (revs.verbose_header ||
> revs.grep_filter.pattern_list ||
> diff --git a/t/t6113-rev-list-bitmap-filters.sh b/t/t6113-rev-list-bitmap-filters.sh
> new file mode 100755
> index 0000000000..977f8d0930
> --- /dev/null
> +++ b/t/t6113-rev-list-bitmap-filters.sh
> @@ -0,0 +1,24 @@
> +#!/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 &&
> + git repack -adb &&
> + test_commit 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_done
> --
> 2.25.0.796.gcc29325708Makes sense.
Thanks, Taylor