If no error occurs, merge (from rcs 5.7) is nothing but: diff3 -E -am -L label1 -L label2 -L label3 file1 file2 file3 > tmpfile cat tmpfile > file1 Using diff3 directly saves one fork per conflicting file. Signed-off-by: Uwe Zeisberger <zeisberg@xxxxxxxxxxxxxxxxxxxxxxxxxx> --- merge-recursive.c | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) It passes `make test` when NO_SVN_TESTS is defined. (I'll write a separate mail about that.) I didn't made any timing tests or further tests for correctness, but I hope Johannes still has the framework from the time when he converted the Python script to C? @Johannes: If so, could you test this patch? Best regards Uwe diff --git a/merge-recursive.c b/merge-recursive.c index 2ba43ae..9e3f9d7 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -657,8 +657,11 @@ static struct merge_file_info merge_file char orig[PATH_MAX]; char src1[PATH_MAX]; char src2[PATH_MAX]; + char tmppath[PATH_MAX]; + const char *argv[] = { - "merge", "-L", NULL, "-L", NULL, "-L", NULL, + "diff3", "-E", "-am", + "-L", NULL, "-L", NULL, "-L", NULL, NULL, NULL, NULL, NULL }; @@ -668,23 +671,31 @@ static struct merge_file_info merge_file git_unpack_file(a->sha1, src1); git_unpack_file(b->sha1, src2); - argv[2] = la = xstrdup(mkpath("%s/%s", branch1, a->path)); - argv[6] = lb = xstrdup(mkpath("%s/%s", branch2, b->path)); - argv[4] = lo = xstrdup(mkpath("orig/%s", o->path)); - argv[7] = src1; - argv[8] = orig; - argv[9] = src2, + argv[4] = la = xstrdup(mkpath("%s/%s", branch1, a->path)); + argv[8] = lb = xstrdup(mkpath("%s/%s", branch2, b->path)); + argv[6] = lo = xstrdup(mkpath("orig/%s", o->path)); + argv[9] = src1; + argv[10] = orig; + argv[11] = src2; + + fd = git_mkstemp(tmppath, sizeof(tmppath), + ".merge_file_XXXXXX"); + if (fd < 0) + die("unable to create temp-file"); + + dup2(fd, 1); + close(fd); - code = run_command_v(10, argv); + code = run_command_v(12, argv); free(la); free(lb); free(lo); if (code && code < -256) { - die("Failed to execute 'merge'. merge(1) is used as the " - "file-level merge tool. Is 'merge' in your path?"); + die("Failed to execute 'diff3'. diff3(1) is used as the " + "file-level merge tool. Is 'diff3' in your path?"); } - fd = open(src1, O_RDONLY); + fd = open(tmppath, O_RDONLY); if (fd < 0 || fstat(fd, &st) < 0 || index_fd(result.sha, fd, &st, 1, "blob")) @@ -693,6 +704,7 @@ static struct merge_file_info merge_file unlink(orig); unlink(src1); unlink(src2); + unlink(tmppath); result.clean = WEXITSTATUS(code) == 0; } else { -- 1.4.3.rc2 -- Uwe Zeisberger http://www.google.com/search?q=1+newton+in+kg*m+%2F+s%5E2 - 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