author | Junio C Hamano <gitster@pobox.com> | |
Fri, 6 May 2011 17:50:18 +0000 (10:50 -0700) | ||
committer | Junio 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
pretty: quote rfc822 specials in email addresses
Conflicts:
pretty.c
t/t4014-format-patch.sh
1 | 2 | |||
---|---|---|---|---|
pretty.c | patch | | diff1 | | diff2 | | blob | history |
t/t4014-format-patch.sh | patch | | diff1 | | diff2 | | blob | history |
diff --cc pretty.c
index ba95de92cd66f9ba24d84e706b013d2679ef554a,0252a21a0d62dc59a9325d0365db0c0061b70eb7..dff5c8d1831ca4019d1a502a393cb95f20ad18f7
+++ b/pretty.c
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("ed, line, display_name_length);
+ add_rfc2047(sb, quoted.buf, quoted.len, encoding);
+ strbuf_release("ed);
+ }
+ 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 {
diff --cc t/t4014-format-patch.sh
index a7060b75be60fd5d16128274e15344c6333de76f,6f8a96cd809916c8edd007b2fe46a5e35ff58ca9..045cee312cdeb515869eeeda3f7b167fb5b91504
+++ b/t/t4014-format-patch.sh
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