]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: capture and print ll-merge warnings in our preferred fashion
authorElijah Newren <newren@gmail.com>
Wed, 2 Feb 2022 02:37:31 +0000 (02:37 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Feb 2022 18:02:27 +0000 (10:02 -0800)
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>
merge-ort.c
t/t6404-recursive-merge.sh
t/t6406-merge-attr.sh

index c24da2ba3cb9d5b3f299feb9b39e11b0ba47a2bb..a18f47e23c58e1e979f7632ec6109c3aefb12df5 100644 (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);
index eaf48e941e2a3934fde54ac9bdc22f96a7a035cd..b8735c6db4d7c9cc556231a5b0dab091f2f2eb61 100755 (executable)
@@ -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' '
index 849464583713c40859d2473d2a4075367b1e4c09..c41584eb33ef8f06a12139ce3bb884cac5e4012b 100755 (executable)
@@ -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