Browse Source

send-email: accept long lines with suitable transfer encoding

With --validate (which is the default), we warn about lines exceeding
998 characters due to the limits specified in RFC 5322.  However, if
we're using a suitable transfer encoding (quoted-printable or base64),
we're guaranteed not to have lines exceeding 76 characters, so there's
no need to fail in this case.  The auto transfer encoding handles this
specific case, so accept it as well.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
brian m. carlson 7 years ago committed by Junio C Hamano
parent
commit
f2d06fb13f
  1. 7
      Documentation/git-send-email.txt
  2. 18
      git-send-email.perl
  3. 13
      t/t9001-send-email.sh

7
Documentation/git-send-email.txt

@ -401,8 +401,11 @@ have been specified, in which case default to 'compose'. @@ -401,8 +401,11 @@ have been specified, in which case default to 'compose'.
+
--
* Invoke the sendemail-validate hook if present (see linkgit:githooks[5]).
* Warn of patches that contain lines longer than 998 characters; this
is due to SMTP limits as described by http://www.ietf.org/rfc/rfc2821.txt.
* Warn of patches that contain lines longer than
998 characters unless a suitable transfer encoding
('auto', 'base64', or 'quoted-printable') is used;
this is due to SMTP limits as described by
http://www.ietf.org/rfc/rfc2821.txt.
--
+
Default is the value of `sendemail.validate`; if this is not set,

18
git-send-email.perl

@ -645,7 +645,7 @@ if (@rev_list_opts) { @@ -645,7 +645,7 @@ if (@rev_list_opts) {
if ($validate) {
foreach my $f (@files) {
unless (-p $f) {
my $error = validate_patch($f);
my $error = validate_patch($f, $target_xfer_encoding);
$error and die sprintf(__("fatal: %s: %s\nwarning: no patches were sent\n"),
$f, $error);
}
@ -1879,7 +1879,7 @@ sub unique_email_list { @@ -1879,7 +1879,7 @@ sub unique_email_list {
}

sub validate_patch {
my $fn = shift;
my ($fn, $xfer_encoding) = @_;

if ($repo) {
my $validate_hook = catfile(catdir($repo->repo_path(), 'hooks'),
@ -1899,11 +1899,15 @@ sub validate_patch { @@ -1899,11 +1899,15 @@ sub validate_patch {
return $hook_error if $hook_error;
}

open(my $fh, '<', $fn)
or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
while (my $line = <$fh>) {
if (length($line) > 998) {
return sprintf(__("%s: patch contains a line longer than 998 characters"), $.);
# Any long lines will be automatically fixed if we use a suitable transfer
# encoding.
unless ($xfer_encoding =~ /^(?:auto|quoted-printable|base64)$/) {
open(my $fh, '<', $fn)
or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
while (my $line = <$fh>) {
if (length($line) > 998) {
return sprintf(__("%s: patch contains a line longer than 998 characters"), $.);
}
}
}
return;

13
t/t9001-send-email.sh

@ -479,6 +479,19 @@ test_expect_success $PREREQ 'long lines with auto encoding are quoted-printable' @@ -479,6 +479,19 @@ test_expect_success $PREREQ 'long lines with auto encoding are quoted-printable'
grep "Content-Transfer-Encoding: quoted-printable" msgtxt1
'

for enc in auto quoted-printable base64
do
test_expect_success $PREREQ "--validate passes with encoding $enc" '
git send-email \
--from="Example <nobody@example.com>" \
--to=nobody@example.com \
--smtp-server="$(pwd)/fake.sendmail" \
--transfer-encoding=$enc \
--validate \
$patches longline.patch
'
done

test_expect_success $PREREQ 'Invalid In-Reply-To' '
clean_fake_sendmail &&
git send-email \

Loading…
Cancel
Save