ll_binary_merge(): handle XDL_MERGE_FAVOR_UNION
Prior to commita944af1d86
(merge: teach -Xours/-Xtheirs to binary ll-merge driver, 2012-09-08), we always reported a conflict from ll_binary_merge() by returning "1" (in the xdl_merge and ll_merge code, this value is the number of conflict hunks). After that commit, we report zero conflicts if the "variant" flag is set, under the assumption that it is one of XDL_MERGE_FAVOR_OURS or XDL_MERGE_FAVOR_THEIRS. But this gets confused by XDL_MERGE_FAVOR_UNION. We do not know how to do a binary union merge, but erroneously report no conflicts anyway (and just blindly use the "ours" content as the result). Let's tighten our check to just the cases thata944af1d86
meant to cover. This fixes the union case (which existed already back when that commit was made), as well as future-proofing us against any other variants that get added later. Note that you can't trigger this from "git merge-file --union", as that bails on binary files before even calling into the ll-merge machinery. The test here uses the "union" merge attribute, which does erroneously report a successful merge. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
48bf2fa8ba
commit
7d879ad7e0
@ -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,
|
||||
|
@ -207,4 +207,21 @@ 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
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user