1#ifndef MERGE_RECURSIVE_H2#define MERGE_RECURSIVE_H34#include "unpack-trees.h"5#include "string-list.h"67struct merge_options {8const char *ancestor;9const char *branch1;10const char *branch2;11enum {12MERGE_RECURSIVE_NORMAL = 0,13MERGE_RECURSIVE_OURS,14MERGE_RECURSIVE_THEIRS15} recursive_variant;16const char *subtree_shift;17unsigned buffer_output; /* 1: output at end, 2: keep buffered */18unsigned renormalize : 1;19long xdl_opts;20int verbosity;21int detect_rename;22int diff_rename_limit;23int merge_rename_limit;24int rename_score;25int needed_rename_limit;26int show_rename_progress;27int call_depth;28struct strbuf obuf;29struct hashmap current_file_dir_set;30struct string_list df_conflict_file_set;31struct unpack_trees_options unpack_opts;32struct index_state orig_index;33};3435/*36* For dir_rename_entry, directory names are stored as a full path from the37* toplevel of the repository and do not include a trailing '/'. Also:38*39* dir: original name of directory being renamed40* non_unique_new_dir: if true, could not determine new_dir41* new_dir: final name of directory being renamed42* possible_new_dirs: temporary used to help determine new_dir; see comments43* in get_directory_renames() for details44*/45struct dir_rename_entry {46struct hashmap_entry ent; /* must be the first member! */47char *dir;48unsigned non_unique_new_dir:1;49struct strbuf new_dir;50struct string_list possible_new_dirs;51};5253struct collision_entry {54struct hashmap_entry ent; /* must be the first member! */55char *target_file;56struct string_list source_files;57unsigned reported_already:1;58};5960/* merge_trees() but with recursive ancestor consolidation */61int merge_recursive(struct merge_options *o,62struct commit *h1,63struct commit *h2,64struct commit_list *ancestors,65struct commit **result);6667/* rename-detecting three-way merge, no recursion */68int merge_trees(struct merge_options *o,69struct tree *head,70struct tree *merge,71struct tree *common,72struct tree **result);7374/*75* "git-merge-recursive" can be fed trees; wrap them into76* virtual commits and call merge_recursive() proper.77*/78int merge_recursive_generic(struct merge_options *o,79const struct object_id *head,80const struct object_id *merge,81int num_ca,82const struct object_id **ca,83struct commit **result);8485void init_merge_options(struct merge_options *o);86struct tree *write_tree_from_memory(struct merge_options *o);8788int parse_merge_opt(struct merge_options *out, const char *s);8990#endif