From: Tom Russello <[email protected]>
---
Documentation/git-send-email.txt | 4 +-
git-send-email.perl | 80 ++++++++++++++++++++++++++++++++++++++--
t/t9001-send-email.sh | 19 +++++++++-
3 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 710b5ff32..329af66af 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -107,7 +107,9 @@ Only necessary if --compose is also set. If --compose
is not set, this will be prompted for.
--quote-email=<email_file>::
- Fill appropriately header fields for the reply to the given email.
+ Fill appropriately header fields for the reply to the given email and
quote
+ the message body in the cover letter if `--compose` is set or otherwise
+ after the triple-dash in the first patch given.
--subject=<string>::
Specify the initial subject of the email thread.
diff --git a/git-send-email.perl b/git-send-email.perl
index 665c47d15..6f6995c9d 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -26,6 +26,7 @@ use Text::ParseWords;
use Term::ANSIColor;
use File::Temp qw/ tempdir tempfile /;
use File::Spec::Functions qw(catdir catfile);
+use File::Copy;
use Error qw(:try);
use Cwd qw(abs_path cwd);
use Git;
@@ -57,7 +58,8 @@ git send-email --dump-aliases
--[no-]bcc <str> * Email Bcc:
--subject <str> * Email "Subject:"
--in-reply-to <str> * Email "In-Reply-To:"
- --quote-email <file> * Populate header fields appropriately.
+ --quote-email <file> * Populate header fields appropriately and
+ quote the message body.
--[no-]xmailer * Add "X-Mailer:" header (default).
--[no-]annotate * Review each patch that will be sent in an
editor.
--compose * Open an editor for introduction.
@@ -654,12 +656,15 @@ if (@files) {
usage();
}
+my $message_quoted;
if ($quote_email) {
my $error = validate_patch($quote_email);
die "fatal: $quote_email: $error\nwarning: no patches were sent\n"
if $error;
my @header = ();
+ my $date;
+ my $recipient;
open my $fh, "<", $quote_email or die "can't open file $quote_email";
@@ -691,7 +696,8 @@ if ($quote_email) {
}
$initial_subject = $prefix_re . $subject_re;
} elsif (/^From:\s+(.*)$/i) {
- push @initial_to, $1;
+ $recipient = $1;
+ push @initial_to, $recipient;
} elsif (/^To:\s+(.*)$/i) {
foreach my $addr (parse_address_line($1)) {
if (!($addr eq $initial_sender)) {
@@ -713,9 +719,28 @@ if ($quote_email) {
$initial_reply_to = $1;
} elsif (/^References:\s+(.*)/i) {
$initial_references = $1;
+ } elsif (/^Date: (.*)/i) {
+ $date = $1;
}
}
$initial_references = $initial_references . $initial_reply_to;
+
+ my $tpl_date = $date && "On $date, " || '';
+ $message_quoted = $tpl_date . $recipient . " wrote:\n";
+
+ # Quote the message body
+ while (<$fh>) {
+ # Turn crlf line endings into lf-only
+ s/\r//g;
+ my $space = "";
+ if (/^[^>]/) {
+ $space = " ";
+ }
+ $message_quoted .= ">" . $space . $_;
+ }
+ if (!$compose) {
+ $annotate = 1;
+ }
}
sub get_patch_subject {
@@ -743,6 +768,9 @@ if ($compose) {
my $tpl_sender = $sender || $repoauthor || $repocommitter || '';
my $tpl_subject = $initial_subject || '';
my $tpl_reply_to = $initial_reply_to || '';
+ my $tpl_quote = $message_quoted &&
+ "\nGIT: Please, trim down irrelevant sections in the quoted
message\n".
+ "GIT: to keep your email concise.\n" . $message_quoted || '';
print $c <<EOT1, Git::prefix_lines("GIT: ", __ <<EOT2), <<EOT3;
From $tpl_sender # This line is ignored.
@@ -756,7 +784,7 @@ EOT2
From: $tpl_sender
Subject: $tpl_subject
In-Reply-To: $tpl_reply_to
-
+$tpl_quote
EOT3
for my $f (@files) {
print $c get_patch_subject($f);
@@ -821,9 +849,53 @@ EOT3
$compose = -1;
}
} elsif ($annotate) {
- do_edit(@files);
+ if ($quote_email) {
+ my $quote_email_filename = ($repo ?
+ tempfile(".gitsendemail.msg.XXXXXX",
+ DIR => $repo->repo_path()) :
+ tempfile(".gitsendemail.msg.XXXXXX",
+ DIR => "."))[1];
+
+ # Insertion in a temporary file to keep the original file clean
+ # in case of cancellation/error.
+ do_insert_quoted_message($quote_email_filename, $files[0]);
+
+ my $tmp = $files[0];
+ $files[0] = $quote_email_filename;
+
+ do_edit(@files);
+
+ # Erase the original patch if the edition went well
+ move($quote_email_filename, $tmp);
+ $files[0] = $tmp;
+ } else {
+ do_edit(@files);
+ }
}
+sub do_insert_quoted_message {
+ my $tmp_file = shift;
+ my $original_file = shift;
+
+ open my $c, "<", $original_file
+ or die "Failed to open $original_file: " . $!;
+
+ open my $c2, ">", $tmp_file
+ or die "Failed to open $tmp_file: " . $!;
+
+ # Insertion after the triple-dash
+ while (<$c>) {
+ print $c2 $_;
+ last if (/^---$/);
+ }
+ print $c2 $message_quoted;
+ while (<$c>) {
+ print $c2 $_;
+ }
+
+ close $c;
+ close $c2;
+}
sub ask {
my ($prompt, %arg) = @_;
my $valid_re = $arg{valid_re};
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index ce12a1164..7c29c829d 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1941,7 +1941,7 @@ test_expect_success $PREREQ 'Fields with --quote-email
are correct' '
--quote-email=email \
--from="Example <[email protected]>" \
--smtp-server="$(pwd)/fake.sendmail" \
- -1 \
+ -2 \
2>errors &&
grep "From: Example <[email protected]>" msgtxt1 &&
grep "In-Reply-To: <[email protected]>" msgtxt1 &&
@@ -1961,6 +1961,17 @@ test_expect_success $PREREQ 'Fields with --quote-email
are correct' '
echo "$ref_adr" | grep -v "References: <[email protected]>"
'
+test_expect_success $PREREQ 'correct quoted message with --quote-email' '
+ msg_quoted=$(grep -A 3 "^---$" msgtxt1) &&
+ echo "$msg_quoted" | grep "On Sat, 12 Jun 2010 15:53:58 +0200,
[email protected] wrote:" &&
+ echo "$msg_quoted" | grep "> Have you seen my previous email?" &&
+ echo "$msg_quoted" | grep ">> Previous content"
+'
+
+test_expect_success $PREREQ 'second patch body is not modified by
--quote-email' '
+ ! grep "Have you seen my previous email?" msgtxt2
+'
+
test_expect_success $PREREQ 'Fields with --quote-email and --compose are
correct' '
clean_fake_sendmail &&
git send-email \
@@ -2000,4 +2011,10 @@ test_expect_success $PREREQ 'Re: written only once with
--quote-email and --comp
grep "Subject: Re: subject goes here" msgtxt3
'
+test_expect_success $PREREQ 'correct quoted message with --quote-email and
--compose' '
+ grep "> On Sat, 12 Jun 2010 15:53:58 +0200, [email protected] wrote:"
msgtxt3 &&
+ grep ">> Have you seen my previous email?" msgtxt3 &&
+ grep ">>> Previous content" msgtxt3
+'
+
test_done
--
2.14.2