about summary refs log tree commit diff
path: root/merge-recursive.h
diff options
context:
space:
mode:
Diffstat (limited to 'merge-recursive.h')
-rw-r--r--merge-recursive.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/merge-recursive.h b/merge-recursive.h
new file mode 100644
index 000000000000..c2b7bb65c62f
--- /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