]> git.ipfire.org Git - thirdparty/git.git/commitdiff
format-patch: allow forcing the use of in-body From: header
authorJunio C Hamano <gitster@pobox.com>
Mon, 29 Aug 2022 21:38:36 +0000 (14:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Aug 2022 21:39:13 +0000 (14:39 -0700)
Users may be authoring and committing their commits under the same
e-mail address they use to send their patches from, in which case
they shouldn't need to use the in-body From: line in their outgoing
e-mails.  At the receiving end, "git am" will use the address on the
"From:" header of the incoming e-mail and all should be well.

Some mailing lists, however, mangle the From: address from what the
original sender had; in such a situation, the user may want to add
the in-body "From:" header even for their own patches.

"git format-patch --[no-]force-in-body-from" was invented for such
users.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-format-patch.txt
builtin/log.c
pretty.c
revision.h
t/t4014-format-patch.sh

index be797d7a28f62f38e2dc38c82141e71b97ea4aae..7c7f244e579f82d77548bf0e6db22b274c39c49b 100644 (file)
@@ -275,6 +275,15 @@ header). Note also that `git send-email` already handles this
 transformation for you, and this option should not be used if you are
 feeding the result to `git send-email`.
 
+--[no-]force-in-body-from::
+       With the e-mail sender specified via the `--from` option, by
+       default, an in-body "From:" to identify the real author of
+       the commit is added at the top of the commit log message if
+       the sender is different from the author.  With this option,
+       the in-body "From:" is added even when the sender and the
+       author have the same name and address, which may help if the
+       mailing list software mangles the sender's identity.
+
 --add-header=<header>::
        Add an arbitrary header to the email headers.  This is in addition
        to any configured headers, and may be used multiple times.
index 9b937d59b83dc29691d9cb940223c981f38ff7bf..78ccd37bd92594b0d331b158dea6137f0b3987fe 100644 (file)
@@ -52,6 +52,7 @@ static int default_encode_email_headers = 1;
 static int decoration_style;
 static int decoration_given;
 static int use_mailmap_config = 1;
+static unsigned int force_in_body_from;
 static const char *fmt_patch_subject_prefix = "PATCH";
 static int fmt_patch_name_max = FORMAT_PATCH_NAME_MAX_DEFAULT;
 static const char *fmt_pretty;
@@ -1897,6 +1898,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                           N_("show changes against <refspec> in cover letter or single patch")),
                OPT_INTEGER(0, "creation-factor", &creation_factor,
                            N_("percentage by which creation is weighted")),
+               OPT_BOOL(0, "force-in-body-from", &force_in_body_from,
+                        N_("show in-body From: even if identical to the e-mail header")),
                OPT_END()
        };
 
@@ -1940,6 +1943,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                             PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
                             PARSE_OPT_KEEP_DASHDASH);
 
+       rev.force_in_body_from = force_in_body_from;
+
        /* Make sure "0000-$sub.patch" gives non-negative length for $sub */
        if (fmt_patch_name_max <= strlen("0000-") + strlen(fmt_patch_suffix))
                fmt_patch_name_max = strlen("0000-") + strlen(fmt_patch_suffix);
index cf418a6b201e869e3484949969f0c8c4047db791..b7553e3fe09ddec3104f3b34adfd21189b84e261 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -480,6 +480,8 @@ end:
 static int use_in_body_from(const struct pretty_print_context *pp,
                            const struct ident_split *ident)
 {
+       if (pp->rev && pp->rev->force_in_body_from)
+               return 1;
        if (ident_cmp(pp->from_ident, ident))
                return 1;
        return 0;
index bb91e7ed9148644355e03e6b3190cebf767289a1..6e346a60aba382e039a883a9f6b1596b7980c7be 100644 (file)
@@ -221,6 +221,7 @@ struct rev_info {
                        missing_newline:1,
                        date_mode_explicit:1,
                        preserve_subject:1,
+                       force_in_body_from:1,
                        encode_email_headers:1,
                        include_header:1;
        unsigned int    disable_stdin:1;
index fbec8ad2ef7bb263765357c2f783448184c6b808..347f7f7f351836740f72ffec143d7be06c45ae19 100755 (executable)
@@ -1400,6 +1400,19 @@ test_expect_success '--from omits redundant in-body header' '
        test_cmp expect patch.head
 '
 
+test_expect_success 'with --force-in-body-from, redundant in-body from is kept' '
+       git format-patch --force-in-body-from \
+               -1 --stdout --from="A U Thor <author@example.com>" >patch &&
+       cat >expect <<-\EOF &&
+       From: A U Thor <author@example.com>
+
+       From: A U Thor <author@example.com>
+
+       EOF
+       sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head &&
+       test_cmp expect patch.head
+'
+
 test_expect_success 'in-body headers trigger content encoding' '
        test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
        test_when_finished "git reset --hard HEAD^" &&