send-email: validate patches before sending anything

We try to catch errors early so that we don't end up sending
half of a broken patch series. Right now the only validation
is checking that line-lengths are under the SMTP-mandated
limit of 998.

The validation parsing is very crude (it just checks each
line length without understanding the mailbox format) but
should work fine for this simple check.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2008-01-18 09:19:48 -05:00 committed by Junio C Hamano
parent aa54892f5a
commit 747bbff9b9
2 changed files with 37 additions and 0 deletions

View File

@ -332,6 +332,11 @@ for my $f (@ARGV) {
}
}
foreach my $f (@files) {
my $error = validate_patch($f);
$error and die "fatal: $f: $error\nwarning: no patches were sent\n";
}
if (@files) {
unless ($quiet) {
print $_,"\n" for (@files);
@ -837,3 +842,15 @@ sub unique_email_list(@) {
}
return @emails;
}
sub validate_patch {
my $fn = shift;
open(my $fh, '<', $fn)
or die "unable to open $fn: $!\n";
while (my $line = <$fh>) {
if (length($line) > 998) {
return "$.: patch contains a line longer than 998 characters";
}
}
return undef;
}

View File

@ -78,4 +78,24 @@ test_expect_success 'Show all headers' '
diff -u expected-show-all-headers actual-show-all-headers
'
z8=zzzzzzzz
z64=$z8$z8$z8$z8$z8$z8$z8$z8
z512=$z64$z64$z64$z64$z64$z64$z64$z64
test_expect_success 'reject long lines' '
rm -f commandline &&
cp $patches longline.patch &&
echo $z512$z512 >>longline.patch &&
! git send-email \
--from="Example <nobody@example.com>" \
--to=nobody@example.com \
--smtp-server="$(pwd)/fake.sendmail" \
$patches longline.patch \
2>errors &&
grep longline.patch errors
'
test_expect_success 'no patch was sent' '
! test -e commandline
'
test_done