From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: * X-Spam-ASN: AS54825 147.75.192.0/21 X-Spam-Status: No, score=1.1 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,LIST_MIRROR_RECEIVED,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS shortcircuit=no autolearn=no autolearn_force=no version=3.4.6 Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org [147.75.199.223]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id ADA8D1F406 for ; Fri, 20 Oct 2023 10:15:36 +0000 (UTC) Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id E0F2A1C2102C for ; Fri, 20 Oct 2023 10:15:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 49CAA16433; Fri, 20 Oct 2023 10:15:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=none Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 106F015E9A for ; Fri, 20 Oct 2023 10:15:27 +0000 (UTC) Received: from cloud.peff.net (cloud.peff.net [104.130.231.41]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44604B6 for ; Fri, 20 Oct 2023 03:15:26 -0700 (PDT) Received: (qmail 15433 invoked by uid 109); 20 Oct 2023 10:15:25 -0000 Received: from Unknown (HELO peff.net) (10.0.1.2) by cloud.peff.net (qpsmtpd/0.94) with ESMTP; Fri, 20 Oct 2023 10:15:25 +0000 Authentication-Results: cloud.peff.net; auth=none Received: (qmail 12759 invoked by uid 111); 20 Oct 2023 10:15:30 -0000 Received: from coredump.intra.peff.net (HELO coredump.intra.peff.net) (10.0.0.2) by peff.net (qpsmtpd/0.94) with (TLS_AES_256_GCM_SHA384 encrypted) ESMTPS; Fri, 20 Oct 2023 06:15:30 -0400 Authentication-Results: peff.net; auth=none Date: Fri, 20 Oct 2023 06:15:24 -0400 From: Jeff King To: Michael Strawbridge Cc: Junio C Hamano , Bagas Sanjaya , Git Mailing List Subject: [PATCH 3/3] send-email: handle to/cc/bcc from --compose message Message-ID: <20231020101524.GA2673857@coredump.intra.peff.net> References: <20231020100343.GA2194322@coredump.intra.peff.net> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20231020100343.GA2194322@coredump.intra.peff.net> List-Unsubscribe-Post: List-Unsubscribe=One-Click If the user writes a message via --compose, send-email will pick up varius headers like "From", "Subject", etc and use them for other patches as if they were specified on the command-line. But we don't handle "To", "Cc", or "Bcc" this way; we just tell the user "those aren't interpeted yet" and ignore them. But it seems like an obvious thing to want, especially as the same feature exists when the cover letter is generated separately by format-patch. There it is gated behind the --to-cover option, but I don't think we'd need the same control here; since we generate the --compose template ourselves based on the existing input, if the user leaves the lines unchanged then the behavior remains the same. So let's fill in the implementation; like those other headers we already handle, we just need to assign to the initial_* variables. The only difference in this case is that they are arrays, so we'll feed them through parse_address_line() to split them (just like we would when reading a single string via prompting). Signed-off-by: Jeff King --- Documentation/git-send-email.txt | 11 ++++++----- git-send-email.perl | 16 ++++++++++++++-- t/t9001-send-email.sh | 16 +++++++++++----- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 021276329c..f4d7166275 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -68,11 +68,12 @@ This option may be specified multiple times. Invoke a text editor (see GIT_EDITOR in linkgit:git-var[1]) to edit an introductory message for the patch series. + -When `--compose` is used, git send-email will use the From, Subject, -Reply-To, and In-Reply-To headers specified in the message. If the body -of the message (what you type after the headers and a blank line) only -contains blank (or Git: prefixed) lines, the summary won't be sent, but -the headers mentioned above will be used unless they are removed. +When `--compose` is used, git send-email will use the From, To, Cc, Bcc, +Subject, Reply-To, and In-Reply-To headers specified in the message. If +the body of the message (what you type after the headers and a blank +line) only contains blank (or Git: prefixed) lines, the summary won't be +sent, but the headers mentioned above will be used unless they are +removed. + Missing From or In-Reply-To headers will be prompted for. + diff --git a/git-send-email.perl b/git-send-email.perl index bbda2a931b..9e21b0b3f4 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -861,6 +861,9 @@ sub get_patch_subject { my $tpl_subject = $initial_subject || ''; my $tpl_in_reply_to = $initial_in_reply_to || ''; my $tpl_reply_to = $reply_to || ''; + my $tpl_to = join(',', @initial_to); + my $tpl_cc = join(',', @initial_cc); + my $tpl_bcc = join(', ', @initial_bcc); print $c <"$1.tmp" && + sed "s/^To: .*/&, edited-to@example.com/" <"$1" >"$1.tmp" && echo this is the body >>"$1.tmp" && mv "$1.tmp" "$1" EOF @@ -2534,10 +2534,16 @@ test_expect_success $PREREQ '--compose handles to headers' ' --to=nobody@example.com \ --smtp-server="$(pwd)/fake.sendmail" \ HEAD^ && - # Ideally the "to" header we specified would be used, - # but the program explicitly warns that these are - # ignored. For now, just make sure we did not abort. - grep "To:" msgtxt1 + # Check both that the cover letter used our modified "to" line, + # but also that it was picked up for the patch. + q_to_tab >expect <<-\EOF && + To: nobody@example.com, + Qedited-to@example.com + EOF + grep -A1 "^To:" msgtxt1 >msgtxt1.to && + test_cmp expect msgtxt1.to && + grep -A1 "^To:" msgtxt2 >msgtxt2.to && + test_cmp expect msgtxt2.to ' test_done -- 2.42.0.980.g8b5f6199be