From a944af1d86e6171d68ed2a3aa67b1d68f00e1fe8 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 8 Sep 2012 21:27:19 -0700 Subject: merge: teach -Xours/-Xtheirs to binary ll-merge driver The (discouraged) -Xours/-Xtheirs modes of merge are supposed to give a quick and dirty way to come up with a random mixture of cleanly merged parts and punted conflict resolution to take contents from one side in conflicting parts. These options however were only passed down to the low level merge driver for text. Teach the built-in binary merge driver to notice them as well. Signed-off-by: Junio C Hamano --- ll-merge.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'll-merge.c') diff --git a/ll-merge.c b/ll-merge.c index da59738c9..8535e2d4a 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -46,16 +46,31 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, assert(opts); /* - * The tentative merge result is "ours" for the final round, - * or common ancestor for an internal merge. Still return - * "conflicted merge" status. + * The tentative merge result is the or common ancestor for an internal merge. */ - stolen = opts->virtual_ancestor ? orig : src1; + if (opts->virtual_ancestor) { + stolen = orig; + } else { + switch (opts->variant) { + default: + case XDL_MERGE_FAVOR_OURS: + stolen = src1; + break; + case XDL_MERGE_FAVOR_THEIRS: + stolen = src2; + break; + } + } result->ptr = stolen->ptr; result->size = stolen->size; stolen->ptr = NULL; - return 1; + + /* + * With -Xtheirs or -Xours, we have cleanly merged; + * otherwise we got a conflict. + */ + return (opts->variant ? 0 : 1); } static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, -- cgit v1.2.1 From e0e2065f74500119d5e12524992273de362acd30 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 12 Sep 2012 02:01:52 -0700 Subject: ll-merge: warn about inability to merge binary files only when we can't When a path being merged is auto detected to be a binary file, we warned "Cannot merge binary files" before switching to activate the binary ll-merge driver. When we are merging with the -Xours/theirs option, however, we know what the "clean" merge result is, and the warning is inappropriate. In addition, when the path is explicitly marked as a binary file, this warning was not issued, even though without -Xours/theirs, we cannot cleanly automerge such a path, which was inconsistent. Move the warning code from ll_xdl_merge() to ll_binary_merge(), and issue the message only when we cannot cleanly automerge. Signed-off-by: Junio C Hamano --- ll-merge.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'll-merge.c') diff --git a/ll-merge.c b/ll-merge.c index 8535e2d4a..307315b78 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -35,7 +35,7 @@ struct ll_merge_driver { */ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, mmbuffer_t *result, - const char *path_unused, + const char *path, mmfile_t *orig, const char *orig_name, mmfile_t *src1, const char *name1, mmfile_t *src2, const char *name2, @@ -53,6 +53,9 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, } else { switch (opts->variant) { default: + warning("Cannot merge binary files: %s (%s vs. %s)\n", + path, name1, name2); + /* fallthru */ case XDL_MERGE_FAVOR_OURS: stolen = src1; break; @@ -88,8 +91,6 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, if (buffer_is_binary(orig->ptr, orig->size) || buffer_is_binary(src1->ptr, src1->size) || buffer_is_binary(src2->ptr, src2->size)) { - warning("Cannot merge binary files: %s (%s vs. %s)\n", - path, name1, name2); return ll_binary_merge(drv_unused, result, path, orig, orig_name, -- cgit v1.2.1