]> git.ipfire.org Git - thirdparty/git.git/commitdiff
revision: complicated pathspecs disable filters
authorDerrick Stolee <dstolee@microsoft.com>
Thu, 16 Apr 2020 20:14:02 +0000 (20:14 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 16 Apr 2020 22:38:02 +0000 (15:38 -0700)
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>
revision.c

index 2b06ee739c8e1c25675279faffe6f8b9b57cc2de..f78c636e4d022d9c4fdaed01964c9b66ff1e05d0 100644 (file)
@@ -650,6 +650,20 @@ static void trace2_bloom_filter_statistics_atexit(void)
        jw_release(&jw);
 }
 
+static int forbid_bloom_filters(struct pathspec *spec)
+{
+       if (spec->has_wildcard)
+               return 1;
+       if (spec->nr > 1)
+               return 1;
+       if (spec->magic & ~PATHSPEC_LITERAL)
+               return 1;
+       if (spec->nr && (spec->items[0].magic & ~PATHSPEC_LITERAL))
+               return 1;
+
+       return 0;
+}
+
 static void prepare_to_use_bloom_filter(struct rev_info *revs)
 {
        struct pathspec_item *pi;
@@ -659,7 +673,10 @@ static void prepare_to_use_bloom_filter(struct rev_info *revs)
        int len;
 
        if (!revs->commits)
-           return;
+               return;
+
+       if (forbid_bloom_filters(&revs->prune_data))
+               return;
 
        repo_parse_commit(revs->repo, revs->commits->item);