1 #ifndef MERGE_RECURSIVE_H
 
   2 #define MERGE_RECURSIVE_H
 
   4 #include "string-list.h"
 
   5 #include "unpack-trees.h"
 
  11 struct merge_options {
 
  16                 MERGE_RECURSIVE_NORMAL = 0,
 
  18                 MERGE_RECURSIVE_THEIRS
 
  20         const char *subtree_shift;
 
  21         unsigned buffer_output; /* 1: output at end, 2: keep buffered */
 
  22         unsigned renormalize : 1;
 
  25         int detect_directory_renames;
 
  26         int diff_detect_rename;
 
  27         int merge_detect_rename;
 
  28         int diff_rename_limit;
 
  29         int merge_rename_limit;
 
  31         int needed_rename_limit;
 
  32         int show_rename_progress;
 
  35         struct hashmap current_file_dir_set;
 
  36         struct string_list df_conflict_file_set;
 
  37         struct unpack_trees_options unpack_opts;
 
  38         struct index_state orig_index;
 
  39         struct repository *repo;
 
  43  * For dir_rename_entry, directory names are stored as a full path from the
 
  44  * toplevel of the repository and do not include a trailing '/'.  Also:
 
  46  *   dir:                original name of directory being renamed
 
  47  *   non_unique_new_dir: if true, could not determine new_dir
 
  48  *   new_dir:            final name of directory being renamed
 
  49  *   possible_new_dirs:  temporary used to help determine new_dir; see comments
 
  50  *                       in get_directory_renames() for details
 
  52 struct dir_rename_entry {
 
  53         struct hashmap_entry ent; /* must be the first member! */
 
  55         unsigned non_unique_new_dir:1;
 
  56         struct strbuf new_dir;
 
  57         struct string_list possible_new_dirs;
 
  60 struct collision_entry {
 
  61         struct hashmap_entry ent; /* must be the first member! */
 
  63         struct string_list source_files;
 
  64         unsigned reported_already:1;
 
  67 static inline int merge_detect_rename(struct merge_options *o)
 
  69         return o->merge_detect_rename >= 0 ? o->merge_detect_rename :
 
  70                 o->diff_detect_rename >= 0 ? o->diff_detect_rename : 1;
 
  73 /* merge_trees() but with recursive ancestor consolidation */
 
  74 int merge_recursive(struct merge_options *o,
 
  77                     struct commit_list *ancestors,
 
  78                     struct commit **result);
 
  80 /* rename-detecting three-way merge, no recursion */
 
  81 int merge_trees(struct merge_options *o,
 
  85                 struct tree **result);
 
  88  * "git-merge-recursive" can be fed trees; wrap them into
 
  89  * virtual commits and call merge_recursive() proper.
 
  91 int merge_recursive_generic(struct merge_options *o,
 
  92                             const struct object_id *head,
 
  93                             const struct object_id *merge,
 
  95                             const struct object_id **ca,
 
  96                             struct commit **result);
 
  98 void init_merge_options(struct merge_options *o,
 
  99                         struct repository *repo);
 
 100 struct tree *write_tree_from_memory(struct merge_options *o);
 
 102 int parse_merge_opt(struct merge_options *out, const char *s);