1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-19 11:46:07 +02:00

format-patch: allow forcing the use of in-body From: header

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>
This commit is contained in:
Junio C Hamano 2022-08-29 14:38:36 -07:00
parent b84d013936
commit 34bc1b1045
5 changed files with 30 additions and 0 deletions

View 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 transformation for you, and this option should not be used if you are
feeding the result to `git send-email`. 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-header=<header>::
Add an arbitrary header to the email headers. This is in addition Add an arbitrary header to the email headers. This is in addition
to any configured headers, and may be used multiple times. to any configured headers, and may be used multiple times.

View File

@ -52,6 +52,7 @@ static int default_encode_email_headers = 1;
static int decoration_style; static int decoration_style;
static int decoration_given; static int decoration_given;
static int use_mailmap_config = 1; static int use_mailmap_config = 1;
static unsigned int force_in_body_from;
static const char *fmt_patch_subject_prefix = "PATCH"; static const char *fmt_patch_subject_prefix = "PATCH";
static int fmt_patch_name_max = FORMAT_PATCH_NAME_MAX_DEFAULT; static int fmt_patch_name_max = FORMAT_PATCH_NAME_MAX_DEFAULT;
static const char *fmt_pretty; 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")), N_("show changes against <refspec> in cover letter or single patch")),
OPT_INTEGER(0, "creation-factor", &creation_factor, OPT_INTEGER(0, "creation-factor", &creation_factor,
N_("percentage by which creation is weighted")), 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() 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_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_DASHDASH); PARSE_OPT_KEEP_DASHDASH);
rev.force_in_body_from = force_in_body_from;
/* Make sure "0000-$sub.patch" gives non-negative length for $sub */ /* Make sure "0000-$sub.patch" gives non-negative length for $sub */
if (fmt_patch_name_max <= strlen("0000-") + strlen(fmt_patch_suffix)) if (fmt_patch_name_max <= strlen("0000-") + strlen(fmt_patch_suffix))
fmt_patch_name_max = strlen("0000-") + strlen(fmt_patch_suffix); fmt_patch_name_max = strlen("0000-") + strlen(fmt_patch_suffix);

View File

@ -480,6 +480,8 @@ static void append_line_with_color(struct strbuf *sb, struct grep_opt *opt,
static int use_in_body_from(const struct pretty_print_context *pp, static int use_in_body_from(const struct pretty_print_context *pp,
const struct ident_split *ident) const struct ident_split *ident)
{ {
if (pp->rev && pp->rev->force_in_body_from)
return 1;
if (ident_cmp(pp->from_ident, ident)) if (ident_cmp(pp->from_ident, ident))
return 1; return 1;
return 0; return 0;

View File

@ -221,6 +221,7 @@ struct rev_info {
missing_newline:1, missing_newline:1,
date_mode_explicit:1, date_mode_explicit:1,
preserve_subject:1, preserve_subject:1,
force_in_body_from:1,
encode_email_headers:1, encode_email_headers:1,
include_header:1; include_header:1;
unsigned int disable_stdin:1; unsigned int disable_stdin:1;

View File

@ -1400,6 +1400,19 @@ test_expect_success '--from omits redundant in-body header' '
test_cmp expect patch.head 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_expect_success 'in-body headers trigger content encoding' '
test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic && test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
test_when_finished "git reset --hard HEAD^" && test_when_finished "git reset --hard HEAD^" &&