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>

Jan H. Schönherr committed Oct 18, 2012 at 16:43 UTC 7a76e68a177720da65e7d9cfa49d702a55e2d9de
2 files changed +35 -27
pretty.c
+1 -1
@@ -286,7 +286,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
286 if ((i + 1 < len) && (ch == '=' && line[i+1] == '?'))
287 goto needquote;
288 }
289 - strbuf_add_wrapped_bytes(sb, line, len, 0, 1, max_length - line_len);
289 + strbuf_add_wrapped_bytes(sb, line, len, -line_len, 1, max_length);
290 return;
291
292 needquote:
t/t4014-format-patch.sh
+34 -26
@@ -752,16 +752,14 @@ M64=$M8$M8$M8$M8$M8$M8$M8$M8
752 M512=$M64$M64$M64$M64$M64$M64$M64$M64
753 cat >expect <<'EOF'
754 Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
755 - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
756 - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
757 - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
758 - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
759 - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
760 - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
761 - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
762 - foo bar foo bar foo bar foo bar
755 + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
756 + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
757 + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
758 + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
759 + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
760 + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
761 EOF
764 -test_expect_success 'format-patch wraps extremely long headers (ascii)' '
762 +test_expect_success 'format-patch wraps extremely long subject (ascii)' '
763 echo content >>file &&
764 git add file &&
765 git commit -m "$M512" &&
@@ -807,28 +805,12 @@ test_expect_success 'format-patch wraps extremely long headers (rfc2047)' '
805 test_cmp expect subject
806 '
807
810 -M8="foo_bar_"
811 -M64=$M8$M8$M8$M8$M8$M8$M8$M8
812 -cat >expect <<EOF
813 -From: $M64
814 - <foobar@foo.bar>
815 -EOF
816 -test_expect_success 'format-patch wraps non-quotable headers' '
817 - rm -rf patches/ &&
818 - echo content >>file &&
819 - git add file &&
820 - git commit -mfoo --author "$M64 <foobar@foo.bar>" &&
821 - git format-patch --stdout -1 >patch &&
822 - sed -n "/^From: /p; /^ /p; /^$/q" <patch >from &&
823 - test_cmp expect from
824 -'
825 -
808 check_author() {
809 echo content >>file &&
810 git add file &&
811 GIT_AUTHOR_NAME=$1 git commit -m author-check &&
812 git format-patch --stdout -1 >patch &&
831 - grep ^From: patch >actual &&
813 + sed -n "/^From: /p; /^ /p; /^$/q" <patch >actual &&
814 test_cmp expect actual
815 }
816
@@ -853,6 +835,32 @@ test_expect_success 'rfc2047-encoded headers also double-quote 822 specials' '
835 check_author "Föo B. Bar"
836 '
837
838 +cat >expect <<EOF
839 +From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_
840 + <author@example.com>
841 +EOF
842 +test_expect_success 'format-patch wraps moderately long from-header (ascii)' '
843 + check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_"
844 +'
845 +
846 +cat >expect <<'EOF'
847 +From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
848 + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
849 + Bar Foo Bar Foo Bar Foo Bar <author@example.com>
850 +EOF
851 +test_expect_success 'format-patch wraps extremely long from-header (ascii)' '
852 + 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"
853 +'
854 +
855 +cat >expect <<'EOF'
856 +From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
857 + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
858 + Bar Foo Bar Foo Bar Foo Bar" <author@example.com>
859 +EOF
860 +test_expect_success 'format-patch wraps extremely long from-header (rfc822)' '
861 + 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"
862 +'
863 +
864 cat >expect <<'EOF'
865 Subject: header with . in it
866 EOF