Daniel Barkalow | e1b3a2c | 2008-02-07 11:40:05 -0500 | [diff] [blame] | 1 | #ifndef MERGE_RECURSIVE_H |
| 2 | #define MERGE_RECURSIVE_H |
| 3 | |
Elijah Newren | 5bf7e57 | 2019-08-17 11:41:41 -0700 | [diff] [blame] | 4 | #include "strbuf.h" |
Elijah Newren | ef3ca95 | 2018-08-15 10:54:05 -0700 | [diff] [blame] | 5 | |
| 6 | struct commit; |
Elijah Newren | 5bf7e57 | 2019-08-17 11:41:41 -0700 | [diff] [blame] | 7 | struct commit_list; |
| 8 | struct object_id; |
Nguyễn Thái Ngọc Duy | 0d6caa2 | 2019-01-12 09:13:29 +0700 | [diff] [blame] | 9 | struct repository; |
Elijah Newren | 5bf7e57 | 2019-08-17 11:41:41 -0700 | [diff] [blame] | 10 | struct tree; |
Nguyễn Thái Ngọc Duy | 0d6caa2 | 2019-01-12 09:13:29 +0700 | [diff] [blame] | 11 | |
Elijah Newren | 5bf7e57 | 2019-08-17 11:41:41 -0700 | [diff] [blame] | 12 | struct merge_options_internal; |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 13 | struct merge_options { |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 14 | struct repository *repo; |
| 15 | |
| 16 | /* ref names used in console messages and conflict markers */ |
Jonathan Nieder | 4c5868f | 2010-03-20 19:41:38 -0500 | [diff] [blame] | 17 | const char *ancestor; |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 18 | const char *branch1; |
| 19 | const char *branch2; |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 20 | |
| 21 | /* rename related options */ |
| 22 | int detect_renames; |
Derrick Stolee | 8e01251 | 2019-08-17 11:41:25 -0700 | [diff] [blame] | 23 | enum { |
| 24 | MERGE_DIRECTORY_RENAMES_NONE = 0, |
| 25 | MERGE_DIRECTORY_RENAMES_CONFLICT = 1, |
| 26 | MERGE_DIRECTORY_RENAMES_TRUE = 2 |
| 27 | } detect_directory_renames; |
Elijah Newren | 8599ab4 | 2019-08-17 11:41:38 -0700 | [diff] [blame] | 28 | int rename_limit; |
Kevin Ballard | 10ae752 | 2010-09-27 16:58:25 -0700 | [diff] [blame] | 29 | int rename_score; |
Jeff King | 99bfc66 | 2011-02-20 04:53:21 -0500 | [diff] [blame] | 30 | int show_rename_progress; |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 31 | |
| 32 | /* xdiff-related options (patience, ignore whitespace, ours/theirs) */ |
| 33 | long xdl_opts; |
| 34 | enum { |
Elijah Newren | f3081da | 2019-08-17 11:41:42 -0700 | [diff] [blame] | 35 | MERGE_VARIANT_NORMAL = 0, |
| 36 | MERGE_VARIANT_OURS, |
| 37 | MERGE_VARIANT_THEIRS |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 38 | } recursive_variant; |
| 39 | |
| 40 | /* console output related options */ |
| 41 | int verbosity; |
| 42 | unsigned buffer_output; /* 1: output at end, 2: keep buffered */ |
Elijah Newren | e95e481 | 2019-08-17 11:41:40 -0700 | [diff] [blame] | 43 | struct strbuf obuf; /* output buffer; if buffer_output == 2, caller |
| 44 | * must handle and call strbuf_release */ |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 45 | |
| 46 | /* miscellaneous control options */ |
| 47 | const char *subtree_shift; |
| 48 | unsigned renormalize : 1; |
Elijah Newren | 6054d1a | 2022-02-02 02:37:33 +0000 | [diff] [blame] | 49 | unsigned record_conflict_msgs_as_headers : 1; |
| 50 | const char *msg_header_prefix; |
Elijah Newren | a779fb8 | 2019-08-17 11:41:39 -0700 | [diff] [blame] | 51 | |
Elijah Newren | 5bf7e57 | 2019-08-17 11:41:41 -0700 | [diff] [blame] | 52 | /* internal fields used by the implementation */ |
| 53 | struct merge_options_internal *priv; |
Elijah Newren | ea625cb | 2018-02-14 10:51:57 -0800 | [diff] [blame] | 54 | }; |
| 55 | |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 56 | void init_merge_options(struct merge_options *opt, struct repository *repo); |
| 57 | |
| 58 | /* parse the option in s and update the relevant field of opt */ |
| 59 | int parse_merge_opt(struct merge_options *opt, const char *s); |
| 60 | |
Elijah Newren | 7fe40b8 | 2018-04-19 10:58:05 -0700 | [diff] [blame] | 61 | /* |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 62 | * RETURN VALUES: All the merge_* functions below return a value as follows: |
| 63 | * > 0 Merge was clean |
| 64 | * = 0 Merge had conflicts |
| 65 | * < 0 Merge hit an unexpected and unrecoverable problem (e.g. disk |
| 66 | * full) and aborted merge part-way through. |
Elijah Newren | 7fe40b8 | 2018-04-19 10:58:05 -0700 | [diff] [blame] | 67 | */ |
Elijah Newren | 7fe40b8 | 2018-04-19 10:58:05 -0700 | [diff] [blame] | 68 | |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 69 | /* |
| 70 | * rename-detecting three-way merge, no recursion. |
| 71 | * |
| 72 | * Outputs: |
| 73 | * - See RETURN VALUES above |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 74 | * - opt->repo->index has the new index |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 75 | * - new index NOT written to disk |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 76 | * - The working tree is updated with results of the merge |
| 77 | */ |
| 78 | int merge_trees(struct merge_options *opt, |
| 79 | struct tree *head, |
| 80 | struct tree *merge, |
| 81 | struct tree *merge_base); |
Ben Peart | 85b4603 | 2018-05-02 16:01:14 +0000 | [diff] [blame] | 82 | |
Elijah Newren | b4db8a2 | 2019-08-17 11:41:30 -0700 | [diff] [blame] | 83 | /* |
| 84 | * merge_recursive is like merge_trees() but with recursive ancestor |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 85 | * consolidation. |
Elijah Newren | b4db8a2 | 2019-08-17 11:41:30 -0700 | [diff] [blame] | 86 | * |
| 87 | * NOTE: empirically, about a decade ago it was determined that with more |
| 88 | * than two merge bases, optimal behavior was found when the |
Elijah Newren | ff1bfa2 | 2019-08-17 11:41:34 -0700 | [diff] [blame] | 89 | * merge_bases were passed in the order of oldest commit to newest |
| 90 | * commit. Also, merge_bases will be consumed (emptied) so make a |
| 91 | * copy if you need it. |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 92 | * |
| 93 | * Outputs: |
| 94 | * - See RETURN VALUES above |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 95 | * - *result is treated as scratch space for temporary recursive merges |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 96 | * - opt->repo->index has the new index |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 97 | * - new index NOT written to disk |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 98 | * - The working tree is updated with results of the merge |
Elijah Newren | b4db8a2 | 2019-08-17 11:41:30 -0700 | [diff] [blame] | 99 | */ |
Elijah Newren | c749ab1 | 2019-08-17 11:41:36 -0700 | [diff] [blame] | 100 | int merge_recursive(struct merge_options *opt, |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 101 | struct commit *h1, |
Daniel Barkalow | e1b3a2c | 2008-02-07 11:40:05 -0500 | [diff] [blame] | 102 | struct commit *h2, |
Elijah Newren | ff1bfa2 | 2019-08-17 11:41:34 -0700 | [diff] [blame] | 103 | struct commit_list *merge_bases, |
Daniel Barkalow | e1b3a2c | 2008-02-07 11:40:05 -0500 | [diff] [blame] | 104 | struct commit **result); |
| 105 | |
Elijah Newren | b4db8a2 | 2019-08-17 11:41:30 -0700 | [diff] [blame] | 106 | /* |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 107 | * merge_recursive_generic can operate on trees instead of commits, by |
| 108 | * wrapping the trees into virtual commits, and calling merge_recursive(). |
| 109 | * It also writes out the in-memory index to disk if the merge is successful. |
| 110 | * |
| 111 | * Outputs: |
| 112 | * - See RETURN VALUES above |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 113 | * - *result is treated as scratch space for temporary recursive merges |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 114 | * - opt->repo->index has the new index |
Elijah Newren | 56e7434 | 2020-08-02 03:14:27 +0000 | [diff] [blame] | 115 | * - new index also written to $GIT_INDEX_FILE on disk |
Elijah Newren | 7c0a6c8 | 2019-08-17 11:41:37 -0700 | [diff] [blame] | 116 | * - The working tree is updated with results of the merge |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 117 | */ |
Elijah Newren | c749ab1 | 2019-08-17 11:41:36 -0700 | [diff] [blame] | 118 | int merge_recursive_generic(struct merge_options *opt, |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 119 | const struct object_id *head, |
| 120 | const struct object_id *merge, |
Elijah Newren | ff1bfa2 | 2019-08-17 11:41:34 -0700 | [diff] [blame] | 121 | int num_merge_bases, |
| 122 | const struct object_id **merge_bases, |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 123 | struct commit **result); |
| 124 | |
Daniel Barkalow | e1b3a2c | 2008-02-07 11:40:05 -0500 | [diff] [blame] | 125 | #endif |