Browse Source

send-email: extract email-parsing code into a subroutine

The existing code mixes parsing of email header with regular
expression and actual code. Extract the parsing code into a new
subroutine "parse_header_line()". This improves the code readability
and make parse_header_line reusable in other place.

"parsed_header_line()" and "filter_body()" could be used for
refactoring the part of code which parses the header to prepare the
email and send it.

In contrast to the previous version it doesn't keep the header order
and strip duplicate headers.

Signed-off-by: Nathan Payre <nathan.payre@etu.univ-lyon1.fr>
Signed-off-by: Matthieu Moy <matthieu.moy@univ-lyon1.fr>
Signed-off-by: Timothee Albertin <timothee.albertin@etu.univ-lyon1.fr>
Signed-off-by: Daniel Bensoussan <daniel.bensoussan--bohm@etu.univ-lyon1.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Reviewed-by: Matthieu Moy <matthieu.moy@univ-lyon1.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nathan Payre 7 years ago committed by Junio C Hamano
parent
commit
b6049542b9
  1. 115
      git-send-email.perl

115
git-send-email.perl

@ -703,57 +703,70 @@ EOT3
do_edit($compose_filename); do_edit($compose_filename);
} }


open my $c2, ">", $compose_filename . ".final"
or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);

open $c, "<", $compose_filename open $c, "<", $compose_filename
or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!); or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!);


my $need_8bit_cte = file_has_nonascii($compose_filename);
my $in_body = 0;
my $summary_empty = 1;
if (!defined $compose_encoding) { if (!defined $compose_encoding) {
$compose_encoding = "UTF-8"; $compose_encoding = "UTF-8";
} }
while(<$c>) {
next if m/^GIT:/; my %parsed_email;
if ($in_body) { while (my $line = <$c>) {
$summary_empty = 0 unless (/^\n$/); next if $line =~ m/^GIT:/;
} elsif (/^\n$/) { parse_header_line($line, \%parsed_email);
$in_body = 1; if ($line =~ /^$/) {
if ($need_8bit_cte) { $parsed_email{'body'} = filter_body($c);
print $c2 "MIME-Version: 1.0\n",
"Content-Type: text/plain; ",
"charset=$compose_encoding\n",
"Content-Transfer-Encoding: 8bit\n";
}
} elsif (/^MIME-Version:/i) {
$need_8bit_cte = 0;
} elsif (/^Subject:\s*(.+)\s*$/i) {
$initial_subject = $1;
my $subject = $initial_subject;
$_ = "Subject: " .
quote_subject($subject, $compose_encoding) .
"\n";
} elsif (/^In-Reply-To:\s*(.+)\s*$/i) {
$initial_reply_to = $1;
next;
} elsif (/^From:\s*(.+)\s*$/i) {
$sender = $1;
next;
} elsif (/^(?:To|Cc|Bcc):/i) {
print __("To/Cc/Bcc fields are not interpreted yet, they have been ignored\n");
next;
} }
print $c2 $_;
} }
close $c; close $c;
close $c2;


if ($summary_empty) { open my $c2, ">", $compose_filename . ".final"
or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);


if ($parsed_email{'From'}) {
$sender = delete($parsed_email{'From'});
}
if ($parsed_email{'In-Reply-To'}) {
$initial_reply_to = delete($parsed_email{'In-Reply-To'});
}
if ($parsed_email{'Subject'}) {
$initial_subject = delete($parsed_email{'Subject'});
print $c2 "Subject: " .
quote_subject($initial_subject, $compose_encoding) .
"\n";
}

if ($parsed_email{'MIME-Version'}) {
print $c2 "MIME-Version: $parsed_email{'MIME-Version'}\n",
"Content-Type: $parsed_email{'Content-Type'};\n",
"Content-Transfer-Encoding: $parsed_email{'Content-Transfer-Encoding'}\n";
delete($parsed_email{'MIME-Version'});
delete($parsed_email{'Content-Type'});
delete($parsed_email{'Content-Transfer-Encoding'});
} elsif (file_has_nonascii($compose_filename)) {
my $content_type = (delete($parsed_email{'Content-Type'}) or
"text/plain; charset=$compose_encoding");
print $c2 "MIME-Version: 1.0\n",
"Content-Type: $content_type\n",
"Content-Transfer-Encoding: 8bit\n";
}
# Preserve unknown headers
foreach my $key (keys %parsed_email) {
next if $key eq 'body';
print $c2 "$key: $parsed_email{$key}";
}

if ($parsed_email{'body'}) {
print $c2 "\n$parsed_email{'body'}\n";
delete($parsed_email{'body'});
} else {
print __("Summary email is empty, skipping it\n"); print __("Summary email is empty, skipping it\n");
$compose = -1; $compose = -1;
} }

close $c2;

} elsif ($annotate) { } elsif ($annotate) {
do_edit(@files); do_edit(@files);
} }
@ -792,6 +805,32 @@ sub ask {
return; return;
} }


sub parse_header_line {
my $lines = shift;
my $parsed_line = shift;
my $addr_pat = join "|", qw(To Cc Bcc);

foreach (split(/\n/, $lines)) {
if (/^($addr_pat):\s*(.+)$/i) {
$parsed_line->{$1} = [ parse_address_line($2) ];
} elsif (/^([^:]*):\s*(.+)\s*$/i) {
$parsed_line->{$1} = $2;
}
}
}

sub filter_body {
my $c = shift;
my $body = "";
while (my $body_line = <$c>) {
if ($body_line !~ m/^GIT:/) {
$body .= $body_line;
}
}
return $body;
}


my %broken_encoding; my %broken_encoding;


sub file_declares_8bit_cte { sub file_declares_8bit_cte {

Loading…
Cancel
Save