Parsing and processing in send-email is done in the same loop. To make the code more maintainable, we create two subroutines: - `parse_email` to separate header and body - `parse_header` to retrieve data from header Signed-off-by: Samuel GROOT <samuel.groot@xxxxxxxxxxxxxxxx> Signed-off-by: Tom RUSSELLO <tom.russello@xxxxxxxxxxxxxxxx> Signed-off-by: Matthieu MOY <matthieu.moy@xxxxxxxxxxxxxxx> --- git-send-email.perl | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/git-send-email.perl b/git-send-email.perl index 6958785..f33a083 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1750,3 +1750,108 @@ sub body_or_subject_has_nonascii { } return 0; } + +sub parse_email { + my @header = (); + my @body = (); + my $fh = shift; + + # First unfold multiline header fields + while (<$fh>) { + last if /^\s*$/; + if (/^\s+\S/ and @header) { + chomp($header[$#header]); + s/^\s+/ /; + $header[$#header] .= $_; + } else { + push(@header, $_); + } + } + + # Now unfold the message body + while (<$fh>) { + push @body, $_; + } + + return (@header, @body); +} + +sub parse_header { + # Return variables + my $from = undef, $subject = undef; + my $date = undef, $message_id = undef; + my @to = (), @cc = (), @xh = (); + my %flags = (); + + + # Internal variables + my $input_format = undef; + + foreach(@_) { + if (/^From /) { + $input_format = 'mbox'; + next; + } + chomp; + if (!defined $input_format && /^[-A-Za-z]+:\s/) { + $input_format = 'mbox'; + } + + if (defined $input_format && $input_format eq 'mbox') { + if (/^Subject:\s+(.*)$/i) { + $subject = $1; + } elsif (/^From:\s+(.*)$/i) { + $from = $1; + } elsif (/^To:\s+(.*)$/i) { + foreach my $addr (parse_address_line($1)) { + push @to, $addr; + } + } elsif (/^Cc:\s+(.*)$/i) { + foreach my $addr (parse_address_line($1)) { + push @cc, $addr; + } + } elsif (/^Content-type:/i) { + $flags{"has_content_type"} = 1; + if (/charset="?([^ "]+)/) { + $flags{"body_encoding"} = 1; + } + push @xh, $_; + } elsif (/^MIME-Version/i) { + $flags{"has_mime_version"} = 1; + push @xh, $_; + } elsif (/^Message-Id: (.*)/i) { + $message_id = $1; + } elsif (/^Content-Transfer-Encoding: (.*)/i) { + $flags{"xfer_encoding"} = $1 if not defined $flags{"xfer_encoding"}; + } elsif (/^Date:\s(.*)$/i) { + $date = $1; + } elsif (/^[-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) { + push @cc, $_; + } elsif (!defined $subject) { + $subject = $_; + } + } + } + + return ( + "from" => $from, + "subject" => $subject, + "date" => $date, + "message_id" => $message_id, + "to" => [@to], + "cc" => [@cc], + "xh" => [@xh], + "flags" => {%flags} + ); +} -- 2.8.2.537.gb153d2a -- 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