send-email: handle adjacent RFC 2047-encoded words properly
authorРоман Донченко <dpb@corrigendum.ru>
Sun, 14 Dec 2014 15:59:47 +0000 (18:59 +0300)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Dec 2014 17:06:40 +0000 (09:06 -0800)
The RFC says that they are to be concatenated after decoding (i.e. the
intervening whitespace is ignored).

Signed-off-by: Роман Донченко <dpb@corrigendum.ru>
Acked-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 106c2b065dfd6f29c5983d6944ec53cbb95490b0..cd327d704368300bc3c107df3b1ffd9dfd8c8f75 100755 (executable)
@@ -912,17 +912,23 @@ sub make_message_id {
 sub unquote_rfc2047 {
        local ($_) = @_;
        my $charset;
-       s{$re_encoded_word}{
-               $charset = $1;
-               my $encoding = $2;
-               my $text = $3;
-               if ($encoding eq 'q' || $encoding eq 'Q') {
-                       $text =~ s/_/ /g;
-                       $text =~ s/=([0-9A-F]{2})/chr(hex($1))/egi;
-                       $text;
-               } else {
-                       $&; # other encodings not supported yet
+       my $sep = qr/[ \t]+/;
+       s{$re_encoded_word(?:$sep$re_encoded_word)*}{
+               my @words = split $sep, $&;
+               foreach (@words) {
+                       m/$re_encoded_word/;
+                       $charset = $1;
+                       my $encoding = $2;
+                       my $text = $3;
+                       if ($encoding eq 'q' || $encoding eq 'Q') {
+                               $_ = $text;
+                               s/_/ /g;
+                               s/=([0-9A-F]{2})/chr(hex($1))/egi;
+                       } else {
+                               # other encodings not supported yet
+                       }
                }
+               join '', @words;
        }eg;
        return wantarray ? ($_, $charset) : $_;
 }
index 1ecdacb6fd0ceb7e43e6ec3bad018e7b6dc8100b..f933bc7ec7905915818718dae9c09b1466d9f18e 100755 (executable)
@@ -240,6 +240,13 @@ test_expect_success $PREREQ 'non-ascii self name is suppressed' "
                'non_ascii_self_suppressed'
 "
 
+# This name is long enough to force format-patch to split it into multiple
+# encoded-words, assuming it uses UTF-8 with the "Q" encoding.
+test_expect_success $PREREQ 'long non-ascii self name is suppressed' "
+       test_suppress_self_quoted 'Ƒüñníęř €. Nâṁé' 'odd_?=mail@example.com' \
+               'long_non_ascii_self_suppressed'
+"
+
 test_expect_success $PREREQ 'sanitized self name is suppressed' "
        test_suppress_self_unquoted '\"A U. Thor\"' 'author@example.com' \
                'self_name_sanitized_suppressed'