[PATCH] git-send-email: add option for output in mbox format
- Date: Fri, 16 May 2008 17:23:20 +0200
- From: Robert Richter <robert.richter@xxxxxxx>
- Subject: [PATCH] git-send-email: add option for output in mbox format
This patch adds an option for output in mbox format. Instead of
sending, all messages are printed to standard out in mbox format.
Example:
git-send-email --mbox --compose --no-chain-reply-to patches > patches.mbox
Signed-off-by: Robert Richter <robert.richter@xxxxxxx>
---
Documentation/git-send-email.txt | 4 ++
git-send-email.perl | 57 ++++++++++++++++++++++++++++++++------
2 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 9d0a10c..1f1a06f 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -81,6 +81,10 @@ The --cc option must be repeated for each user you want on the cc list.
values in the 'sendemail' section. The default identity is
the value of 'sendemail.identity'.
+--mbox::
+ Print all messages to the standard output in mbox format,
+ instead of sending each one.
+
--smtp-server::
If set, specifies the outgoing SMTP server to use (e.g.
`smtp.example.com` or a raw IP address). Alternatively it can
diff --git a/git-send-email.perl b/git-send-email.perl
index 1e1d986..48ac994 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -7,6 +7,8 @@
#
# Ported to support git "mbox" format files by Ryan Anderson <ryan@xxxxxxxxxxxxxx>
#
+# Support of mbox output format by Robert Richter <robert.richter@xxxxxxx>
+#
# Sends a collection of emails to the given email addresses, disturbingly fast.
#
# Supports two formats:
@@ -74,6 +76,9 @@ Options:
--identity The configuration identity, a subsection to prioritise over
the default section.
+ --mbox Print all messages to the standard output in mbox format,
+ instead of sending each one.
+
--smtp-server If set, specifies the outgoing SMTP server to use.
Defaults to localhost. Port number can be specified here with
hostname:port format or by using --smtp-server-port option.
@@ -149,6 +154,12 @@ sub format_2822_time {
);
}
+sub format_2822_to_ctime {
+ my $date = shift;
+ $date =~ s/(\w{3}), (\d{2}) (\w{3}) (\d{4}) (\d\d:\d\d:\d\d)/$1 $3 $2 $5 $4/;
+ return $date;
+}
+
my $have_email_valid = eval { require Email::Valid; 1 };
my $smtp;
my $auth;
@@ -180,7 +191,7 @@ if ($@) {
}
# Behavior modification variables
-my ($quiet, $dry_run) = (0, 0);
+my ($mbox, $quiet, $dry_run) = (0, 0, 0);
# Variables with corresponding config settings
my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc, $cc_cmd);
@@ -244,6 +255,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
"cc=s" => \@initial_cc,
"bcc=s" => \@bcclist,
"chain-reply-to!" => \$chain_reply_to,
+ "mbox" => \$mbox,
"smtp-server=s" => \$smtp_server,
"smtp-server-port=s" => \$smtp_server_port,
"smtp-user=s" => \$smtp_authuser,
@@ -408,7 +420,7 @@ if (!$no_validate) {
}
if (@files) {
- unless ($quiet) {
+ unless ($quiet || $mbox) {
print $_,"\n" for (@files);
}
} else {
@@ -427,7 +439,7 @@ if (!defined $sender) {
}
$sender = $_ if ($_);
- print "Emails will be sent from: ", $sender, "\n";
+ print ("Emails will be sent from: ", $sender, "\n") unless $mbox;
$prompting++;
}
@@ -512,8 +524,20 @@ GIT: for the patch you are writing.
EOT
close(C);
+ # Open editor in console
my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi";
+ my ($console, $consoleOUT) = $term->findConsole;
+ open(COPYIN, "<&STDIN");
+ open(COPYOUT, ">&STDOUT");
+ open(STDIN, "<$console");
+ open(STDOUT, ">$consoleOUT");
system('sh', '-c', $editor.' "$@"', $editor, $compose_filename);
+ close(STDOUT);
+ close(STDIN);
+ open(STDIN, "<©IN");
+ open(STDOUT, ">©OUT");
+ close(COPYOUT);
+ close(COPYIN);
open(C2,">",$compose_filename . ".final")
or die "Failed to open $compose_filename.final : " . $!;
@@ -692,7 +716,12 @@ X-Mailer: git-send-email $gitversion
unshift (@sendmail_parameters,
'-f', $raw_from) if(defined $envelope_sender);
- if ($dry_run) {
+ if ($mbox) {
+ # print to stdout in mbox format
+ printf ("From %s %s\n", $raw_from, format_2822_to_ctime($date));
+ print ("$header\n");
+ print escape_from($message);
+ } elsif ($dry_run) {
# We don't want to send the email.
} elsif ($smtp_server =~ m#^/#) {
my $pid = open my $sm, '|-';
@@ -751,7 +780,10 @@ X-Mailer: git-send-email $gitversion
$smtp->dataend() or die $smtp->message;
$smtp->ok or die "Failed to send $subject\n".$smtp->message;
}
- if ($quiet) {
+ if ($mbox) {
+ # Nop
+ ;
+ } elsif ($quiet) {
printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
} else {
print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
@@ -815,7 +847,7 @@ foreach my $t (@files) {
next if ($suppress_cc{'cc'});
}
printf("(mbox) Adding cc: %s from line '%s'\n",
- $2, $_) unless $quiet;
+ $2, $_) unless ($quiet || $mbox);
push @cc, $2;
}
elsif (/^Content-type:/i) {
@@ -841,7 +873,7 @@ foreach my $t (@files) {
$input_format = 'lots';
if (@cc == 0 && !$suppress_cc{'cc'}) {
printf("(non-mbox) Adding cc: %s from line '%s'\n",
- $_, $_) unless $quiet;
+ $_, $_) unless ($quiet || $mbox);
push @cc, $_;
@@ -864,7 +896,7 @@ foreach my $t (@files) {
next if ($c eq $sender and $suppress_cc{'self'});
push @cc, $c;
printf("(sob) Adding cc: %s from line '%s'\n",
- $c, $_) unless $quiet;
+ $c, $_) unless ($quiet || $mbox);
}
}
}
@@ -880,7 +912,7 @@ foreach my $t (@files) {
next if ($c eq $sender and $suppress_from);
push @cc, $c;
printf("(cc-cmd) Adding cc: %s from: '%s'\n",
- $c, $cc_cmd) unless $quiet;
+ $c, $cc_cmd) unless ($quiet || $mbox);
}
close F
or die "(cc-cmd) failed to close pipe to '$cc_cmd'";
@@ -959,3 +991,10 @@ sub validate_patch {
}
return undef;
}
+
+# credits to Mail::Internet
+sub escape_from {
+ my $body = shift;
+ $body =~ s/\A(>*From) />$1 /og;
+ return $body;
+}
--
1.5.3.7
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html