format-patch: do not wrap non-rfc2047 headers too early

Do not wrap the second and later lines of non-rfc2047-encoded headers
substantially before the 78 character limit.

Instead of passing the remaining length of the first line as wrapping
width, use the correct maximum length and tell strbuf_add_wrapped_bytes()
how many characters of the first line are already used.

Signed-off-by: Jan H. Schönherr <schnhrr@cs.tu-berlin.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jan H. Schönherr 2012-10-18 16:43:29 +02:00 committed by Junio C Hamano
parent 14e1a4e1ff
commit 7a76e68a17
2 changed files with 35 additions and 27 deletions

View File

@ -286,7 +286,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
if ((i + 1 < len) && (ch == '=' && line[i+1] == '?')) if ((i + 1 < len) && (ch == '=' && line[i+1] == '?'))
goto needquote; goto needquote;
} }
strbuf_add_wrapped_bytes(sb, line, len, 0, 1, max_length - line_len); strbuf_add_wrapped_bytes(sb, line, len, -line_len, 1, max_length);
return; return;


needquote: needquote:

View File

@ -752,16 +752,14 @@ M64=$M8$M8$M8$M8$M8$M8$M8$M8
M512=$M64$M64$M64$M64$M64$M64$M64$M64 M512=$M64$M64$M64$M64$M64$M64$M64$M64
cat >expect <<'EOF' cat >expect <<'EOF'
Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar
EOF EOF
test_expect_success 'format-patch wraps extremely long headers (ascii)' ' test_expect_success 'format-patch wraps extremely long subject (ascii)' '
echo content >>file && echo content >>file &&
git add file && git add file &&
git commit -m "$M512" && git commit -m "$M512" &&
@ -807,28 +805,12 @@ test_expect_success 'format-patch wraps extremely long headers (rfc2047)' '
test_cmp expect subject 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() { check_author() {
echo content >>file && echo content >>file &&
git add file && git add file &&
GIT_AUTHOR_NAME=$1 git commit -m author-check && GIT_AUTHOR_NAME=$1 git commit -m author-check &&
git format-patch --stdout -1 >patch && git format-patch --stdout -1 >patch &&
grep ^From: patch >actual && sed -n "/^From: /p; /^ /p; /^$/q" <patch >actual &&
test_cmp expect actual test_cmp expect actual
} }


@ -853,6 +835,32 @@ test_expect_success 'rfc2047-encoded headers also double-quote 822 specials' '
check_author "Föo B. Bar" check_author "Föo B. Bar"
' '


cat >expect <<EOF
From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_
<author@example.com>
EOF
test_expect_success 'format-patch wraps moderately long from-header (ascii)' '
check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_"
'

cat >expect <<'EOF'
From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
Bar Foo Bar Foo Bar Foo Bar <author@example.com>
EOF
test_expect_success 'format-patch wraps extremely long from-header (ascii)' '
check_author "Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar"
'

cat >expect <<'EOF'
From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
Bar Foo Bar Foo Bar Foo Bar" <author@example.com>
EOF
test_expect_success 'format-patch wraps extremely long from-header (rfc822)' '
check_author "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar"
'

cat >expect <<'EOF' cat >expect <<'EOF'
Subject: header with . in it Subject: header with . in it
EOF EOF