Cherry-pick and revert always ran the merging in a separate process. This patch makes cherry-pick/revert call merge_recursive_generic() instead of running a git-merge-recursive process. The GITHEAD_* environment definitions are not needed anymore, since the names are direct arguments to merge_recursive_generic(). Signed-off-by: Stephan Beyer <s-beyer@xxxxxxx> --- Hi, So this is now based on the new merge-recursive.c based on (1a) and (1b). The number of lines deleted and inserted tells me that we're doing something right here. builtin-revert.c | 50 +++++++++++++------------------------------------- 1 files changed, 13 insertions(+), 37 deletions(-) diff --git a/builtin-revert.c b/builtin-revert.c index 27881e9..2a724ca 100644 --- a/builtin-revert.c +++ b/builtin-revert.c @@ -11,6 +11,7 @@ #include "cache-tree.h" #include "diff.h" #include "revision.h" +#include "merge-recursive.h" /* * This implements the builtins revert and cherry-pick. @@ -200,36 +201,6 @@ static void set_author_ident_env(const char *message) sha1_to_hex(commit->object.sha1)); } -static int merge_recursive(const char *base_sha1, - const char *head_sha1, const char *head_name, - const char *next_sha1, const char *next_name) -{ - char buffer[256]; - const char *argv[6]; - int i = 0; - - sprintf(buffer, "GITHEAD_%s", head_sha1); - setenv(buffer, head_name, 1); - sprintf(buffer, "GITHEAD_%s", next_sha1); - setenv(buffer, next_name, 1); - - /* - * This three way merge is an interesting one. We are at - * $head, and would want to apply the change between $commit - * and $prev on top of us (when reverting), or the change between - * $prev and $commit on top of us (when cherry-picking or replaying). - */ - argv[i++] = "merge-recursive"; - if (base_sha1) - argv[i++] = base_sha1; - argv[i++] = "--"; - argv[i++] = head_sha1; - argv[i++] = next_sha1; - argv[i++] = NULL; - - return run_command_v_opt(argv, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD); -} - static char *help_msg(const unsigned char *sha1) { static char helpbuf[1024]; @@ -266,12 +237,14 @@ static int revert_or_cherry_pick(int argc, const char **argv) { unsigned char head[20]; struct commit *base, *next, *parent; - int i; + int i, fail; char *oneline, *reencoded_message = NULL; + const char *base_list[] = { NULL, NULL }; const char *message, *encoding; const char *defmsg = xstrdup(git_path("MERGE_MSG")); - git_config(git_default_config, NULL); + git_config(merge_recursive_config, NULL); + merge_recursive_setup(0); me = action == REVERT ? "revert" : "cherry-pick"; setenv(GIT_REFLOG_ACTION, me, 0); parse_args(argc, argv); @@ -373,11 +346,14 @@ static int revert_or_cherry_pick(int argc, const char **argv) } } - if (merge_recursive(base == NULL ? - NULL : sha1_to_hex(base->object.sha1), - sha1_to_hex(head), "HEAD", - sha1_to_hex(next->object.sha1), oneline) || - write_cache_as_tree(head, 0, NULL)) { + if (base) + base_list[0] = sha1_to_hex(base->object.sha1); + fail = merge_recursive_generic(base_list, head, "HEAD", + next->object.sha1, oneline); + if (fail < 0) + exit(1); + + if (fail || write_cache_as_tree(head, 0, NULL)) { add_to_msg("\nConflicts:\n\n"); read_cache(); for (i = 0; i < active_nr;) { -- 1.6.0.rc2.281.g6f6cf -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html