Skip to content

Commit 4c5868f

Browse files
jrngitster
authored andcommitted
merge_trees(): add ancestor label parameter for diff3-style output
Commands using the merge_trees() machinery will present conflict hunks in output something like what ‘diff3 -m’ produces if the merge.conflictstyle configuration option is set to diff3. The output lacks the name of the merge base on the ||||||| line of the output, and tools can misparse the conflict hunks without it. Add a new o->ancestor parameter to merge_trees() for use as a label for the ancestor in conflict hunks. If o->ancestor is NULL, the output format is as before. All callers pass NULL for now. If o->ancestor is non-NULL and both branches renamed the base file to the same name, that name is included in the conflict hunk labels. Even if o->ancestor is NULL I think this would be a good change, but this patch only does it in the non-NULL case to ensure the output format does not change where it might matter. Requested-by: Stefan Monnier <monnier@iro.umontreal.ca> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent e44b385 commit 4c5868f

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

merge-recursive.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ static int merge_3way(struct merge_options *o,
608608
const char *branch2)
609609
{
610610
mmfile_t orig, src1, src2;
611-
char *name1, *name2;
611+
char *base_name, *name1, *name2;
612612
int merge_status;
613613
int favor;
614614

@@ -628,10 +628,15 @@ static int merge_3way(struct merge_options *o,
628628
}
629629
}
630630

631-
if (strcmp(a->path, b->path)) {
631+
if (strcmp(a->path, b->path) ||
632+
(o->ancestor != NULL && strcmp(a->path, one->path) != 0)) {
633+
base_name = o->ancestor == NULL ? NULL :
634+
xstrdup(mkpath("%s:%s", o->ancestor, one->path));
632635
name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
633636
name2 = xstrdup(mkpath("%s:%s", branch2, b->path));
634637
} else {
638+
base_name = o->ancestor == NULL ? NULL :
639+
xstrdup(mkpath("%s", o->ancestor));
635640
name1 = xstrdup(mkpath("%s", branch1));
636641
name2 = xstrdup(mkpath("%s", branch2));
637642
}
@@ -640,7 +645,7 @@ static int merge_3way(struct merge_options *o,
640645
read_mmblob(&src1, a->sha1);
641646
read_mmblob(&src2, b->sha1);
642647

643-
merge_status = ll_merge(result_buf, a->path, &orig, NULL,
648+
merge_status = ll_merge(result_buf, a->path, &orig, base_name,
644649
&src1, name1, &src2, name2,
645650
(!!o->call_depth) | (favor << 1));
646651

merge-recursive.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "string-list.h"
55

66
struct merge_options {
7+
const char *ancestor;
78
const char *branch1;
89
const char *branch2;
910
enum {

0 commit comments

Comments
 (0)