Merge branch 'jk/format-patch-quote-special-in-from'
authorJunio C Hamano <gitster@pobox.com>
Fri, 6 May 2011 17:50:18 +0000 (10:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 May 2011 17:50:18 +0000 (10:50 -0700)
* jk/format-patch-quote-special-in-from:
  pretty: quote rfc822 specials in email addresses

Conflicts:
pretty.c
t/t4014-format-patch.sh

1  2 
pretty.c
t/t4014-format-patch.sh

diff --cc pretty.c
index ba95de92cd66f9ba24d84e706b013d2679ef554a,0252a21a0d62dc59a9325d0365db0c0061b70eb7..dff5c8d1831ca4019d1a502a393cb95f20ad18f7
+++ b/pretty.c
@@@ -294,15 -345,14 +346,22 @@@ void pp_user_info(const char *what, enu
                        name_tail--;
                display_name_length = name_tail - line;
                strbuf_addstr(sb, "From: ");
-               add_rfc2047(sb, line, display_name_length, encoding);
+               if (!has_rfc822_specials(line, display_name_length)) {
+                       add_rfc2047(sb, line, display_name_length, encoding);
+               } else {
+                       struct strbuf quoted = STRBUF_INIT;
+                       add_rfc822_quoted(&quoted, line, display_name_length);
+                       add_rfc2047(sb, quoted.buf, quoted.len, encoding);
+                       strbuf_release(&quoted);
+               }
 +              for (final_line = 0; final_line < sb->len; final_line++)
 +                      if (sb->buf[sb->len - final_line - 1] == '\n')
 +                              break;
 +              if (namelen - display_name_length + final_line > 78) {
 +                      strbuf_addch(sb, '\n');
 +                      if (!isspace(name_tail[0]))
 +                              strbuf_addch(sb, ' ');
 +              }
                strbuf_add(sb, name_tail, namelen - display_name_length);
                strbuf_addch(sb, '\n');
        } else {
index a7060b75be60fd5d16128274e15344c6333de76f,6f8a96cd809916c8edd007b2fe46a5e35ff58ca9..045cee312cdeb515869eeeda3f7b167fb5b91504
@@@ -793,19 -793,46 +793,62 @@@ test_expect_success 'format-patch wrap
        test_cmp expect subject
  '
  
 +M8="foo_bar_"
 +M64=$M8$M8$M8$M8$M8$M8$M8$M8
 +cat >expect <<EOF
 +From: $M64
 + <foobar@foo.bar>
 +EOF
 +test_expect_success 'format-patch wraps non-quotable headers' '
 +      rm -rf patches/ &&
 +      echo content >>file &&
 +      git add file &&
 +      git commit -mfoo --author "$M64 <foobar@foo.bar>" &&
 +      git format-patch --stdout -1 >patch &&
 +      sed -n "/^From: /p; /^ /p; /^$/q" <patch >from &&
 +      test_cmp expect from
 +'
++
+ check_author() {
+       echo content >>file &&
+       git add file &&
+       GIT_AUTHOR_NAME=$1 git commit -m author-check &&
+       git format-patch --stdout -1 >patch &&
+       grep ^From: patch >actual &&
+       test_cmp expect actual
+ }
+ cat >expect <<'EOF'
+ From: "Foo B. Bar" <author@example.com>
+ EOF
+ test_expect_success 'format-patch quotes dot in headers' '
+       check_author "Foo B. Bar"
+ '
+ cat >expect <<'EOF'
+ From: "Foo \"The Baz\" Bar" <author@example.com>
+ EOF
+ test_expect_success 'format-patch quotes double-quote in headers' '
+       check_author "Foo \"The Baz\" Bar"
+ '
+ cat >expect <<'EOF'
+ From: =?UTF-8?q?"F=C3=B6o=20B.=20Bar"?= <author@example.com>
+ EOF
+ test_expect_success 'rfc2047-encoded headers also double-quote 822 specials' '
+       check_author "Föo B. Bar"
+ '
+ cat >expect <<'EOF'
+ Subject: header with . in it
+ EOF
+ test_expect_success 'subject lines do not have 822 atom-quoting' '
+       echo content >>file &&
+       git add file &&
+       git commit -m "header with . in it" &&
+       git format-patch -k -1 --stdout >patch &&
+       grep ^Subject: patch >actual &&
+       test_cmp expect actual
+ '
  test_done