#ifndef COMMIT_REACH_H
#define COMMIT_REACH_H

#include "commit.h"
#include "commit-slab.h"

struct commit_list;
struct ref_filter;
struct object_id;
struct object_array;

int repo_get_merge_bases(struct repository *r,
			 struct commit *rev1,
			 struct commit *rev2,
			 struct commit_list **result);
int repo_get_merge_bases_many(struct repository *r,
			      struct commit *one, size_t n,
			      struct commit **twos,
			      struct commit_list **result);
enum merge_base_flags {
	MERGE_BASE_IGNORE_MISSING_COMMITS = (1 << 0),
	MERGE_BASE_FIND_ALL               = (1 << 1),
};

/*
 * To be used only when object flags after this call no longer matter.
 * Without MERGE_BASE_FIND_ALL and with generation numbers available,
 * returns after finding the first merge-base, skipping the STALE drain.
 */
int repo_get_merge_bases_many_dirty(struct repository *r,
				    struct commit *one, size_t n,
				    struct commit **twos,
				    enum merge_base_flags mb_flags,
				    struct commit_list **result);

int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result);

int repo_is_descendant_of(struct repository *r,
			  struct commit *commit,
			  struct commit_list *with_commit);
int repo_in_merge_bases(struct repository *r,
			struct commit *commit,
			struct commit *reference);
int repo_in_merge_bases_many(struct repository *r,
			     struct commit *commit,
			     int nr_reference, struct commit **reference,
			     int ignore_missing_commits);

/*
 * Takes a list of commits and returns a new list where those
 * have been removed that can be reached from other commits in
 * the list. It is useful for, e.g., reducing the commits
 * randomly thrown at the git-merge command and removing
 * redundant commits that the user shouldn't have given to it.
 *
 * This function destroys the STALE bit of the commit objects'
 * flags.
 */
struct commit_list *reduce_heads(struct commit_list *heads);

/*
 * Like `reduce_heads()`, except it replaces the list. Use this
 * instead of `foo = reduce_heads(foo);` to avoid memory leaks.
 */
void reduce_heads_replace(struct commit_list **heads);

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,
	CONTAINS_IN_PROGRESS
};

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 repository *r,
				 struct object_array *from,
				 unsigned int with_flag,
				 unsigned int assign_flag,
				 timestamp_t min_commit_date,
				 timestamp_t min_generation);
int can_all_from_reach(struct repository *r, struct commit_list *from,
		       struct commit_list *to, int commit_date_cutoff);


/*
 * Return a list of commits containing the commits in the 'to' array
 * that are reachable from at least one commit in the 'from' array.
 * Also add the given 'flag' to each of the commits in the returned list.
 *
 * This method uses the PARENT1 and PARENT2 flags during its operation,
 * so be sure these flags are not set before calling the method.
 */
struct commit_list *get_reachable_subset(struct commit **from, size_t nr_from,
					 struct commit **to, size_t nr_to,
					 unsigned int reachable_flag);

struct ahead_behind_count {
	/**
	 * As input, the *_index members indicate which positions in
	 * the 'tips' array correspond to the tip and base of this
	 * comparison.
	 */
	size_t tip_index;
	size_t base_index;

	/**
	 * These values store the computed counts for each side of the
	 * symmetric difference:
	 *
	 * 'ahead' stores the number of commits reachable from the tip
	 * and not reachable from the base.
	 *
	 * 'behind' stores the number of commits reachable from the base
	 * and not reachable from the tip.
	 */
	unsigned int ahead;
	unsigned int behind;
};

/*
 * Given an array of commits and an array of ahead_behind_count pairs,
 * compute the ahead/behind counts for each pair.
 */
void ahead_behind(struct repository *r,
		  struct commit **commits, size_t commits_nr,
		  struct ahead_behind_count *counts, size_t counts_nr);

/*
 * For all tip commits, add 'mark' to their flags if and only if they
 * are reachable from one of the commits in 'bases'.
 */
void tips_reachable_from_bases(struct repository *r,
			       struct commit_list *bases,
			       struct commit **tips, size_t tips_nr,
			       int mark);

/*
 * Given a 'tip' commit and a list potential 'bases', return the index 'i' that
 * minimizes the number of commits in the first-parent history of 'tip' and not
 * in the first-parent history of 'bases[i]'.
 *
 * Among a list of long-lived branches that are updated only by merges (with the
 * first parent being the previous position of the branch), this would inform
 * which branch was used to create the tip reference.
 *
 * Returns -1 if no common point is found in first-parent histories, which is
 * rare, but possible with multiple root commits.
 */
int get_branch_base_for_tip(struct repository *r,
			    struct commit *tip,
			    struct commit **bases,
			    size_t bases_nr);

#endif
