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@informatik.uni-freiburg.de>
---
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, ...