git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [WIP-PATCH 1/2] send-email: create email parser subroutine

From
EWEric Wong <e@80x24.org>
Date
May 28, 2016, 23:33 UTC
Message-ID
<20160528233329.GA1132@dcvr.yhbt.net>
In-Reply-To
<vpqeg8mi4wm.fsf@anie.imag.fr>
Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> wrote:
Show 13 quoted lines
> Samuel GROOT <samuel.groot@grenoble-inp.org> writes:
> 
> > 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
> 
> These 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
Show 24 quoted lines
> > +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
> 
> Why "unfold"? Don't you mean "split message body into a list of lines"?
> 
> > +	while (<$fh>) {
> > +		push @body, $_;
> > +	}
I'd rather avoid the loops entirely and do this:
	local $/ = "\n"; # in case caller clobbers $/
	@body = (<$fh>);
> > +	return (@header, @body);
> > +}
Show 8 quoted lines
> > +		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.

Previous: Matthieu MoyNext: Samuel GROOT
Message 4 of 18 in “send-email: refactor the email parser loop”
  1. 0/2 send-email: refactor the email parser loopSamuel GROOT, May 27, 2016
  2. 1/2 send-email: create email parser subroutineSamuel GROOT, May 27, 2016
  3. Matthieu MoyMay 28, 2016
  4. Eric WongMay 28, 2016
  5. Samuel GROOTMay 29, 2016
  6. Matthieu MoyMay 29, 2016
  7. Samuel GROOTMay 30, 2016
  8. Samuel GROOTJun 2, 2016
  9. Eric WongJun 2, 2016
  10. 2/2 send-email: use refactored subroutine to parse patchesSamuel GROOT, May 27, 2016
  11. Eric WongMay 27, 2016
  12. Matthieu MoyMay 28, 2016
  13. Samuel GROOTMay 29, 2016
  14. Matthieu MoyMay 29, 2016
  15. Samuel GROOTMay 30, 2016
  16. Matthieu MoyMay 30, 2016
  17. Samuel GROOTMay 30, 2016
  18. Matthieu MoyMay 30, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.