The RFC says that they are to be concatenated after decoding (i.e. the intervening whitespace is ignored). I change the sender's name to an all-Cyrillic string in the tests so that its encoded form goes over the 76 characters in a line limit, forcing format-patch to split it into multiple encoded words. Since I have to modify the regular expression for an encoded word anyway, I take the opportunity to bring it closer to the spec, most notably disallowing embedded spaces and making it case-insensitive (thus allowing the encoding to be specified as both "q" and "Q"). Signed-off-by: Роман Донченко <dpb@xxxxxxxxxxxxxx> --- git-send-email.perl | 21 +++++++++++++++------ t/t9001-send-email.sh | 18 +++++++++--------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 9949db0..4bb9f6f 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -913,13 +913,22 @@ $time = time - scalar $#files; sub unquote_rfc2047 { local ($_) = @_; + + my $et = qr/[!->@-~]+/; # encoded-text from RFC 2047 + my $sep = qr/[ \t]+/; + my $encoded_word = qr/=\?($et)\?q\?($et)\?=/i; + my $encoding; - s{=\?([^?]+)\?q\?(.*?)\?=}{ - $encoding = $1; - my $e = $2; - $e =~ s/_/ /g; - $e =~ s/=([0-9A-F]{2})/chr(hex($1))/eg; - $e; + s{$encoded_word(?:$sep$encoded_word)+}{ + my @words = split $sep, $&; + foreach (@words) { + m/$encoded_word/; + $encoding = $1; + $_ = $2; + s/_/ /g; + s/=([0-9A-F]{2})/chr(hex($1))/eg; + } + join '', @words; }eg; return wantarray ? ($_, $encoding) : $_; } diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 19a3ced..318b870 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -236,7 +236,7 @@ test_expect_success $PREREQ 'self name with dot is suppressed' " " test_expect_success $PREREQ 'non-ascii self name is suppressed' " - test_suppress_self_quoted 'Füñný Nâmé' 'odd_?=mail@xxxxxxxxxxx' \ + test_suppress_self_quoted 'Кириллическое Имя' 'odd_?=mail@xxxxxxxxxxx' \ 'non_ascii_self_suppressed' " @@ -946,25 +946,25 @@ test_expect_success $PREREQ 'utf8 author is correctly passed on' ' clean_fake_sendmail && test_commit weird_author && test_when_finished "git reset --hard HEAD^" && - git commit --amend --author "Füñný Nâmé <odd_?=mail@xxxxxxxxxxx>" && - git format-patch --stdout -1 >funny_name.patch && + git commit --amend --author "Кириллическое Имя <odd_?=mail@xxxxxxxxxxx>" && + git format-patch --stdout -1 >nonascii_name.patch && git send-email --from="Example <nobody@xxxxxxxxxxx>" \ --to=nobody@xxxxxxxxxxx \ --smtp-server="$(pwd)/fake.sendmail" \ - funny_name.patch && - grep "^From: Füñný Nâmé <odd_?=mail@xxxxxxxxxxx>" msgtxt1 + nonascii_name.patch && + grep "^From: Кириллическое Имя <odd_?=mail@xxxxxxxxxxx>" msgtxt1 ' test_expect_success $PREREQ 'utf8 sender is not duplicated' ' clean_fake_sendmail && test_commit weird_sender && test_when_finished "git reset --hard HEAD^" && - git commit --amend --author "Füñný Nâmé <odd_?=mail@xxxxxxxxxxx>" && - git format-patch --stdout -1 >funny_name.patch && - git send-email --from="Füñný Nâmé <odd_?=mail@xxxxxxxxxxx>" \ + git commit --amend --author "Кириллическое Имя <odd_?=mail@xxxxxxxxxxx>" && + git format-patch --stdout -1 >nonascii_name.patch && + git send-email --from="Кириллическое Имя <odd_?=mail@xxxxxxxxxxx>" \ --to=nobody@xxxxxxxxxxx \ --smtp-server="$(pwd)/fake.sendmail" \ - funny_name.patch && + nonascii_name.patch && grep "^From: " msgtxt1 >msgfrom && test_line_count = 1 msgfrom ' -- 2.1.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html