Merge branch 'jk/format-patch-quote-special-in-from'
* jk/format-patch-quote-special-in-from: pretty: quote rfc822 specials in email addresses Conflicts: pretty.c t/t4014-format-patch.shmaint
commit
ace8ebbcf5
59
pretty.c
59
pretty.c
|
@ -208,6 +208,58 @@ int has_non_ascii(const char *s)
|
||||||
return 0;
|
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)
|
static int is_rfc2047_special(char ch)
|
||||||
{
|
{
|
||||||
return (non_ascii(ch) || (ch == '=') || (ch == '?') || (ch == '_'));
|
return (non_ascii(ch) || (ch == '=') || (ch == '?') || (ch == '_'));
|
||||||
|
@ -294,7 +346,14 @@ void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
|
||||||
name_tail--;
|
name_tail--;
|
||||||
display_name_length = name_tail - line;
|
display_name_length = name_tail - line;
|
||||||
strbuf_addstr(sb, "From: ");
|
strbuf_addstr(sb, "From: ");
|
||||||
|
if (!has_rfc822_specials(line, display_name_length)) {
|
||||||
add_rfc2047(sb, line, display_name_length, encoding);
|
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++)
|
for (final_line = 0; final_line < sb->len; final_line++)
|
||||||
if (sb->buf[sb->len - final_line - 1] == '\n')
|
if (sb->buf[sb->len - final_line - 1] == '\n')
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -808,4 +808,47 @@ test_expect_success 'format-patch wraps non-quotable headers' '
|
||||||
sed -n "/^From: /p; /^ /p; /^$/q" <patch >from &&
|
sed -n "/^From: /p; /^ /p; /^$/q" <patch >from &&
|
||||||
test_cmp expect 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
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue