1#ifndef MERGE_RECURSIVE_H
2#define MERGE_RECURSIVE_H
34
#include "unpack-trees.h"
5#include "string-list.h"
67
struct merge_options {
8const char *ancestor;
9const char *branch1;
10const char *branch2;
11enum {
12MERGE_RECURSIVE_NORMAL = 0,
13MERGE_RECURSIVE_OURS,
14MERGE_RECURSIVE_THEIRS
15} 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 the
37* toplevel of the repository and do not include a trailing '/'. Also:
38*
39* dir: original name of directory being renamed
40* non_unique_new_dir: if true, could not determine new_dir
41* new_dir: final name of directory being renamed
42* possible_new_dirs: temporary used to help determine new_dir; see comments
43* in get_directory_renames() for details
44*/
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};
5253
struct 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 into
76* 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);
8485
void init_merge_options(struct merge_options *o);
86struct tree *write_tree_from_memory(struct merge_options *o);
8788
int parse_merge_opt(struct merge_options *out, const char *s);
8990
#endif