ll_merge(): add ancestor label parameter for diff3-style output
Commands using the ll_merge() function will present conflict hunks imitating ‘diff3 -m’ output if the merge.conflictstyle configuration option is set appropriately. Unlike ‘diff3 -m’, the output does not include a label for the merge base on the ||||||| line of the output, and some tools misparse the conflict hunks without that. Add a new ancestor_label parameter to ll_merge() to give callers the power to rectify this situation. If ancestor_label is NULL, the output format is unchanged. All callers pass NULL for now. 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>
This commit is contained in:
parent
4bb0936206
commit
f01de62e45
@ -149,7 +149,7 @@ static int checkout_merged(int pos, struct checkout *state)
|
||||
read_mmblob(&ours, active_cache[pos+1]->sha1);
|
||||
read_mmblob(&theirs, active_cache[pos+2]->sha1);
|
||||
|
||||
status = ll_merge(&result_buf, path, &ancestor,
|
||||
status = ll_merge(&result_buf, path, &ancestor, NULL,
|
||||
&ours, "ours", &theirs, "theirs", 0);
|
||||
free(ancestor.ptr);
|
||||
free(ours.ptr);
|
||||
|
20
ll-merge.c
20
ll-merge.c
@ -15,7 +15,7 @@ struct ll_merge_driver;
|
||||
typedef int (*ll_merge_fn)(const struct ll_merge_driver *,
|
||||
mmbuffer_t *result,
|
||||
const char *path,
|
||||
mmfile_t *orig,
|
||||
mmfile_t *orig, const char *orig_name,
|
||||
mmfile_t *src1, const char *name1,
|
||||
mmfile_t *src2, const char *name2,
|
||||
int flag,
|
||||
@ -36,7 +36,7 @@ struct ll_merge_driver {
|
||||
static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
|
||||
mmbuffer_t *result,
|
||||
const char *path_unused,
|
||||
mmfile_t *orig,
|
||||
mmfile_t *orig, const char *orig_name,
|
||||
mmfile_t *src1, const char *name1,
|
||||
mmfile_t *src2, const char *name2,
|
||||
int flag, int marker_size)
|
||||
@ -57,7 +57,7 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
|
||||
static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
|
||||
mmbuffer_t *result,
|
||||
const char *path,
|
||||
mmfile_t *orig,
|
||||
mmfile_t *orig, const char *orig_name,
|
||||
mmfile_t *src1, const char *name1,
|
||||
mmfile_t *src2, const char *name2,
|
||||
int flag, int marker_size)
|
||||
@ -71,7 +71,8 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
|
||||
path, name1, name2);
|
||||
return ll_binary_merge(drv_unused, result,
|
||||
path,
|
||||
orig, src1, name1,
|
||||
orig, orig_name,
|
||||
src1, name1,
|
||||
src2, name2,
|
||||
flag, marker_size);
|
||||
}
|
||||
@ -83,6 +84,7 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
|
||||
xmp.style = git_xmerge_style;
|
||||
if (marker_size > 0)
|
||||
xmp.marker_size = marker_size;
|
||||
xmp.ancestor = orig_name;
|
||||
xmp.file1 = name1;
|
||||
xmp.file2 = name2;
|
||||
return xdl_merge(orig, src1, src2, &xmp, result);
|
||||
@ -91,7 +93,7 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
|
||||
static int ll_union_merge(const struct ll_merge_driver *drv_unused,
|
||||
mmbuffer_t *result,
|
||||
const char *path_unused,
|
||||
mmfile_t *orig,
|
||||
mmfile_t *orig, const char *orig_name,
|
||||
mmfile_t *src1, const char *name1,
|
||||
mmfile_t *src2, const char *name2,
|
||||
int flag, int marker_size)
|
||||
@ -99,7 +101,7 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused,
|
||||
/* Use union favor */
|
||||
flag = (flag & 1) | (XDL_MERGE_FAVOR_UNION << 1);
|
||||
return ll_xdl_merge(drv_unused, result, path_unused,
|
||||
orig, src1, NULL, src2, NULL,
|
||||
orig, NULL, src1, NULL, src2, NULL,
|
||||
flag, marker_size);
|
||||
return 0;
|
||||
}
|
||||
@ -130,7 +132,7 @@ static void create_temp(mmfile_t *src, char *path)
|
||||
static int ll_ext_merge(const struct ll_merge_driver *fn,
|
||||
mmbuffer_t *result,
|
||||
const char *path,
|
||||
mmfile_t *orig,
|
||||
mmfile_t *orig, const char *orig_name,
|
||||
mmfile_t *src1, const char *name1,
|
||||
mmfile_t *src2, const char *name2,
|
||||
int flag, int marker_size)
|
||||
@ -321,7 +323,7 @@ static int git_path_check_merge(const char *path, struct git_attr_check check[2]
|
||||
|
||||
int ll_merge(mmbuffer_t *result_buf,
|
||||
const char *path,
|
||||
mmfile_t *ancestor,
|
||||
mmfile_t *ancestor, const char *ancestor_label,
|
||||
mmfile_t *ours, const char *our_label,
|
||||
mmfile_t *theirs, const char *their_label,
|
||||
int flag)
|
||||
@ -343,7 +345,7 @@ int ll_merge(mmbuffer_t *result_buf,
|
||||
driver = find_ll_merge_driver(ll_driver_name);
|
||||
if (virtual_ancestor && driver->recursive)
|
||||
driver = find_ll_merge_driver(driver->recursive);
|
||||
return driver->fn(driver, result_buf, path, ancestor,
|
||||
return driver->fn(driver, result_buf, path, ancestor, ancestor_label,
|
||||
ours, our_label, theirs, their_label,
|
||||
flag, marker_size);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
int ll_merge(mmbuffer_t *result_buf,
|
||||
const char *path,
|
||||
mmfile_t *ancestor,
|
||||
mmfile_t *ancestor, const char *ancestor_label,
|
||||
mmfile_t *ours, const char *our_label,
|
||||
mmfile_t *theirs, const char *their_label,
|
||||
int flag);
|
||||
|
@ -30,7 +30,7 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our
|
||||
int merge_status;
|
||||
mmbuffer_t res;
|
||||
|
||||
merge_status = ll_merge(&res, path, base,
|
||||
merge_status = ll_merge(&res, path, base, NULL,
|
||||
our, ".our", their, ".their", 0);
|
||||
if (merge_status < 0)
|
||||
return NULL;
|
||||
|
@ -640,7 +640,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,
|
||||
merge_status = ll_merge(result_buf, a->path, &orig, NULL,
|
||||
&src1, name1, &src2, name2,
|
||||
(!!o->call_depth) | (favor << 1));
|
||||
|
||||
|
4
rerere.c
4
rerere.c
@ -319,7 +319,7 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu
|
||||
if (!mmfile[i].ptr && !mmfile[i].size)
|
||||
mmfile[i].ptr = xstrdup("");
|
||||
}
|
||||
ll_merge(&result, path, &mmfile[0],
|
||||
ll_merge(&result, path, &mmfile[0], NULL,
|
||||
&mmfile[1], "ours",
|
||||
&mmfile[2], "theirs", 0);
|
||||
for (i = 0; i < 3; i++)
|
||||
@ -376,7 +376,7 @@ static int merge(const char *name, const char *path)
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
ret = ll_merge(&result, path, &base, &cur, "", &other, "", 0);
|
||||
ret = ll_merge(&result, path, &base, NULL, &cur, "", &other, "", 0);
|
||||
if (!ret) {
|
||||
FILE *f = fopen(path, "w");
|
||||
if (!f)
|
||||
|
Loading…
Reference in New Issue
Block a user