Skip to content

Commit

Permalink
send-email: validate patches before sending anything
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jan 18, 2008
1 parent aa54892 commit 747bbff
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
17 changes: 17 additions & 0 deletions git-send-email.perl
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,11 @@ sub read_config {
}
}

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);
Expand Down Expand Up @@ -837,3 +842,15 @@ (@)
}
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;
}
20 changes: 20 additions & 0 deletions t/t9001-send-email.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 747bbff

Please sign in to comment.