merge-ort: capture and print ll-merge warnings in our preferred fashion

Instead of immediately printing ll-merge warnings to stderr, we save
them in our output strbuf.  Besides allowing us to move these warnings
to a special file for --remerge-diff, this has two other benefits for
regular merges done by merge-ort:

  * The deferral of messages ensures we can print all messages about
    any given path together (merge-recursive was known to sometimes
    intersperse messages about other paths, particularly when renames
    were involved).

  * The deferral of messages means we can avoid printing spurious
    conflict messages when we just end up aborting due to local user
    modifications in the way.  (In contrast to merge-recursive.c which
    prematurely checks for local modifications in the way via
    unpack_trees() and gets the check wrong both in terms of false
    positives and false negatives relative to renames, merge-ort does
    not perform the local modifications in the way check until the
    checkout() step after the full merge has been computed.)

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Elijah Newren 2022-02-02 02:37:31 +00:00 committed by Junio C Hamano
parent 35f6967161
commit 24dbdab50d
3 changed files with 17 additions and 6 deletions

View file

@ -1788,8 +1788,9 @@ static int merge_3way(struct merge_options *opt,
&src1, name1, &src2, name2,
&opt->priv->attr_index, &ll_opts);
if (merge_status == LL_MERGE_BINARY_CONFLICT)
warning("Cannot merge binary files: %s (%s vs. %s)",
path, name1, name2);
path_msg(opt, path, 0,
"warning: Cannot merge binary files: %s (%s vs. %s)",
path, name1, name2);
free(base);
free(name1);

View file

@ -108,8 +108,13 @@ test_expect_success 'refuse to merge binary files' '
printf "\0\0" >binary-file &&
git add binary-file &&
git commit -m binary2 &&
test_must_fail git merge F >merge.out 2>merge.err &&
grep "Cannot merge binary files: binary-file (HEAD vs. F)" merge.err
if test "$GIT_TEST_MERGE_ALGORITHM" = ort
then
test_must_fail git merge F >merge_output
else
test_must_fail git merge F 2>merge_output
fi &&
grep "Cannot merge binary files: binary-file (HEAD vs. F)" merge_output
'
test_expect_success 'mark rename/delete as unmerged' '

View file

@ -221,8 +221,13 @@ test_expect_success 'binary files with union attribute' '
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
if test "$GIT_TEST_MERGE_ALGORITHM" = ort
then
test_must_fail git merge bin-main >output
else
test_must_fail git merge bin-main 2>output
fi &&
grep -i "warning.*cannot merge.*HEAD vs. bin-main" output
'
test_done