diff options
Diffstat (limited to 'merge-recursive.h')
-rw-r--r-- | merge-recursive.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/merge-recursive.h b/merge-recursive.h new file mode 100644 index 0000000000..c2b7bb65c6 --- /dev/null +++ b/merge-recursive.h @@ -0,0 +1,104 @@ +#ifndef MERGE_RECURSIVE_H +#define MERGE_RECURSIVE_H + +#include "string-list.h" +#include "unpack-trees.h" + +struct commit; + +struct repository; + +struct merge_options { + const char *ancestor; + const char *branch1; + const char *branch2; + enum { + MERGE_RECURSIVE_NORMAL = 0, + MERGE_RECURSIVE_OURS, + MERGE_RECURSIVE_THEIRS + } recursive_variant; + const char *subtree_shift; + unsigned buffer_output; /* 1: output at end, 2: keep buffered */ + unsigned renormalize : 1; + long xdl_opts; + int verbosity; + int detect_directory_renames; + int diff_detect_rename; + int merge_detect_rename; + int diff_rename_limit; + int merge_rename_limit; + int rename_score; + int needed_rename_limit; + int show_rename_progress; + int call_depth; + struct strbuf obuf; + struct hashmap current_file_dir_set; + struct string_list df_conflict_file_set; + struct unpack_trees_options unpack_opts; + struct index_state orig_index; + struct repository *repo; +}; + +/* + * For dir_rename_entry, directory names are stored as a full path from the + * toplevel of the repository and do not include a trailing '/'. Also: + * + * dir: original name of directory being renamed + * non_unique_new_dir: if true, could not determine new_dir + * new_dir: final name of directory being renamed + * possible_new_dirs: temporary used to help determine new_dir; see comments + * in get_directory_renames() for details + */ +struct dir_rename_entry { + struct hashmap_entry ent; /* must be the first member! */ + char *dir; + unsigned non_unique_new_dir:1; + struct strbuf new_dir; + struct string_list possible_new_dirs; +}; + +struct collision_entry { + struct hashmap_entry ent; /* must be the first member! */ + char *target_file; + struct string_list source_files; + unsigned reported_already:1; +}; + +static inline int merge_detect_rename(struct merge_options *o) +{ + return o->merge_detect_rename >= 0 ? o->merge_detect_rename : + o->diff_detect_rename >= 0 ? o->diff_detect_rename : 1; +} + +/* merge_trees() but with recursive ancestor consolidation */ +int merge_recursive(struct merge_options *o, + struct commit *h1, + struct commit *h2, + struct commit_list *ancestors, + struct commit **result); + +/* rename-detecting three-way merge, no recursion */ +int merge_trees(struct merge_options *o, + struct tree *head, + struct tree *merge, + struct tree *common, + struct tree **result); + +/* + * "git-merge-recursive" can be fed trees; wrap them into + * virtual commits and call merge_recursive() proper. + */ +int merge_recursive_generic(struct merge_options *o, + const struct object_id *head, + const struct object_id *merge, + int num_ca, + const struct object_id **ca, + struct commit **result); + +void init_merge_options(struct merge_options *o, + struct repository *repo); +struct tree *write_tree_from_memory(struct merge_options *o); + +int parse_merge_opt(struct merge_options *out, const char *s); + +#endif |