[PATCH v3] format-patch: assume --cover-letter for diff in multi-patch series
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>
---
Range-diff against v2:
1: ff67f24022 ! 1: 8dc5f16d83 format-patch: assume --cover-letter for diff in multi-patch series
@@ t/t3206-range-diff.sh: do
done
+test_expect_success "format-patch --range-diff, implicit --cover-letter" '
++ 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 &&
+ git format-patch -v2 --range-diff=topic main..unmodified &&
+ test_when_finished "rm v2-000?-*" &&
-+ test_grep "^Range-diff against v1:$" v2-0000-*
++ test_grep "^Range-diff against v1:$" v2-0000-cover-letter.patch
+'
+
test_expect_success 'format-patch --range-diff as commentary' '
@@ t/t4014-format-patch.sh: test_expect_success 'interdiff: solo-patch' '
'
+test_expect_success 'interdiff: multi-patch, implicit --cover-letter' '
++ 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 &&
+ git format-patch --interdiff=boop~2 -2 -v23 &&
+ test_grep "^Interdiff against v22:$" v23-0000-cover-letter.patch &&
+ test_cmp expect actual builtin/log.c | 2 ++
t/t3206-range-diff.sh | 10 ++++++++++
t/t4014-format-patch.sh | 10 ++++++++++
3 files changed, 22 insertions(+)
Show changes to 3 files +22 −0
builtin/log.c, t/t3206-range-diff.sh, t/t4014-format-patch.sh
diff --git a/builtin/log.c b/builtin/log.c
index c8ce0c0d88..8032909d4f 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -2277,6 +2277,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);
}
diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh
index 7b05bf3961..4a597466a2 100755
--- a/t/t3206-range-diff.sh
+++ b/t/t3206-range-diff.sh
@@ -545,6 +545,16 @@ do
'
done
+test_expect_success "format-patch --range-diff, implicit --cover-letter" '
+ 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 &&
+ git format-patch -v2 --range-diff=topic main..unmodified &&
+ test_when_finished "rm v2-000?-*" &&
+ test_grep "^Range-diff against v1:$" v2-0000-cover-letter.patch
+'
+
test_expect_success 'format-patch --range-diff as commentary' '
git format-patch --range-diff=HEAD~1 HEAD~1 >actual &&
test_when_finished "rm 0001-*" &&
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index ba85b582c5..b96348eebd 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -2492,6 +2492,16 @@ test_expect_success 'interdiff: solo-patch' '
test_cmp expect actual
'
+test_expect_success 'interdiff: multi-patch, implicit --cover-letter' '
+ 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 &&
+ 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 'format-patch does not respect diff.noprefix' '
git -c diff.noprefix format-patch -1 --stdout >actual &&
grep "^--- a/blorp" actual
--
2.45.2.410.g52d620e86a