[PATCH 2/2] pretty.c: format string with truncate respects logOutputEncoding

2014-05-16 Thread Alexey Shumkin
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 set 'output_enc' variable to an actual
logOutputEncoding.

Signed-off-by: Alexey Shumkin alex.crez...@gmail.com
---
 pretty.c  | 7 +--
 t/t4205-log-pretty-formats.sh | 8 
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/pretty.c b/pretty.c
index 6e266dd..7eb43c1 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1500,16 +1500,19 @@ void format_commit_message(const struct commit *commit,
   const struct pretty_print_context *pretty_ctx)
 {
struct format_commit_context context;
-   const char *output_enc = pretty_ctx-output_encoding;
const char *utf8 = UTF-8;
 
memset(context, 0, sizeof(context));
context.commit = commit;
context.pretty_ctx = pretty_ctx;
context.wrap_start = sb-len;
+   // convert a commit message to UTF-8 first
+   // as far as 'format_commit_item' assumes it in UTF-8
context.message = logmsg_reencode(commit,
  context.commit_encoding,
- output_enc);
+ utf8);
+   // then convert to an actual output encoding
+   const char *output_enc = pretty_ctx-output_encoding;
 
strbuf_expand(sb, format, format_commit_item, context);
rewrap_message_tail(sb, context, 0, 0, 0);
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index 6791e0d..7426fe2 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -231,7 +231,7 @@ EOF
test_cmp expected actual
 '
 
-test_expect_failure 'left alignment formatting with trunc. 
i18n.logOutputEncoding' '
+test_expect_success 'left alignment formatting with trunc. 
i18n.logOutputEncoding' '
git -c i18n.logOutputEncoding=iso8859-1 log 
--pretty=format:%(10,trunc)%s actual 
# complete the incomplete line at the end
echo actual 
@@ -257,7 +257,7 @@ EOF
test_cmp expected actual
 '
 
-test_expect_failure 'left alignment formatting with ltrunc. 
i18n.logOutputEncoding' '
+test_expect_success 'left alignment formatting with ltrunc. 
i18n.logOutputEncoding' '
git -c i18n.logOutputEncoding=iso8859-1 log 
--pretty=format:%(10,ltrunc)%s actual 
# complete the incomplete line at the end
echo actual 
@@ -283,7 +283,7 @@ EOF
test_cmp expected actual
 '
 
-test_expect_failure 'left alignment formatting with mtrunc. 
i18n.logOutputEncoding' '
+test_expect_success 'left alignment formatting with mtrunc. 
i18n.logOutputEncoding' '
git -c i18n.logOutputEncoding=iso8859-1 log 
--pretty=format:%(10,mtrunc)%s actual 
# complete the incomplete line at the end
echo actual 
@@ -465,7 +465,7 @@ EOF
test_cmp expected actual
 '
 
-test_expect_failure 'left/right alignment formatting with stealing. 
i18n.logOutputEncoding' '
+test_expect_success 'left/right alignment formatting with stealing. 
i18n.logOutputEncoding' '
git commit --amend -m short --author long long long l...@me.com 
git -c i18n.logOutputEncoding=iso8859-1 log 
--pretty=format:%(10,trunc)%s%(10,ltrunc)% an actual 
# complete the incomplete line at the end
-- 
1.9.2-15

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] pretty.c: format string with truncate respects logOutputEncoding

2014-05-16 Thread Duy Nguyen
And I thought I was the only one using this :)

 diff --git a/pretty.c b/pretty.c
 index 6e266dd..7eb43c1 100644
 --- a/pretty.c
 +++ b/pretty.c
 @@ -1500,16 +1500,19 @@ void format_commit_message(const struct commit 
 *commit,
const struct pretty_print_context *pretty_ctx)
  {
 struct format_commit_context context;
 -   const char *output_enc = pretty_ctx-output_encoding;
 const char *utf8 = UTF-8;

 memset(context, 0, sizeof(context));
 context.commit = commit;
 context.pretty_ctx = pretty_ctx;
 context.wrap_start = sb-len;
 +   // convert a commit message to UTF-8 first
 +   // as far as 'format_commit_item' assumes it in UTF-8
 context.message = logmsg_reencode(commit,
   context.commit_encoding,
 - output_enc);
 + utf8);
 +   // then convert to an actual output encoding
 +   const char *output_enc = pretty_ctx-output_encoding;

 strbuf_expand(sb, format, format_commit_item, context);
 rewrap_message_tail(sb, context, 0, 0, 0);

It looks ok except minor issues, use C comment syntax, not C++ and
variable declaration not in the middle of the body.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html