struct commit *commit)
{
struct bloom_filter *filter;
- int result = 0;
-
- if (!revs->bloom_keyvecs_nr)
- return -1;
+ int result;
if (commit_graph_generation(commit) == GENERATION_NUMBER_INFINITY)
return -1;
filter = get_bloom_filter(revs->repo, commit);
-
if (!filter) {
count_bloom_filter_not_present++;
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);
- }
+ result = revs_maybe_changed_in_bloom(revs, filter);
+ if (result < 0)
+ return result;
if (result)
count_bloom_filter_maybe++;
return result;
}
+int revs_maybe_changed_in_bloom(struct rev_info *revs,
+ struct bloom_filter *filter)
+{
+ int result = 0;
+
+ if (!revs->bloom_keyvecs_nr)
+ 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);
+ }
+
+ return result;
+}
+
static int rev_compare_tree(struct rev_info *revs,
struct commit *parent, struct commit *commit, int nth_parent)
{
struct saved_parents;
struct follow_pathspec_slab;
struct bloom_keyvec;
+struct bloom_filter;
struct bloom_filter_settings;
struct option;
struct parse_opt_ctx_t;
*/
int prepare_revision_walk(struct rev_info *revs);
+/**
+ * Take in a changed-path Bloom filter that belongs to a commit, and consult it
+ * to see if it might have modified any of the paths in the `revs`.
+ * The caller should look up `filter`, probably with get_bloom_filter().
+ * prepare_revision_walk() needs to be called in advance to ensure
+ * pathspec key vectors are set up.
+ *
+ * Returns -1 if no sensible answer could be given because of missing
+ * preconditions (no pathspec key vectors).
+ * Returns 0 if the commit definitely did not change any of the paths and 1 if
+ * the commit maybe has changed one of them, although that might be a
+ * false-positive.
+ */
+int 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);
/**