#ifndef __COMMIT_REACH_H__
#define __COMMIT_REACH_H__
+#include "commit-slab.h"
+
struct commit;
struct commit_list;
+struct contains_cache;
+struct ref_filter;
struct commit_list *get_merge_bases_many(struct commit *one,
int n,
int in_merge_bases_many(struct commit *commit, int nr_reference, struct commit **reference);
int in_merge_bases(struct commit *commit, struct commit *reference);
-
/*
* Takes a list of commits and returns a new list where those
* have been removed that can be reached from other commits in
int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
+/*
+ * Unknown has to be "0" here, because that's the default value for
+ * contains_cache slab entries that have not yet been assigned.
+ */
+enum contains_result {
+ CONTAINS_UNKNOWN = 0,
+ CONTAINS_NO,
+ CONTAINS_YES
+};
+
+define_commit_slab(contains_cache, enum contains_result);
+
+int commit_contains(struct ref_filter *filter, struct commit *commit,
+ struct commit_list *list, struct contains_cache *cache);
+
+/*
+ * Determine if every commit in 'from' can reach at least one commit
+ * that is marked with 'with_flag'. As we traverse, use 'assign_flag'
+ * as a marker for commits that are already visited. Do not walk
+ * commits with date below 'min_commit_date' or generation below
+ * 'min_generation'.
+ */
+int can_all_from_reach_with_flag(struct object_array *from,
+ unsigned int with_flag,
+ unsigned int assign_flag,
+ time_t min_commit_date,
+ uint32_t min_generation);
+int can_all_from_reach(struct commit_list *from, struct commit_list *to,
+ int commit_date_cutoff);
+
#endif