@matheusbsbs / matheus-bagliano / commits / 8918e379aa
Fork 0

revision: complicated pathspecs disable filters

The changed-path Bloom filters work only when we can compute an explicit Bloom filter key in advance. When a pathspec is given that allows case-insensitive checks or wildcard matching, we must disable the Bloom filter performance checks. By checking the pathspec in prepare_to_use_bloom_filters(), we avoid setting up the Bloom filter data and thus revert to the usual logic. Before this change, the following tests would fail*: t6004-rev-list-path-optim.sh (Tests 6-7) t6130-pathspec-noglob.sh (Tests 3-6) t6131-pathspec-icase.sh (Tests 3-5) *These tests would fail when using GIT_TEST_COMMIT_GRAPH and GIT_TEST_COMMIT_GRAPH_BLOOM_FILTERS except that the latter environment variable was not set up correctly to write the changed- path Bloom filters in the test suite. That will be fixed in the next change. Helped-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Apr 16, 2020 at 20:14 UTC 8918e379aac11b1e2ed7bb5be8433516c4ff5e8f
1 file changed +18 -1
revision.c
+18 -1
@@ -650,6 +650,20 @@ static void trace2_bloom_filter_statistics_atexit(void)
650 jw_release(&jw);
651 }
652
653 +static int forbid_bloom_filters(struct pathspec *spec)
654 +{
655 + if (spec->has_wildcard)
656 + return 1;
657 + if (spec->nr > 1)
658 + return 1;
659 + if (spec->magic & ~PATHSPEC_LITERAL)
660 + return 1;
661 + if (spec->nr && (spec->items[0].magic & ~PATHSPEC_LITERAL))
662 + return 1;
663 +
664 + return 0;
665 +}
666 +
667 static void prepare_to_use_bloom_filter(struct rev_info *revs)
668 {
669 struct pathspec_item *pi;
@@ -659,7 +673,10 @@ static void prepare_to_use_bloom_filter(struct rev_info *revs)
673 int len;
674
675 if (!revs->commits)
662 - return;
676 + return;
677 +
678 + if (forbid_bloom_filters(&revs->prune_data))
679 + return;
680
681 repo_parse_commit(revs->repo, revs->commits->item);
682