Merge branch 'jk/maint-send-email-compose' into maint

* jk/maint-send-email-compose:
  send-email: rfc2047-quote subject lines with non-ascii characters
  send-email: specify content-type of --compose body
This commit is contained in:
Junio C Hamano 2008-05-25 22:34:23 -07:00
commit a2f5be5008
2 changed files with 100 additions and 2 deletions

View File

@ -518,8 +518,30 @@ EOT
open(C,"<",$compose_filename) open(C,"<",$compose_filename)
or die "Failed to open $compose_filename : " . $!; or die "Failed to open $compose_filename : " . $!;
my $need_8bit_cte = file_has_nonascii($compose_filename);
my $in_body = 0;
while(<C>) { while(<C>) {
next if m/^GIT: /; next if m/^GIT: /;
if (!$in_body && /^\n$/) {
$in_body = 1;
if ($need_8bit_cte) {
print C2 "MIME-Version: 1.0\n",
"Content-Type: text/plain; ",
"charset=utf-8\n",
"Content-Transfer-Encoding: 8bit\n";
}
}
if (!$in_body && /^MIME-Version:/i) {
$need_8bit_cte = 0;
}
if (!$in_body && /^Subject: ?(.*)/i) {
my $subject = $1;
$_ = "Subject: " .
($subject =~ /[^[:ascii:]]/ ?
quote_rfc2047($subject) :
$subject) .
"\n";
}
print C2 $_; print C2 $_;
} }
close(C); close(C);
@ -610,6 +632,14 @@ sub unquote_rfc2047 {
return wantarray ? ($_, $encoding) : $_; return wantarray ? ($_, $encoding) : $_;
} }
sub quote_rfc2047 {
local $_ = shift;
my $encoding = shift || 'utf-8';
s/([^-a-zA-Z0-9!*+\/])/sprintf("=%02X", ord($1))/eg;
s/(.*)/=\?$encoding\?q\?$1\?=/;
return $_;
}
# use the simplest quoting being able to handle the recipient # use the simplest quoting being able to handle the recipient
sub sanitize_address sub sanitize_address
{ {
@ -627,8 +657,7 @@ sub sanitize_address
# rfc2047 is needed if a non-ascii char is included # rfc2047 is needed if a non-ascii char is included
if ($recipient_name =~ /[^[:ascii:]]/) { if ($recipient_name =~ /[^[:ascii:]]/) {
$recipient_name =~ s/([^-a-zA-Z0-9!*+\/])/sprintf("=%02X", ord($1))/eg; $recipient_name = quote_rfc2047($recipient_name);
$recipient_name =~ s/(.*)/=\?utf-8\?q\?$1\?=/;
} }
# double quotes are needed if specials or CTLs are included # double quotes are needed if specials or CTLs are included
@ -956,3 +985,13 @@ sub validate_patch {
} }
return undef; return undef;
} }
sub file_has_nonascii {
my $fn = shift;
open(my $fh, '<', $fn)
or die "unable to open $fn: $!\n";
while (my $line = <$fh>) {
return 1 if $line =~ /[^[:ascii:]]/;
}
return 0;
}

View File

@ -166,4 +166,63 @@ test_expect_success 'second message is patch' '
grep "Subject:.*Second" msgtxt2 grep "Subject:.*Second" msgtxt2
' '
test_expect_success '--compose adds MIME for utf8 body' '
clean_fake_sendmail &&
(echo "#!/bin/sh" &&
echo "echo utf8 body: àéìöú >>\$1"
) >fake-editor-utf8 &&
chmod +x fake-editor-utf8 &&
echo y | \
GIT_EDITOR=$(pwd)/fake-editor-utf8 \
GIT_SEND_EMAIL_NOTTY=1 \
git send-email \
--compose --subject foo \
--from="Example <nobody@example.com>" \
--to=nobody@example.com \
--smtp-server="$(pwd)/fake.sendmail" \
$patches &&
grep "^utf8 body" msgtxt1 &&
grep "^Content-Type: text/plain; charset=utf-8" msgtxt1
'
test_expect_success '--compose respects user mime type' '
clean_fake_sendmail &&
(echo "#!/bin/sh" &&
echo "(echo MIME-Version: 1.0"
echo " echo Content-Type: text/plain\\; charset=iso-8859-1"
echo " echo Content-Transfer-Encoding: 8bit"
echo " echo Subject: foo"
echo " echo "
echo " echo utf8 body: àéìöú) >\$1"
) >fake-editor-utf8-mime &&
chmod +x fake-editor-utf8-mime &&
echo y | \
GIT_EDITOR=$(pwd)/fake-editor-utf8-mime \
GIT_SEND_EMAIL_NOTTY=1 \
git send-email \
--compose --subject foo \
--from="Example <nobody@example.com>" \
--to=nobody@example.com \
--smtp-server="$(pwd)/fake.sendmail" \
$patches &&
grep "^utf8 body" msgtxt1 &&
grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1 &&
! grep "^Content-Type: text/plain; charset=utf-8" msgtxt1
'
test_expect_success '--compose adds MIME for utf8 subject' '
clean_fake_sendmail &&
echo y | \
GIT_EDITOR=$(pwd)/fake-editor \
GIT_SEND_EMAIL_NOTTY=1 \
git send-email \
--compose --subject utf8-sübjëct \
--from="Example <nobody@example.com>" \
--to=nobody@example.com \
--smtp-server="$(pwd)/fake.sendmail" \
$patches &&
grep "^fake edit" msgtxt1 &&
grep "^Subject: =?utf-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
'
test_done test_done