]> git.ipfire.org Git - thirdparty/git.git/commitdiff
format-patch: assume --cover-letter for diff in multi-patch series
authorRubén Justo <rjusto@gmail.com>
Fri, 7 Jun 2024 20:55:21 +0000 (22:55 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jun 2024 21:02:13 +0000 (14:02 -0700)
When we deal with a multi-patch series in git-format-patch(1), if we see
`--interdiff` or `--range-diff` but no `--cover-letter`, we return with
an error, saying:

    fatal: --range-diff requires --cover-letter or single patch

or:

    fatal: --interdiff requires --cover-letter or single patch

This makes sense because the cover-letter is where we place the diff
from the previous version.

However, considering that `format-patch` generates a multi-patch as
needed, let's adopt a similar "cover as necessary" approach when using
`--interdiff` or `--range-diff`.

Therefore, relax the requirement for an explicit `--cover-letter` in a
multi-patch series when the user says `--iterdiff` or `--range-diff`.

Still, if only to return the error, respect "format.coverLetter=no" and
`--no-cover-letter`.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/log.c
t/t3206-range-diff.sh
t/t4014-format-patch.sh

index c0a8bb95e9830b655c8de71521764c59b73c6ea0..d61cdbf304df168d2f706edba0b11e245f69f529 100644 (file)
@@ -2255,6 +2255,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        if (cover_letter == -1) {
                if (config_cover_letter == COVER_AUTO)
                        cover_letter = (total > 1);
+               else if ((idiff_prev.nr || rdiff_prev) && (total > 1))
+                       cover_letter = (config_cover_letter != COVER_OFF);
                else
                        cover_letter = (config_cover_letter == COVER_ON);
        }
index 7b05bf3961923035bba7fd26b2c389a9f4d151a0..a767c3520ef6b77e1cbf0d136b448b7f89b2ec3e 100755 (executable)
@@ -545,6 +545,20 @@ do
        '
 done
 
+test_expect_success "--range-diff implies --cover-letter for multi-patch series" '
+       test_when_finished "rm -f v2-000?-*" &&
+       git format-patch -v2 --range-diff=topic main..unmodified &&
+       test_grep "^Range-diff against v1:$" v2-0000-cover-letter.patch
+'
+
+test_expect_success "explicit --no-cover-letter defeats implied --cover-letter" '
+       test_when_finished "rm -f v2-000?-*" &&
+       test_must_fail git format-patch --no-cover-letter \
+               -v2 --range-diff=topic main..unmodified &&
+       test_must_fail git -c format.coverLetter=no format-patch \
+               -v2 --range-diff=topic main..unmodified
+'
+
 test_expect_success 'format-patch --range-diff as commentary' '
        git format-patch --range-diff=HEAD~1 HEAD~1 >actual &&
        test_when_finished "rm 0001-*" &&
index a252c8fbf116d6dfbba08383def63a2fdec1fcec..1088c435e06f4c64a311b5ea5b9fd0dd64085137 100755 (executable)
@@ -2445,6 +2445,21 @@ test_expect_success 'interdiff: solo-patch' '
        test_cmp expect actual
 '
 
+test_expect_success 'interdiff: multi-patch, implicit --cover-letter' '
+       test_when_finished "rm -f v23-0*.patch" &&
+       git format-patch --interdiff=boop~2 -2 -v23 &&
+       test_grep "^Interdiff against v22:$" v23-0000-cover-letter.patch &&
+       test_cmp expect actual
+'
+
+test_expect_success 'interdiff: explicit --no-cover-letter defeats implied --cover-letter' '
+       test_when_finished "rm -f v23-0*.patch" &&
+       test_must_fail git format-patch --no-cover-letter \
+               --interdiff=boop~2 -2 -v23 &&
+       test_must_fail git -c format.coverLetter=no format-patch \
+               --interdiff=boop~2 -2 -v23
+'
+
 test_expect_success 'format-patch does not respect diff.noprefix' '
        git -c diff.noprefix format-patch -1 --stdout >actual &&
        grep "^--- a/blorp" actual