| #ifndef MERGE_RECURSIVE_H |
| #define MERGE_RECURSIVE_H |
| |
| #include "strbuf.h" |
| |
| struct commit; |
| struct commit_list; |
| struct object_id; |
| struct repository; |
| struct tree; |
| |
| struct merge_options_internal; |
| struct merge_options { |
| struct repository *repo; |
| |
| /* ref names used in console messages and conflict markers */ |
| const char *ancestor; |
| const char *branch1; |
| const char *branch2; |
| |
| /* rename related options */ |
| int detect_renames; |
| enum { |
| MERGE_DIRECTORY_RENAMES_NONE = 0, |
| MERGE_DIRECTORY_RENAMES_CONFLICT = 1, |
| MERGE_DIRECTORY_RENAMES_TRUE = 2 |
| } detect_directory_renames; |
| int rename_limit; |
| int rename_score; |
| int show_rename_progress; |
| |
| /* xdiff-related options (patience, ignore whitespace, ours/theirs) */ |
| long xdl_opts; |
| enum { |
| MERGE_VARIANT_NORMAL = 0, |
| MERGE_VARIANT_OURS, |
| MERGE_VARIANT_THEIRS |
| } recursive_variant; |
| |
| /* console output related options */ |
| int verbosity; |
| unsigned buffer_output; /* 1: output at end, 2: keep buffered */ |
| struct strbuf obuf; /* output buffer; if buffer_output == 2, caller |
| * must handle and call strbuf_release */ |
| |
| /* miscellaneous control options */ |
| const char *subtree_shift; |
| unsigned renormalize : 1; |
| unsigned record_conflict_msgs_as_headers : 1; |
| const char *msg_header_prefix; |
| |
| /* internal fields used by the implementation */ |
| struct merge_options_internal *priv; |
| }; |
| |
| void init_merge_options(struct merge_options *opt, struct repository *repo); |
| |
| /* parse the option in s and update the relevant field of opt */ |
| int parse_merge_opt(struct merge_options *opt, const char *s); |
| |
| /* |
| * RETURN VALUES: All the merge_* functions below return a value as follows: |
| * > 0 Merge was clean |
| * = 0 Merge had conflicts |
| * < 0 Merge hit an unexpected and unrecoverable problem (e.g. disk |
| * full) and aborted merge part-way through. |
| */ |
| |
| /* |
| * rename-detecting three-way merge, no recursion. |
| * |
| * Outputs: |
| * - See RETURN VALUES above |
| * - opt->repo->index has the new index |
| * - new index NOT written to disk |
| * - The working tree is updated with results of the merge |
| */ |
| int merge_trees(struct merge_options *opt, |
| struct tree *head, |
| struct tree *merge, |
| struct tree *merge_base); |
| |
| /* |
| * merge_recursive is like merge_trees() but with recursive ancestor |
| * consolidation. |
| * |
| * NOTE: empirically, about a decade ago it was determined that with more |
| * than two merge bases, optimal behavior was found when the |
| * merge_bases were passed in the order of oldest commit to newest |
| * commit. Also, merge_bases will be consumed (emptied) so make a |
| * copy if you need it. |
| * |
| * Outputs: |
| * - See RETURN VALUES above |
| * - *result is treated as scratch space for temporary recursive merges |
| * - opt->repo->index has the new index |
| * - new index NOT written to disk |
| * - The working tree is updated with results of the merge |
| */ |
| int merge_recursive(struct merge_options *opt, |
| struct commit *h1, |
| struct commit *h2, |
| struct commit_list *merge_bases, |
| struct commit **result); |
| |
| /* |
| * merge_recursive_generic can operate on trees instead of commits, by |
| * wrapping the trees into virtual commits, and calling merge_recursive(). |
| * It also writes out the in-memory index to disk if the merge is successful. |
| * |
| * Outputs: |
| * - See RETURN VALUES above |
| * - *result is treated as scratch space for temporary recursive merges |
| * - opt->repo->index has the new index |
| * - new index also written to $GIT_INDEX_FILE on disk |
| * - The working tree is updated with results of the merge |
| */ |
| int merge_recursive_generic(struct merge_options *opt, |
| const struct object_id *head, |
| const struct object_id *merge, |
| int num_merge_bases, |
| const struct object_id **merge_bases, |
| struct commit **result); |
| |
| #endif |