{"thread":{"id":"34332","subject":"[PATCH 0/2] format-patch handling in-body From headers","startedAt":"2013-07-03T07:07:20Z","lastAt":"2013-07-03T09:03:52Z","messageCount":6,"participants":["Jeff King","Eric Sunshine","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"222429","messageId":"20130703070719.GA17638@sigill.intra.peff.net","threadId":"34332","inReplyTo":null,"subject":"[PATCH 0/2] format-patch handling in-body From headers","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2013-07-03T07:07:20Z","receivedAt":"2013-07-03T07:07:20Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"As I've mentioned before on the list, I don't use git-send-email, but\nrather a home-grown script that interacts more closely with my regular\nMUA.  After embarrassing myself on multiple occasions by its inability\nto automatically handle sending patches by other authors, I decided to\nimplement send-email's \"stick the original author in a body header\"\nscheme.\n\nHowever, doing it right is kind of tricky due to rfc822 quoting, rfc2047\nencoding, and handling non-ascii names correctly. Instead, this patch\nseries takes a different approach: it teaches format-patch to do the\ntransformation itself, so that it can be used by my script along with\nany other non-send-email workflows that exist (e.g., git-imap-send\nsuffers from the same problem).\n\n  [1/2]: pretty.c: drop const-ness from pretty_print_context\n  [2/2]: teach format-patch to place other authors into in-body \"From\"\n\n-Peff\n"},{"id":"222430","messageId":"20130703070747.GA17730@sigill.intra.peff.net","threadId":"34332","inReplyTo":"20130703070719.GA17638@sigill.intra.peff.net","subject":"[PATCH 1/2] pretty.c: drop const-ness from pretty_print_context","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2013-07-03T07:07:48Z","receivedAt":"2013-07-03T07:07:48Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"In the current code, callers are expected to fill in the\npretty_print_context, and then the pretty.c functions simply\nread from it. This leaves no room for the pretty.c functions\nto communicate with each other by manipulating the context\n(e.g., data seen while printing the header may impact how we\nprint the body).\n\nRather than introduce a new struct to hold modifiable data,\nlet's just drop the const-ness of the existing context\nstruct.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n commit.h | 16 ++++++++++++----\n pretty.c | 10 +++++-----\n 2 files changed, 17 insertions(+), 9 deletions(-)\n\ndiff --git a/commit.h b/commit.h\nindex 6e9c7cd..2057201 100644\n--- a/commit.h\n+++ b/commit.h\n@@ -79,6 +79,9 @@ struct pretty_print_context {\n };\n \n struct pretty_print_context {\n+\t/*\n+\t * Callers should tweak these to change the behavior of pp_* functions.\n+\t */\n \tenum cmit_fmt fmt;\n \tint abbrev;\n \tconst char *subject;\n@@ -92,6 +95,11 @@ struct pretty_print_context {\n \tconst char *output_encoding;\n \tstruct string_list *mailmap;\n \tint color;\n+\n+\t/*\n+\t * Fields below here are manipulated internally by pp_* functions and\n+\t * should not be counted on by callers.\n+\t */\n };\n \n struct userformat_want {\n@@ -111,20 +119,20 @@ void pp_title_line(const struct pretty_print_context *pp,\n extern void format_commit_message(const struct commit *commit,\n \t\t\t\t  const char *format, struct strbuf *sb,\n \t\t\t\t  const struct pretty_print_context *context);\n-extern void pretty_print_commit(const struct pretty_print_context *pp,\n+extern void pretty_print_commit(struct pretty_print_context *pp,\n \t\t\t\tconst struct commit *commit,\n \t\t\t\tstruct strbuf *sb);\n extern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,\n \t\t\t   struct strbuf *sb);\n-void pp_user_info(const struct pretty_print_context *pp,\n+void pp_user_info(struct pretty_print_context *pp,\n \t\t  const char *what, struct strbuf *sb,\n \t\t  const char *line, const char *encoding);\n-void pp_title_line(const struct pretty_print_context *pp,\n+void pp_title_line(struct pretty_print_context *pp,\n \t\t   const char **msg_p,\n \t\t   struct strbuf *sb,\n \t\t   const char *encoding,\n \t\t   int need_8bit_cte);\n-void pp_remainder(const struct pretty_print_context *pp,\n+void pp_remainder(struct pretty_print_context *pp,\n \t\t  const char **msg_p,\n \t\t  struct strbuf *sb,\n \t\t  int indent);\ndiff --git a/pretty.c b/pretty.c\nindex 9e43154..68cd7a0 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -406,7 +406,7 @@ static const char *show_ident_date(const struct ident_split *ident,\n \treturn show_date(date, tz, mode);\n }\n \n-void pp_user_info(const struct pretty_print_context *pp,\n+void pp_user_info(struct pretty_print_context *pp,\n \t\t  const char *what, struct strbuf *sb,\n \t\t  const char *line, const char *encoding)\n {\n@@ -1514,7 +1514,7 @@ void format_commit_message(const struct commit *commit,\n \tfree(context.signature_check.signer);\n }\n \n-static void pp_header(const struct pretty_print_context *pp,\n+static void pp_header(struct pretty_print_context *pp,\n \t\t      const char *encoding,\n \t\t      const struct commit *commit,\n \t\t      const char **msg_p,\n@@ -1575,7 +1575,7 @@ static void pp_header(const struct pretty_print_context *pp,\n \t}\n }\n \n-void pp_title_line(const struct pretty_print_context *pp,\n+void pp_title_line(struct pretty_print_context *pp,\n \t\t   const char **msg_p,\n \t\t   struct strbuf *sb,\n \t\t   const char *encoding,\n@@ -1618,7 +1618,7 @@ void pp_title_line(const struct pretty_print_context *pp,\n \tstrbuf_release(&title);\n }\n \n-void pp_remainder(const struct pretty_print_context *pp,\n+void pp_remainder(struct pretty_print_context *pp,\n \t\t  const char **msg_p,\n \t\t  struct strbuf *sb,\n \t\t  int indent)\n@@ -1650,7 +1650,7 @@ void pp_remainder(const struct pretty_print_context *pp,\n \t}\n }\n \n-void pretty_print_commit(const struct pretty_print_context *pp,\n+void pretty_print_commit(struct pretty_print_context *pp,\n \t\t\t const struct commit *commit,\n \t\t\t struct strbuf *sb)\n {\n-- \n1.8.3.26.g3f85fc7\n"},{"id":"222431","messageId":"20130703070822.GB17730@sigill.intra.peff.net","threadId":"34332","inReplyTo":"20130703070719.GA17638@sigill.intra.peff.net","subject":"[PATCH 2/2] teach format-patch to place other authors into in-body \"From\"","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2013-07-03T07:08:22Z","receivedAt":"2013-07-03T07:08:22Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"Format-patch generates emails with the \"From\" address set to\nthe author of each patch. If you are going to send the\nemails, however, you would want to replace the author\nidentity with yours (if they are not the same), and bump the\nauthor identity to an in-body header.\n\nNormally this is handled by git-send-email, which does the\ntransformation before sending out the emails. However, some\nworkflows may not use send-email (e.g., imap-send, or a\ncustom script which feeds the mbox to a non-git MUA). They\ncould each implement this feature themselves, but getting it\nright is non-trivial (one most canonicalize the identities\nby reversing any RFC2047 encoding or RFC822 quoting of the\nheaders, which has caused many bugs in send-email over the\nyears).\n\nThis patch takes a different approach: it teaches\nformat-patch a \"--from\" option which handles the ident\ncheck and in-body header while it is writing out the email.\nIt's much simpler to do at this level (because we haven't\ndone any quoting yet), and any workflow based on\nformat-patch can easily turn it on.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n Documentation/git-format-patch.txt | 15 +++++++++++++\n builtin/log.c                      | 24 +++++++++++++++++++++\n commit.h                           |  5 +++++\n log-tree.c                         |  2 ++\n pretty.c                           | 38 +++++++++++++++++++++++++++++++++\n revision.h                         |  1 +\n t/t4014-format-patch.sh            | 43 ++++++++++++++++++++++++++++++++++++++\n 7 files changed, 128 insertions(+)\n\ndiff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt\nindex 3911877..e394276 100644\n--- a/Documentation/git-format-patch.txt\n+++ b/Documentation/git-format-patch.txt\n@@ -187,6 +187,21 @@ will want to ensure that threading is disabled for `git send-email`.\n \tThe negated form `--no-cc` discards all `Cc:` headers added so\n \tfar (from config or command line).\n \n+--from::\n+--from=<ident>::\n+\tUse `ident` in the `From:` header of each commit email. If the\n+\tauthor ident of the commit is not textually identical to the\n+\tprovided `ident`, place a `From:` header in the body of the\n+\tmessage with the original author. If no `ident` is given, use\n+\tthe committer ident.\n++\n+Note that this option is only useful if you are actually sending the\n+emails and want to identify yourself as the sender, but retain the\n+original author (and `git am` will correctly pick up the in-body\n+header). Note also that `git send-email` already handles this\n+transformation for you, and this option should not be used if you are\n+feeding the result to `git send-email`.\n+\n --add-header=<header>::\n \tAdd an arbitrary header to the email headers.  This is in addition\n \tto any configured headers, and may be used multiple times.\ndiff --git a/builtin/log.c b/builtin/log.c\nindex 9e21232..14e60ae 100644\n--- a/builtin/log.c\n+++ b/builtin/log.c\n@@ -1112,6 +1112,21 @@ static int cc_callback(const struct option *opt, const char *arg, int unset)\n \treturn 0;\n }\n \n+static int from_callback(const struct option *opt, const char *arg, int unset)\n+{\n+\tchar **from = opt->value;\n+\n+\tfree(*from);\n+\n+\tif (unset)\n+\t\t*from = NULL;\n+\telse if (arg)\n+\t\t*from = xstrdup(arg);\n+\telse\n+\t\t*from = xstrdup(git_committer_info(IDENT_NO_DATE));\n+\treturn 0;\n+}\n+\n int cmd_format_patch(int argc, const char **argv, const char *prefix)\n {\n \tstruct commit *commit;\n@@ -1134,6 +1149,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \tint quiet = 0;\n \tint reroll_count = -1;\n \tchar *branch_name = NULL;\n+\tchar *from = NULL;\n \tconst struct option builtin_format_patch_options[] = {\n \t\t{ OPTION_CALLBACK, 'n', \"numbered\", &numbered, NULL,\n \t\t\t    N_(\"use [PATCH n/m] even with a single patch\"),\n@@ -1177,6 +1193,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \t\t\t    0, to_callback },\n \t\t{ OPTION_CALLBACK, 0, \"cc\", NULL, N_(\"email\"), N_(\"add Cc: header\"),\n \t\t\t    0, cc_callback },\n+\t\t{ OPTION_CALLBACK, 0, \"from\", &from, N_(\"ident\"),\n+\t\t\t    N_(\"set From address to <ident> (or committer ident if absent)\"),\n+\t\t\t    PARSE_OPT_OPTARG, from_callback },\n \t\tOPT_STRING(0, \"in-reply-to\", &in_reply_to, N_(\"message-id\"),\n \t\t\t    N_(\"make first mail a reply to <message-id>\")),\n \t\t{ OPTION_CALLBACK, 0, \"attach\", &rev, N_(\"boundary\"),\n@@ -1264,6 +1283,11 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \n \trev.extra_headers = strbuf_detach(&buf, NULL);\n \n+\tif (from) {\n+\t\tif (split_ident_line(&rev.from_ident, from, strlen(from)))\n+\t\t\tdie(_(\"invalid ident line: %s\"), from);\n+\t}\n+\n \tif (start_number < 0)\n \t\tstart_number = 1;\n \ndiff --git a/commit.h b/commit.h\nindex 2057201..92c1d23 100644\n--- a/commit.h\n+++ b/commit.h\n@@ -6,6 +6,7 @@\n #include \"strbuf.h\"\n #include \"decorate.h\"\n #include \"gpg-interface.h\"\n+#include \"string-list.h\"\n \n struct commit_list {\n \tstruct commit *item;\n@@ -95,11 +96,15 @@ struct pretty_print_context {\n \tconst char *output_encoding;\n \tstruct string_list *mailmap;\n \tint color;\n+\tstruct ident_split *from_ident;\n \n \t/*\n \t * Fields below here are manipulated internally by pp_* functions and\n \t * should not be counted on by callers.\n \t */\n+\n+\t/* Manipulated by the pp_* functions internally. */\n+\tstruct string_list in_body_headers;\n };\n \n struct userformat_want {\ndiff --git a/log-tree.c b/log-tree.c\nindex 2eb69bc..67da27f 100644\n--- a/log-tree.c\n+++ b/log-tree.c\n@@ -617,6 +617,8 @@ void show_log(struct rev_info *opt)\n \tctx.fmt = opt->commit_format;\n \tctx.mailmap = opt->mailmap;\n \tctx.color = opt->diffopt.use_color;\n+\tif (opt->from_ident.mail_begin && opt->from_ident.name_begin)\n+\t\tctx.from_ident = &opt->from_ident;\n \tpretty_print_commit(&ctx, commit, &msgbuf);\n \n \tif (opt->add_signoff)\ndiff --git a/pretty.c b/pretty.c\nindex 68cd7a0..74563c9 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -432,6 +432,23 @@ void pp_user_info(struct pretty_print_context *pp,\n \t\tmap_user(pp->mailmap, &mailbuf, &maillen, &namebuf, &namelen);\n \n \tif (pp->fmt == CMIT_FMT_EMAIL) {\n+\t\tif (pp->from_ident) {\n+\t\t\tstruct strbuf buf = STRBUF_INIT;\n+\n+\t\t\tstrbuf_addstr(&buf, \"From: \");\n+\t\t\tstrbuf_add(&buf, namebuf, namelen);\n+\t\t\tstrbuf_addstr(&buf, \" <\");\n+\t\t\tstrbuf_add(&buf, mailbuf, maillen);\n+\t\t\tstrbuf_addstr(&buf, \">\\n\");\n+\t\t\tstring_list_append(&pp->in_body_headers,\n+\t\t\t\t\t   strbuf_detach(&buf, NULL));\n+\n+\t\t\tmailbuf = pp->from_ident->mail_begin;\n+\t\t\tmaillen = pp->from_ident->mail_end - mailbuf;\n+\t\t\tnamebuf = pp->from_ident->name_begin;\n+\t\t\tnamelen = pp->from_ident->name_end - namebuf;\n+\t\t}\n+\n \t\tstrbuf_addstr(sb, \"From: \");\n \t\tif (needs_rfc2047_encoding(namebuf, namelen, RFC2047_ADDRESS)) {\n \t\t\tadd_rfc2047(sb, namebuf, namelen,\n@@ -1602,6 +1619,16 @@ void pp_title_line(struct pretty_print_context *pp,\n \t}\n \tstrbuf_addch(sb, '\\n');\n \n+\tif (need_8bit_cte == 0) {\n+\t\tint i;\n+\t\tfor (i = 0; i < pp->in_body_headers.nr; i++) {\n+\t\t\tif (has_non_ascii(pp->in_body_headers.items[i].string)) {\n+\t\t\t\tneed_8bit_cte = 1;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n \tif (need_8bit_cte > 0) {\n \t\tconst char *header_fmt =\n \t\t\t\"MIME-Version: 1.0\\n\"\n@@ -1615,6 +1642,17 @@ void pp_title_line(struct pretty_print_context *pp,\n \tif (pp->fmt == CMIT_FMT_EMAIL) {\n \t\tstrbuf_addch(sb, '\\n');\n \t}\n+\n+\tif (pp->in_body_headers.nr) {\n+\t\tint i;\n+\t\tfor (i = 0; i < pp->in_body_headers.nr; i++) {\n+\t\t\tstrbuf_addstr(sb, pp->in_body_headers.items[i].string);\n+\t\t\tfree(pp->in_body_headers.items[i].string);\n+\t\t}\n+\t\tstring_list_clear(&pp->in_body_headers, 0);\n+\t\tstrbuf_addch(sb, '\\n');\n+\t}\n+\n \tstrbuf_release(&title);\n }\n \ndiff --git a/revision.h b/revision.h\nindex eeea6fb..7e3a185 100644\n--- a/revision.h\n+++ b/revision.h\n@@ -140,6 +140,7 @@ struct rev_info {\n \tint\t\tnumbered_files;\n \tint\t\treroll_count;\n \tchar\t\t*message_id;\n+\tstruct ident_split from_ident;\n \tstruct string_list *ref_message_ids;\n \tint\t\tadd_signoff;\n \tconst char\t*extra_headers;\ndiff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh\nindex 58d4180..668933b 100755\n--- a/t/t4014-format-patch.sh\n+++ b/t/t4014-format-patch.sh\n@@ -972,6 +972,49 @@ test_expect_success 'empty subject prefix does not have extra space' '\n \ttest_cmp expect actual\n '\n \n+test_expect_success '--from=ident notices bogus ident' '\n+\ttest_must_fail git format-patch -1 --stdout --from=foo >patch\n+'\n+\n+test_expect_success '--from=ident replaces author' '\n+\tgit format-patch -1 --stdout --from=\"Me <me@example.com>\" >patch &&\n+\tcat >expect <<-\\EOF &&\n+\tFrom: Me <me@example.com>\n+\n+\tFrom: A U Thor <author@example.com>\n+\n+\tEOF\n+\tsed -ne \"/^From:/p; /^$/p; /^---$/q\" <patch >patch.head &&\n+\ttest_cmp expect patch.head\n+'\n+\n+test_expect_success '--from uses committer ident' '\n+\tgit format-patch -1 --stdout --from >patch &&\n+\tcat >expect <<-\\EOF &&\n+\tFrom: C O Mitter <committer@example.com>\n+\n+\tFrom: A U Thor <author@example.com>\n+\n+\tEOF\n+\tsed -ne \"/^From:/p; /^$/p; /^---$/q\" <patch >patch.head &&\n+\ttest_cmp expect patch.head\n+'\n+\n+test_expect_success 'in-body headers trigger content encoding' '\n+\tGIT_AUTHOR_NAME=\"éxötìc\" test_commit exotic &&\n+\ttest_when_finished \"git reset --hard HEAD^\" &&\n+\tgit format-patch -1 --stdout --from >patch &&\n+\tcat >expect <<-\\EOF &&\n+\tFrom: C O Mitter <committer@example.com>\n+\tContent-Type: text/plain; charset=UTF-8\n+\n+\tFrom: éxötìc <author@example.com>\n+\n+\tEOF\n+\tsed -ne \"/^From:/p; /^$/p; /^Content-Type/p; /^---$/q\" <patch >patch.head &&\n+\ttest_cmp expect patch.head\n+'\n+\n append_signoff()\n {\n \tC=$(git commit-tree HEAD^^{tree} -p HEAD) &&\n-- \n1.8.3.26.g3f85fc7\n"},{"id":"222432","messageId":"CAPig+cTMUrofUon85rZLw+NALQ5+agTRZW0UWYeBCutd_BPzwQ@mail.gmail.com","threadId":"34332","inReplyTo":"20130703070822.GB17730@sigill.intra.peff.net","subject":"Re: [PATCH 2/2] teach format-patch to place other authors into in-body \"From\"","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-07-03T07:21:28Z","receivedAt":"2013-07-03T07:21:28Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Wed, Jul 3, 2013 at 3:08 AM, Jeff King <peff@peff.net> wrote:\n> Format-patch generates emails with the \"From\" address set to\n> the author of each patch. If you are going to send the\n> emails, however, you would want to replace the author\n> identity with yours (if they are not the same), and bump the\n> author identity to an in-body header.\n>\n> Normally this is handled by git-send-email, which does the\n> transformation before sending out the emails. However, some\n> workflows may not use send-email (e.g., imap-send, or a\n> custom script which feeds the mbox to a non-git MUA). They\n> could each implement this feature themselves, but getting it\n> right is non-trivial (one most canonicalize the identities\n\ns/most/must/\n\n> by reversing any RFC2047 encoding or RFC822 quoting of the\n> headers, which has caused many bugs in send-email over the\n> years).\n>\n> This patch takes a different approach: it teaches\n> format-patch a \"--from\" option which handles the ident\n> check and in-body header while it is writing out the email.\n> It's much simpler to do at this level (because we haven't\n> done any quoting yet), and any workflow based on\n> format-patch can easily turn it on.\n>\n> Signed-off-by: Jeff King <peff@peff.net>\n"},{"id":"222444","messageId":"7vd2r0ggup.fsf@alter.siamese.dyndns.org","threadId":"34332","inReplyTo":"20130703070719.GA17638@sigill.intra.peff.net","subject":"Re: [PATCH 0/2] format-patch handling in-body From headers","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-07-03T08:58:22Z","receivedAt":"2013-07-03T08:58:22Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> However, doing it right is kind of tricky due to rfc822 quoting, rfc2047\n> encoding, and handling non-ascii names correctly. Instead, this patch\n> series takes a different approach: it teaches format-patch to do the\n> transformation itself, so that it can be used by my script along with\n> any other non-send-email workflows that exist (e.g., git-imap-send\n> suffers from the same problem).\n\nI think the original expectation when format-patch was done was to\nuse Sender: to identify you while keeping the author on From:, but\nwith the current world order to use in-body header, this addition\nmakes sense.\n\nI wonder if we can lose some code from send-email then?\n"},{"id":"222446","messageId":"20130703090352.GA20749@sigill.intra.peff.net","threadId":"34332","inReplyTo":"7vd2r0ggup.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 0/2] format-patch handling in-body From headers","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2013-07-03T09:03:52Z","receivedAt":"2013-07-03T09:03:52Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Jul 03, 2013 at 01:58:22AM -0700, Junio C Hamano wrote:\n\n> Jeff King <peff@peff.net> writes:\n> \n> > However, doing it right is kind of tricky due to rfc822 quoting, rfc2047\n> > encoding, and handling non-ascii names correctly. Instead, this patch\n> > series takes a different approach: it teaches format-patch to do the\n> > transformation itself, so that it can be used by my script along with\n> > any other non-send-email workflows that exist (e.g., git-imap-send\n> > suffers from the same problem).\n> \n> I think the original expectation when format-patch was done was to\n> use Sender: to identify you while keeping the author on From:, but\n> with the current world order to use in-body header, this addition\n> makes sense.\n\nYeah, I think using \"Sender\" would simply be too confusing, as most MUAs\nshow only the \"From\", and authors of patches do not necessarily know or\ncare about the mailing of their patch. \n\n> I wonder if we can lose some code from send-email then?\n\nPotentially, as long as we default to \"--from\" to turn this feature on\nall the time (otherwise we are breaking the existing \"format-patch &&\nsend-email\" workflow).\n\nIt may also confuse people who mark up the patches on disk before\nrunning send-email. I don't know if people actually change the From\nheader there or not.\n\n-Peff\n"}]}