Merge branch 'jk/union-merge-binary'

The "union" conflict resolution variant misbehaved when used with
binary merge driver.

* jk/union-merge-binary:
  ll_union_merge(): rename path_unused parameter
  ll_union_merge(): pass name labels to ll_xdl_merge()
  ll_binary_merge(): handle XDL_MERGE_FAVOR_UNION
This commit is contained in:
Junio C Hamano 2021-07-13 16:52:51 -07:00
commit 308528a3ea
2 changed files with 24 additions and 4 deletions

View File

@ -91,7 +91,9 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
* With -Xtheirs or -Xours, we have cleanly merged;
* otherwise we got a conflict.
*/
return (opts->variant ? 0 : 1);
return opts->variant == XDL_MERGE_FAVOR_OURS ||
opts->variant == XDL_MERGE_FAVOR_THEIRS ?
0 : 1;
}
static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
@ -136,7 +138,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,
const char *path,
mmfile_t *orig, const char *orig_name,
mmfile_t *src1, const char *name1,
mmfile_t *src2, const char *name2,
@ -148,8 +150,8 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused,
assert(opts);
o = *opts;
o.variant = XDL_MERGE_FAVOR_UNION;
return ll_xdl_merge(drv_unused, result, path_unused,
orig, NULL, src1, NULL, src2, NULL,
return ll_xdl_merge(drv_unused, result, path,
orig, orig_name, src1, name1, src2, name2,
&o, marker_size);
}

View File

@ -207,4 +207,22 @@ test_expect_success 'custom merge does not lock index' '
git merge main
'
test_expect_success 'binary files with union attribute' '
git checkout -b bin-main &&
printf "base\0" >bin.txt &&
echo "bin.txt merge=union" >.gitattributes &&
git add bin.txt .gitattributes &&
git commit -m base &&
printf "one\0" >bin.txt &&
git commit -am one &&
git checkout -b bin-side HEAD^ &&
printf "two\0" >bin.txt &&
git commit -am two &&
test_must_fail git merge bin-main 2>stderr &&
grep -i "warning.*cannot merge.*HEAD vs. bin-main" stderr
'
test_done