send-email: validate patches before sending anything
authorJeff King <peff@peff.net>
Fri, 18 Jan 2008 14:19:48 +0000 (09:19 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 18 Jan 2008 21:33:08 +0000 (13:33 -0800)
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>
git-send-email.perl
t/t9001-send-email.sh

index 7a86977ef104da807743c879532ca942dd2c939a..4e62c3f0e77387c0c8b2b24a9e4abd79fd18f7f4 100755 (executable)
@@ -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;
+}
index 659f9c758fd9abbae8aa657a4729059335dd92cd..1c4181022fdf59b49b4aed4be81230897d09b685 100755 (executable)
@@ -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