Re: [WIP-PATCH 1/2] send-email: create email parser subroutine
flat view
From: Eric Wong <hidden>
Date: 2016-06-16 02:19:38
Matthieu Moy [off-list ref] wrote:
Samuel GROOT [off-list ref] writes:quoted
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 headerThese routines are not specific to git send-email, nor to Git. Does it make sense to use an external library, like http://search.cpan.org/~rjbs/Email-Simple-2.210/lib/Email/Simple.pm , either by depending on it, or by copying it in Git's source tree ?
That might be overkill and increase installation/maintenance burden. Bundling it would probably be problematic to distros, too.
If not, I think it would be better to introduce an email parsing library in a dedicated Perl module in perl/ in our source tree, to keep git-send-email.perl more focused on the "send-email" logic.
Sounds good, Git.pm already has parse_mailboxes
quoted
+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 bodyWhy "unfold"? Don't you mean "split message body into a list of lines"?quoted
+ while (<$fh>) { + push @body, $_; + }
I'd rather avoid the loops entirely and do this: local $/ = "\n"; # in case caller clobbers $/ @body = (<$fh>);
quoted
+ return (@header, @body); +}
quoted
+ if (defined $input_format && $input_format eq 'mbox') { + if (/^Subject:\s+(.*)$/i) { + $subject = $1; + } elsif (/^From:\s+(.*)$/i) { + $from = $1;Not sure we need thes if/elsif/ for generic headers. Email::Simple's API seems much simpler and general: $email->header("From");
Right. Reading this, it would've been easier to parse headers into a hash (normalized keys to lowercase) up front inside parse_email.