diff --git a/revision.c b/revision.c index 087d64d572..3628ef963d 100644 --- a/revision.c +++ b/revision.c @@ -750,7 +750,6 @@ static int check_maybe_different_in_bloom_filter(struct rev_info *revs, struct commit *commit) { struct bloom_filter *filter; - int result = 0; if (!revs->bloom_keyvecs_nr) return -1; @@ -765,18 +764,29 @@ static int check_maybe_different_in_bloom_filter(struct rev_info *revs, return -1; } - for (size_t nr = 0; !result && nr < revs->bloom_keyvecs_nr; nr++) { - result = bloom_filter_contains_vec(filter, - revs->bloom_keyvecs[nr], - revs->bloom_filter_settings); + if (revs_maybe_changed_in_bloom(revs, filter)) { + count_bloom_filter_maybe++; + return 1; } - if (result) - count_bloom_filter_maybe++; - else - count_bloom_filter_definitely_not++; + count_bloom_filter_definitely_not++; - return result; + return 0; +} + +bool revs_maybe_changed_in_bloom(struct rev_info *revs, + struct bloom_filter *filter) +{ + if (!revs->bloom_keyvecs_nr || !filter) + return true; + + for (size_t nr = 0; nr < revs->bloom_keyvecs_nr; nr++) + if (bloom_filter_contains_vec(filter, + revs->bloom_keyvecs[nr], + revs->bloom_filter_settings)) + return true; + + return false; } static int rev_compare_tree(struct rev_info *revs, diff --git a/revision.h b/revision.h index 569b3fa1cb..14be39e20c 100644 --- a/revision.h +++ b/revision.h @@ -68,6 +68,7 @@ struct string_list; struct saved_parents; struct follow_pathspec_slab; struct bloom_keyvec; +struct bloom_filter; struct bloom_filter_settings; struct option; struct parse_opt_ctx_t; @@ -493,6 +494,17 @@ void reset_revision_walk(void); */ int prepare_revision_walk(struct rev_info *revs); +/** + * Consult a changed-path Bloom filter to determine if the commit to which the + * filter belongs might have changed any of the paths in the `revs`. + * prepare_revision_walk() needs to be called in advance to ensure + * pathspec key vectors are set up. + * + * Returns false iff the commit definitely did not change any of the paths. + */ +bool revs_maybe_changed_in_bloom(struct rev_info *revs, + struct bloom_filter *filter); + /* Drain the commits linked list into the priority queue. */ void rev_info_commit_list_to_queue(struct rev_info *revs); /**