From: Vitaly Mayatskikh <v.mayatskih@gmail.com>
To: git@vger.kernel.org
Subject: [PATCH] git-send-email: parse all messages in mbox
Date: Mon, 11 May 2009 15:46:51 +0200 [thread overview]
Message-ID: <873abbeoqc.wl%vmayatsk@redhat.com> (raw)
Currently git-send-email sends all mbox in one email. This seems to be wrong,
because mbox can contain several messages. For example,
`git format-patch --stdout' forms mbox file with all patches in it.
This patch allows git send-email to send several messages from one mbox
separately.
Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com>
---
git-send-email.perl | 278 ++++++++++++++++++++++++++-------------------------
1 files changed, 141 insertions(+), 137 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index cccbf45..614fcbd 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -984,168 +984,172 @@ $message_num = 0;
foreach my $t (@files) {
open(F,"<",$t) or die "can't open file $t";
- my $author = undef;
- my $author_encoding;
- my $has_content_type;
- my $body_encoding;
- @cc = ();
- @xh = ();
- my $input_format = undef;
- my @header = ();
- $message = "";
- $message_num++;
- # First unfold multiline header fields
- while(<F>) {
- last if /^\s*$/;
- if (/^\s+\S/ and @header) {
- chomp($header[$#header]);
- s/^\s+/ /;
- $header[$#header] .= $_;
- } else {
- push(@header, $_);
- }
- }
- # Now parse the header
- foreach(@header) {
- if (/^From /) {
- $input_format = 'mbox';
- next;
- }
- chomp;
- if (!defined $input_format && /^[-A-Za-z]+:\s/) {
- $input_format = 'mbox';
+ while (1) {
+ my $author = undef;
+ my $author_encoding;
+ my $has_content_type;
+ my $body_encoding;
+ @cc = ();
+ @xh = ();
+ my $input_format = undef;
+ my @header = ();
+ $message = "";
+ $message_num++;
+ # First unfold multiline header fields
+ while(<F>) {
+ last if /^\s*$/;
+ if (/^\s+\S/ and @header) {
+ chomp($header[$#header]);
+ s/^\s+/ /;
+ $header[$#header] .= $_;
+ } else {
+ push(@header, $_);
+ }
}
-
- if (defined $input_format && $input_format eq 'mbox') {
- if (/^Subject:\s+(.*)$/) {
- $subject = $1;
+ # Now parse the header
+ foreach(@header) {
+ if (/^From /) {
+ $input_format = 'mbox';
+ next;
}
- elsif (/^From:\s+(.*)$/) {
- ($author, $author_encoding) = unquote_rfc2047($1);
- next if $suppress_cc{'author'};
- next if $suppress_cc{'self'} and $author eq $sender;
- printf("(mbox) Adding cc: %s from line '%s'\n",
- $1, $_) unless $quiet;
- push @cc, $1;
+ chomp;
+ if (!defined $input_format && /^[-A-Za-z]+:\s/) {
+ $input_format = 'mbox';
}
- elsif (/^Cc:\s+(.*)$/) {
- foreach my $addr (parse_address_line($1)) {
- if (unquote_rfc2047($addr) eq $sender) {
- next if ($suppress_cc{'self'});
- } else {
- next if ($suppress_cc{'cc'});
- }
+
+ if (defined $input_format && $input_format eq 'mbox') {
+ if (/^Subject:\s+(.*)$/) {
+ $subject = $1;
+ }
+ elsif (/^From:\s+(.*)$/) {
+ ($author, $author_encoding) = unquote_rfc2047($1);
+ next if $suppress_cc{'author'};
+ next if $suppress_cc{'self'} and $author eq $sender;
printf("(mbox) Adding cc: %s from line '%s'\n",
- $addr, $_) unless $quiet;
- push @cc, $addr;
+ $1, $_) unless $quiet;
+ push @cc, $1;
}
- }
- elsif (/^Content-type:/i) {
- $has_content_type = 1;
- if (/charset="?([^ "]+)/) {
- $body_encoding = $1;
+ elsif (/^Cc:\s+(.*)$/) {
+ foreach my $addr (parse_address_line($1)) {
+ if (unquote_rfc2047($addr) eq $sender) {
+ next if ($suppress_cc{'self'});
+ } else {
+ next if ($suppress_cc{'cc'});
+ }
+ printf("(mbox) Adding cc: %s from line '%s'\n",
+ $addr, $_) unless $quiet;
+ push @cc, $addr;
+ }
+ }
+ elsif (/^Content-type:/i) {
+ $has_content_type = 1;
+ if (/charset="?([^ "]+)/) {
+ $body_encoding = $1;
+ }
+ push @xh, $_;
+ }
+ elsif (/^Message-Id: (.*)/i) {
+ $message_id = $1;
+ }
+ elsif (!/^Date:\s/ && /^[-A-Za-z]+:\s+\S/) {
+ push @xh, $_;
}
- push @xh, $_;
- }
- elsif (/^Message-Id: (.*)/i) {
- $message_id = $1;
- }
- elsif (!/^Date:\s/ && /^[-A-Za-z]+:\s+\S/) {
- push @xh, $_;
- }
- } else {
- # In the traditional
- # "send lots of email" format,
- # line 1 = cc
- # line 2 = subject
- # So let's support that, too.
- $input_format = 'lots';
- if (@cc == 0 && !$suppress_cc{'cc'}) {
- printf("(non-mbox) Adding cc: %s from line '%s'\n",
- $_, $_) unless $quiet;
- push @cc, $_;
- } elsif (!defined $subject) {
- $subject = $_;
+ } else {
+ # In the traditional
+ # "send lots of email" format,
+ # line 1 = cc
+ # line 2 = subject
+ # So let's support that, too.
+ $input_format = 'lots';
+ if (@cc == 0 && !$suppress_cc{'cc'}) {
+ printf("(non-mbox) Adding cc: %s from line '%s'\n",
+ $_, $_) unless $quiet;
+ push @cc, $_;
+ } elsif (!defined $subject) {
+ $subject = $_;
+ }
}
}
- }
- # Now parse the message body
- while(<F>) {
- $message .= $_;
- if (/^(Signed-off-by|Cc): (.*)$/i) {
- chomp;
- my ($what, $c) = ($1, $2);
- chomp $c;
- if ($c eq $sender) {
- next if ($suppress_cc{'self'});
- } else {
- next if $suppress_cc{'sob'} and $what =~ /Signed-off-by/i;
- next if $suppress_cc{'bodycc'} and $what =~ /Cc/i;
+ # Now parse the message body
+ while(<F>) {
+ last if /^From /; # Next message in file
+ $message .= $_;
+ if (/^(Signed-off-by|Cc): (.*)$/i) {
+ chomp;
+ my ($what, $c) = ($1, $2);
+ chomp $c;
+ if ($c eq $sender) {
+ next if ($suppress_cc{'self'});
+ } else {
+ next if $suppress_cc{'sob'} and $what =~ /Signed-off-by/i;
+ next if $suppress_cc{'bodycc'} and $what =~ /Cc/i;
+ }
+ push @cc, $c;
+ printf("(body) Adding cc: %s from line '%s'\n",
+ $c, $_) unless $quiet;
}
- push @cc, $c;
- printf("(body) Adding cc: %s from line '%s'\n",
- $c, $_) unless $quiet;
}
- }
- close F;
- if (defined $cc_cmd && !$suppress_cc{'cccmd'}) {
- open(F, "$cc_cmd $t |")
- or die "(cc-cmd) Could not execute '$cc_cmd'";
- while(<F>) {
- my $c = $_;
- $c =~ s/^\s*//g;
- $c =~ s/\n$//g;
- 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;
+ if (defined $cc_cmd && !$suppress_cc{'cccmd'}) {
+ open(CC_CMD, "$cc_cmd $t |")
+ or die "(cc-cmd) Could not execute '$cc_cmd'";
+ while(<CC_CMD>) {
+ my $c = $_;
+ $c =~ s/^\s*//g;
+ $c =~ s/\n$//g;
+ 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;
+ }
+ close CC_CMD
+ or die "(cc-cmd) failed to close pipe to '$cc_cmd'";
}
- close F
- or die "(cc-cmd) failed to close pipe to '$cc_cmd'";
- }
- if (defined $author and $author ne $sender) {
- $message = "From: $author\n\n$message";
- if (defined $author_encoding) {
- if ($has_content_type) {
- if ($body_encoding eq $author_encoding) {
- # ok, we already have the right encoding
+ if (defined $author and $author ne $sender) {
+ $message = "From: $author\n\n$message";
+ if (defined $author_encoding) {
+ if ($has_content_type) {
+ if ($body_encoding eq $author_encoding) {
+ # ok, we already have the right encoding
+ }
+ else {
+ # uh oh, we should re-encode
+ }
}
else {
- # uh oh, we should re-encode
+ push @xh,
+ 'MIME-Version: 1.0',
+ "Content-Type: text/plain; charset=$author_encoding",
+ 'Content-Transfer-Encoding: 8bit';
}
}
- else {
- push @xh,
- 'MIME-Version: 1.0',
- "Content-Type: text/plain; charset=$author_encoding",
- 'Content-Transfer-Encoding: 8bit';
- }
}
- }
- $needs_confirm = (
- $confirm eq "always" or
- ($confirm =~ /^(?:auto|cc)$/ && @cc) or
- ($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
- $needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);
+ $needs_confirm = (
+ $confirm eq "always" or
+ ($confirm =~ /^(?:auto|cc)$/ && @cc) or
+ ($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
+ $needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);
- @cc = (@initial_cc, @cc);
+ @cc = (@initial_cc, @cc);
- send_message();
+ send_message();
- # set up for the next message
- if ($chain_reply_to || !defined $reply_to || length($reply_to) == 0) {
- $reply_to = $message_id;
- if (length $references > 0) {
- $references .= "\n $message_id";
- } else {
- $references = "$message_id";
+ # set up for the next message
+ if ($chain_reply_to || !defined $reply_to || length($reply_to) == 0) {
+ $reply_to = $message_id;
+ if (length $references > 0) {
+ $references .= "\n $message_id";
+ } else {
+ $references = "$message_id";
+ }
}
+ $message_id = undef;
+ last unless (<F>);
}
- $message_id = undef;
+ close F;
}
cleanup_compose_files();
--
wbr, Vitaly
next reply other threads:[~2009-05-11 13:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-11 13:46 Vitaly Mayatskikh [this message]
2009-05-12 23:27 ` [PATCH] git-send-email: parse all messages in mbox Junio C Hamano
2009-05-14 9:47 ` Vitaly Mayatskikh
2009-05-14 14:48 ` Jay Soffian
2009-05-14 18:41 ` Vitaly Mayatskikh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=873abbeoqc.wl%vmayatsk@redhat.com \
--to=v.mayatskih@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).