You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.7 KiB
125 lines
3.7 KiB
#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
|
|
|