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.gr...@grenoble-inp.org>
Signed-off-by: Tom RUSSELLO <tom.russe...@grenoble-inp.org>
Signed-off-by: Matthieu MOY <matthieu....@grenoble-inp.fr>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to