Skip to content

Commit

Permalink
Merge branch 'jk/format-patch-quote-special-in-from' into maint
Browse files Browse the repository at this point in the history
* jk/format-patch-quote-special-in-from:
  pretty: quote rfc822 specials in email addresses
  • Loading branch information
Junio C Hamano committed May 15, 2011
2 parents e5c1650 + 4d03c18 commit 92b501f
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 1 deletion.
61 changes: 60 additions & 1 deletion pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,58 @@ int has_non_ascii(const char *s)
return 0;
}

static int is_rfc822_special(char ch)
{
switch (ch) {
case '(':
case ')':
case '<':
case '>':
case '[':
case ']':
case ':':
case ';':
case '@':
case ',':
case '.':
case '"':
case '\\':
return 1;
default:
return 0;
}
}

static int has_rfc822_specials(const char *s, int len)
{
int i;
for (i = 0; i < len; i++)
if (is_rfc822_special(s[i]))
return 1;
return 0;
}

static void add_rfc822_quoted(struct strbuf *out, const char *s, int len)
{
int i;

/* just a guess, we may have to also backslash-quote */
strbuf_grow(out, len + 2);

strbuf_addch(out, '"');
for (i = 0; i < len; i++) {
switch (s[i]) {
case '"':
case '\\':
strbuf_addch(out, '\\');
/* fall through */
default:
strbuf_addch(out, s[i]);
}
}
strbuf_addch(out, '"');
}

static int is_rfc2047_special(char ch)
{
return (non_ascii(ch) || (ch == '=') || (ch == '?') || (ch == '_'));
Expand Down Expand Up @@ -293,7 +345,14 @@ void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
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);
}
strbuf_add(sb, name_tail, namelen - display_name_length);
strbuf_addch(sb, '\n');
} else {
Expand Down
42 changes: 42 additions & 0 deletions t/t4014-format-patch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -793,4 +793,46 @@ test_expect_success 'format-patch wraps extremely long headers (rfc2047)' '
test_cmp expect subject
'

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

0 comments on commit 92b501f

Please sign in to comment.