pretty.c: format string with truncate respects logOutputEncoding

Pretty format string %<(N,[ml]trunc)>%s truncates subject to a given length with an appropriate padding. This works for non-ASCII texts when i18n.logOutputEncoding is UTF-8 only (independently of a printed commit message encoding) but does not work when i18n.logOutputEncoding is NOT UTF-8. In 7e77df3 (pretty: two phase conversion for non utf-8 commits, 2013-04-19) 'format_commit_item' function assumes commit message to be in UTF-8. And that was so until ecaee80 (pretty: --format output should honor logOutputEncoding, 2013-06-26) where conversion to logOutputEncoding was added before calling 'format_commit_message'. Correct this by converting a commit message to UTF-8 first (as it assumed in 7e77df3 (pretty: two phase conversion for non utf-8 commits, 2013-04-19)). Only after that convert a commit message to an actual logOutputEncoding. Signed-off-by: Alexey Shumkin <Alex.Crezoff@gmail.com> Reviewed-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Alexey Shumkin committed May 21, 2014 at 17:20 UTC 7d509878b845a2a895cc880b833a016a06199981
3 files changed +13 -8
pretty.c
+6 -1
@@ -1506,13 +1506,18 @@ void format_commit_message(const struct commit *commit,
1506 context.commit = commit;
1507 context.pretty_ctx = pretty_ctx;
1508 context.wrap_start = sb->len;
1509 + /*
1510 + * convert a commit message to UTF-8 first
1511 + * as far as 'format_commit_item' assumes it in UTF-8
1512 + */
1513 context.message = logmsg_reencode(commit,
1514 &context.commit_encoding,
1511 - output_enc);
1515 + utf8);
1516
1517 strbuf_expand(sb, format, format_commit_item, &context);
1518 rewrap_message_tail(sb, &context, 0, 0, 0);
1519
1520 + /* then convert a commit message to an actual output encoding */
1521 if (output_enc) {
1522 if (same_encoding(utf8, output_enc))
1523 output_enc = NULL;
t/t4205-log-pretty-formats.sh
+4 -4
@@ -220,7 +220,7 @@ EOF
220 test_cmp expected actual
221 '
222
223 -test_expect_failure 'left alignment formatting with trunc. i18n.logOutputEncoding' '
223 +test_expect_success 'left alignment formatting with trunc. i18n.logOutputEncoding' '
224 git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s" >actual &&
225 qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
226 message ..
@@ -242,7 +242,7 @@ EOF
242 test_cmp expected actual
243 '
244
245 -test_expect_failure 'left alignment formatting with ltrunc. i18n.logOutputEncoding' '
245 +test_expect_success 'left alignment formatting with ltrunc. i18n.logOutputEncoding' '
246 git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,ltrunc)%s" >actual &&
247 qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
248 ..sage two
@@ -264,7 +264,7 @@ EOF
264 test_cmp expected actual
265 '
266
267 -test_expect_failure 'left alignment formatting with mtrunc. i18n.logOutputEncoding' '
267 +test_expect_success 'left alignment formatting with mtrunc. i18n.logOutputEncoding' '
268 git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,mtrunc)%s" >actual &&
269 qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
270 mess.. two
@@ -420,7 +420,7 @@ initial... A U Thor
420 EOF
421 test_cmp expected actual
422 '
423 -test_expect_failure 'left/right alignment formatting with stealing. i18n.logOutputEncoding' '
423 +test_expect_success 'left/right alignment formatting with stealing. i18n.logOutputEncoding' '
424 git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
425 cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
426 short long long long
t/t6006-rev-list-format.sh
+3 -3
@@ -256,7 +256,7 @@ commit $head1
256 $added_iso88591
257 EOF
258
259 -test_format complex-subject-trunc "%<($truncate_count,trunc)%s" failure <<EOF
259 +test_format complex-subject-trunc "%<($truncate_count,trunc)%s" <<EOF
260 commit $head3
261 Test printing of c..
262 commit $head2
@@ -265,7 +265,7 @@ commit $head1
265 added (hinzugef${added_utf8_part_iso88591}gt..
266 EOF
267
268 -test_format complex-subject-mtrunc "%<($truncate_count,mtrunc)%s" failure <<EOF
268 +test_format complex-subject-mtrunc "%<($truncate_count,mtrunc)%s" <<EOF
269 commit $head3
270 Test prin..ex bodies
271 commit $head2
@@ -274,7 +274,7 @@ commit $head1
274 added (hi..f${added_utf8_part_iso88591}gt) foo
275 EOF
276
277 -test_format complex-subject-ltrunc "%<($truncate_count,ltrunc)%s" failure <<EOF
277 +test_format complex-subject-ltrunc "%<($truncate_count,ltrunc)%s" <<EOF
278 commit $head3
279 .. of complex bodies
280 commit $head2