diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2010-03-20 19:41:38 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-03-20 20:36:11 -0700 |
commit | 4c5868f43d1ec2573f4f511d732bc00d56accc70 (patch) | |
tree | 914ef4ec42db899cb7f4449da1df49d13bb48d57 | |
parent | e44b3851c9d5fc840e8f33fb76f473a71b658d10 (diff) | |
download | git-4c5868f43d1ec2573f4f511d732bc00d56accc70.tar.gz |
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>
-rw-r--r-- | merge-recursive.c | 11 | ||||
-rw-r--r-- | merge-recursive.h | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/merge-recursive.c b/merge-recursive.c index 3b2cc9d15a..017cafddd1 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -608,7 +608,7 @@ static int merge_3way(struct merge_options *o, const char *branch2) { mmfile_t orig, src1, src2; - char *name1, *name2; + char *base_name, *name1, *name2; int merge_status; int favor; @@ -628,10 +628,15 @@ static int merge_3way(struct merge_options *o, } } - if (strcmp(a->path, b->path)) { + if (strcmp(a->path, b->path) || + (o->ancestor != NULL && strcmp(a->path, one->path) != 0)) { + base_name = o->ancestor == NULL ? NULL : + xstrdup(mkpath("%s:%s", o->ancestor, one->path)); name1 = xstrdup(mkpath("%s:%s", branch1, a->path)); name2 = xstrdup(mkpath("%s:%s", branch2, b->path)); } else { + base_name = o->ancestor == NULL ? NULL : + xstrdup(mkpath("%s", o->ancestor)); name1 = xstrdup(mkpath("%s", branch1)); name2 = xstrdup(mkpath("%s", branch2)); } @@ -640,7 +645,7 @@ static int merge_3way(struct merge_options *o, read_mmblob(&src1, a->sha1); read_mmblob(&src2, b->sha1); - merge_status = ll_merge(result_buf, a->path, &orig, NULL, + merge_status = ll_merge(result_buf, a->path, &orig, base_name, &src1, name1, &src2, name2, (!!o->call_depth) | (favor << 1)); diff --git a/merge-recursive.h b/merge-recursive.h index be8410ad18..d1192f56d7 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -4,6 +4,7 @@ #include "string-list.h" struct merge_options { + const char *ancestor; const char *branch1; const char *branch2; enum { |