1#ifndef COMMIT_REACH_H 2#define COMMIT_REACH_H 3 4#include"commit.h" 5#include"commit-slab.h" 6 7struct commit_list; 8struct ref_filter; 9struct object_id; 10struct object_array; 11 12struct commit_list *get_merge_bases_many(struct commit *one, 13int n, 14struct commit **twos); 15struct commit_list *get_merge_bases_many_dirty(struct commit *one, 16int n, 17struct commit **twos); 18struct commit_list *get_merge_bases(struct commit *one,struct commit *two); 19struct commit_list *get_octopus_merge_bases(struct commit_list *in); 20 21/* To be used only when object flags after this call no longer matter */ 22struct commit_list *get_merge_bases_many_dirty(struct commit *one,int n,struct commit **twos); 23 24intis_descendant_of(struct commit *commit,struct commit_list *with_commit); 25intin_merge_bases_many(struct commit *commit,int nr_reference,struct commit **reference); 26intin_merge_bases(struct commit *commit,struct commit *reference); 27 28/* 29 * Takes a list of commits and returns a new list where those 30 * have been removed that can be reached from other commits in 31 * the list. It is useful for, e.g., reducing the commits 32 * randomly thrown at the git-merge command and removing 33 * redundant commits that the user shouldn't have given to it. 34 * 35 * This function destroys the STALE bit of the commit objects' 36 * flags. 37 */ 38struct commit_list *reduce_heads(struct commit_list *heads); 39 40/* 41 * Like `reduce_heads()`, except it replaces the list. Use this 42 * instead of `foo = reduce_heads(foo);` to avoid memory leaks. 43 */ 44voidreduce_heads_replace(struct commit_list **heads); 45 46intref_newer(const struct object_id *new_oid,const struct object_id *old_oid); 47 48/* 49 * Unknown has to be "0" here, because that's the default value for 50 * contains_cache slab entries that have not yet been assigned. 51 */ 52enum contains_result { 53 CONTAINS_UNKNOWN =0, 54 CONTAINS_NO, 55 CONTAINS_YES 56}; 57 58define_commit_slab(contains_cache,enum contains_result); 59 60intcommit_contains(struct ref_filter *filter,struct commit *commit, 61struct commit_list *list,struct contains_cache *cache); 62 63/* 64 * Determine if every commit in 'from' can reach at least one commit 65 * that is marked with 'with_flag'. As we traverse, use 'assign_flag' 66 * as a marker for commits that are already visited. Do not walk 67 * commits with date below 'min_commit_date' or generation below 68 * 'min_generation'. 69 */ 70intcan_all_from_reach_with_flag(struct object_array *from, 71unsigned int with_flag, 72unsigned int assign_flag, 73time_t min_commit_date, 74uint32_t min_generation); 75intcan_all_from_reach(struct commit_list *from,struct commit_list *to, 76int commit_date_cutoff); 77 78 79/* 80 * Return a list of commits containing the commits in the 'to' array 81 * that are reachable from at least one commit in the 'from' array. 82 * Also add the given 'flag' to each of the commits in the returned list. 83 * 84 * This method uses the PARENT1 and PARENT2 flags during its operation, 85 * so be sure these flags are not set before calling the method. 86 */ 87struct commit_list *get_reachable_subset(struct commit **from,int nr_from, 88struct commit **to,int nr_to, 89unsigned int reachable_flag); 90 91#endif