From 747bbff9b9583642cd8702b7b559757a6960df00 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Fri, 18 Jan 2008 09:19:48 -0500 Subject: [PATCH] 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 Signed-off-by: Junio C Hamano --- git-send-email.perl | 17 +++++++++++++++++ t/t9001-send-email.sh | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/git-send-email.perl b/git-send-email.perl index 7a86977ef1..4e62c3f0e7 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -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; +} diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 659f9c758f..1c4181022f 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -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 " \ + --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