diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-05-25 22:34:23 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-05-25 22:34:23 -0700 |
commit | a2f5be500839bdf75e4721cc68642b821128b7b9 (patch) | |
tree | 75f06fdf45b21b7bed0fff75387e2c8edead4c79 /git-send-email.perl | |
parent | 93c7b9c15965a083c02543010d0a643056261938 (diff) | |
parent | d54eaaa268eb79a51ac11bfa8bbfb456c0b1a1fa (diff) | |
download | git-a2f5be500839bdf75e4721cc68642b821128b7b9.tar.gz |
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
Diffstat (limited to 'git-send-email.perl')
-rwxr-xr-x | git-send-email.perl | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/git-send-email.perl b/git-send-email.perl index 5630276f78..c6bba47eb6 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -518,8 +518,30 @@ EOT open(C,"<",$compose_filename) or die "Failed to open $compose_filename : " . $!; + my $need_8bit_cte = file_has_nonascii($compose_filename); + my $in_body = 0; while(<C>) { 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 $_; } close(C); @@ -610,6 +632,14 @@ sub unquote_rfc2047 { 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 sub sanitize_address { @@ -627,8 +657,7 @@ sub sanitize_address # rfc2047 is needed if a non-ascii char is included if ($recipient_name =~ /[^[:ascii:]]/) { - $recipient_name =~ s/([^-a-zA-Z0-9!*+\/])/sprintf("=%02X", ord($1))/eg; - $recipient_name =~ s/(.*)/=\?utf-8\?q\?$1\?=/; + $recipient_name = quote_rfc2047($recipient_name); } # double quotes are needed if specials or CTLs are included @@ -956,3 +985,13 @@ sub validate_patch { } 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; +} |