]> git.ipfire.org Git - thirdparty/git.git/commitdiff
last-modified: keep per-path Bloom filters for wildcard pathspecs
authorToon Claes <toon@iotcl.com>
Fri, 17 Jul 2026 15:47:02 +0000 (17:47 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 Jul 2026 20:20:57 +0000 (13:20 -0700)
The last-modified builtin expands the pathspec to a set of literal paths
and builds a Bloom key for each. During the walk it looks those keys up
in the commit's filter to decide whether the commit is worth diffing.
These lookups need `bloom_filter_settings` for the key hashing.

prepare_revision_walk() runs prepare_to_use_bloom_filter() to build the
pathspec key vectors. For a pathspec that cannot be turned into a Bloom
key, such as a top-level wildcard like "*.c", that function gives up and
clears `bloom_filter_settings`.

Restore `bloom_filter_settings` after prepare_revision_walk() so the
per-path check keeps working for wildcard pathspecs.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/last-modified.c

index e8ee61040457740b4c7e2d5cca2aaa4a6db78380..adc7cd8c742398f95d4caffbc24a445c46eb1f83 100644 (file)
@@ -360,6 +360,14 @@ static int last_modified_run(struct last_modified *lm)
 
        prepare_revision_walk(&lm->rev);
 
+       /*
+        * prepare_revision_walk() clears bloom_filter_settings for pathspecs
+        * without a Bloom key. Restore it so the per-path check keeps working.
+        */
+       if (!lm->rev.bloom_filter_settings)
+               lm->rev.bloom_filter_settings =
+                       get_bloom_filter_settings(lm->rev.repo);
+
        max_count = lm->rev.max_count;
 
        init_active_paths_for_commit(&lm->active_paths);