From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: Jeff King <peff@peff.net>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: [PATCH v3 1/5] pretty-print: de-tabify indented logs to make things line up properly
Date: Wed, 23 Mar 2016 16:23:42 -0700 [thread overview]
Message-ID: <1458775426-2215-2-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1458775426-2215-1-git-send-email-gitster@pobox.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
A commit log message sometimes tries to line things up using tabs,
assuming fixed-width font with the standard 8-place tab settings.
Viewing such a commit however does not work well in "git log", as we
indent the lines by prefixing 4 spaces in front of them.
This should all line up:
Column 1 Column 2
-------- --------
A B
ABCD EFGH
SPACES Instead of Tabs
Even with multi-byte UTF8 characters:
Column 1 Column 2
-------- --------
Ä B
åäö 100
A Møøse once bit my sister..
Tab-expand the lines in "git log --pretty=medium" output (which is
the default), before prefixing 4 spaces.
This breaks a few tests in t4201, that tests "git shortlog".
- One passes "git log" output to "git shortlog" to use the latter
as a filter and does not expect the output of the former to be
de-tabified.
- The other expects that "git shortlog", when it reads the first
line of the commit and produces the output itself, does not
de-tabify it.
Mark them as expecting failure for now.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
pretty.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++--
t/t4201-shortlog.sh | 4 +--
2 files changed, 76 insertions(+), 4 deletions(-)
diff --git a/pretty.c b/pretty.c
index 92b2870..0b40457 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1629,6 +1629,76 @@ void pp_title_line(struct pretty_print_context *pp,
strbuf_release(&title);
}
+static int pp_utf8_width(const char *start, const char *end)
+{
+ int width = 0;
+ size_t remain = end - start;
+
+ while (remain) {
+ int n = utf8_width(&start, &remain);
+ if (n < 0 || !start)
+ return -1;
+ width += n;
+ }
+ return width;
+}
+
+/*
+ * pp_handle_indent() prints out the intendation, and
+ * perhaps the whole line (without the final newline)
+ *
+ * Why "perhaps"? If there are tabs in the indented line
+ * it will print it out in order to de-tabify the line.
+ *
+ * But if there are no tabs, we just fall back on the
+ * normal "print the whole line".
+ */
+static int pp_handle_indent(struct strbuf *sb, int indent,
+ const char *line, int linelen)
+{
+ const char *tab;
+
+ strbuf_addchars(sb, ' ', indent);
+
+ tab = memchr(line, '\t', linelen);
+ if (!tab)
+ return 0;
+
+ do {
+ int width = pp_utf8_width(line, tab);
+
+ /*
+ * If it wasn't well-formed utf8, or it
+ * had characters with badly defined
+ * width (control characters etc), just
+ * give up on trying to align things.
+ */
+ if (width < 0)
+ break;
+
+ /* Output the data .. */
+ strbuf_add(sb, line, tab - line);
+
+ /* .. and the de-tabified tab */
+ strbuf_addchars(sb, ' ', 8-(width & 7));
+
+ /* Skip over the printed part .. */
+ linelen -= 1+tab-line;
+ line = tab + 1;
+
+ /* .. and look for the next tab */
+ tab = memchr(line, '\t', linelen);
+ } while (tab);
+
+ /*
+ * Print out everything after the last tab without
+ * worrying about width - there's nothing more to
+ * align.
+ */
+ strbuf_add(sb, line, linelen);
+ return 1;
+}
+
void pp_remainder(struct pretty_print_context *pp,
const char **msg_p,
struct strbuf *sb,
@@ -1652,8 +1722,10 @@ void pp_remainder(struct pretty_print_context *pp,
first = 0;
strbuf_grow(sb, linelen + indent + 20);
- if (indent)
- strbuf_addchars(sb, ' ', indent);
+ if (indent) {
+ if (pp_handle_indent(sb, indent, line, linelen))
+ linelen = 0;
+ }
strbuf_add(sb, line, linelen);
strbuf_addch(sb, '\n');
}
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 7600a3e..987b708 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -93,7 +93,7 @@ test_expect_success 'output from user-defined format is re-wrapped' '
test_cmp expect log.predictable
'
-test_expect_success !MINGW 'shortlog wrapping' '
+test_expect_failure !MINGW 'shortlog wrapping' '
cat >expect <<\EOF &&
A U Thor (5):
Test
@@ -114,7 +114,7 @@ EOF
test_cmp expect out
'
-test_expect_success !MINGW 'shortlog from non-git directory' '
+test_expect_failure !MINGW 'shortlog from non-git directory' '
git log HEAD >log &&
GIT_DIR=non-existing git shortlog -w <log >out &&
test_cmp expect out
--
2.8.0-rc4-198-g3f6b64c
next prev parent reply other threads:[~2016-03-23 23:23 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 16:29 [PATCH] pretty-print: de-tabify indented logs to make things line up properly Linus Torvalds
2016-03-16 16:52 ` Linus Torvalds
2016-03-16 18:01 ` Junio C Hamano
2016-03-16 18:21 ` Linus Torvalds
2016-03-16 19:32 ` Junio C Hamano
2016-03-16 19:47 ` Junio C Hamano
2016-03-16 19:59 ` Linus Torvalds
2016-03-16 21:37 ` Junio C Hamano
2016-03-16 22:04 ` Linus Torvalds
2016-03-17 23:13 ` [PATCH v2 1/4] " Junio C Hamano
2016-03-17 23:15 ` [PATCH v2 2/4] pretty-print: simplify the interaction between pp_handle_indent() and its caller Junio C Hamano
2016-03-17 23:15 ` [PATCH v2 3/4] pretty-print: further abstract out pp_handle_indent() Junio C Hamano
2016-03-17 23:16 ` [PATCH 4/4] pretty-print: add --pretty=noexpand Junio C Hamano
2016-03-17 23:23 ` Linus Torvalds
2016-03-17 23:40 ` Junio C Hamano
2016-03-18 5:08 ` Jeff King
2016-03-18 5:36 ` Linus Torvalds
2016-03-18 5:55 ` Jeff King
2016-03-18 5:44 ` Junio C Hamano
2016-03-23 23:23 ` [PATCH v3 0/5] Expanding tabs in "git log" output Junio C Hamano
2016-03-23 23:23 ` Junio C Hamano [this message]
2016-03-23 23:23 ` [PATCH v3 2/5] pretty-print: simplify the interaction between pp_handle_indent() and its caller Junio C Hamano
2016-03-23 23:23 ` [PATCH v3 3/5] pretty-print: further abstract out pp_handle_indent() Junio C Hamano
2016-03-23 23:23 ` [PATCH v3 4/5] pretty-print: limit expand-tabs to selected --pretty formats Junio C Hamano
2016-03-23 23:23 ` [PATCH v3 5/5] pretty-print: teach "--no-expand-tabs" option to "git log" Junio C Hamano
2016-03-23 23:47 ` [PATCH v3 0/5] Expanding tabs in "git log" output Linus Torvalds
2016-03-24 0:58 ` Jeff King
2016-03-24 5:17 ` Junio C Hamano
2016-03-24 7:05 ` Torsten Bögershausen
2016-03-24 15:37 ` Junio C Hamano
2016-03-24 18:22 ` Junio C Hamano
2016-03-25 9:34 ` Torsten Bögershausen
2016-03-25 14:13 ` Torsten Bögershausen
2016-03-25 16:41 ` Junio C Hamano
2016-03-25 16:25 ` Junio C Hamano
2016-03-29 23:15 ` [PATCH v4 0/3] " Junio C Hamano
2016-03-29 23:15 ` [PATCH v4 1/3] pretty: expand tabs in indented logs to make things line up properly Junio C Hamano
2016-03-30 0:17 ` Eric Sunshine
2016-03-30 18:20 ` Junio C Hamano
2016-03-29 23:15 ` [PATCH v4 2/3] pretty: enable --expand-tabs by default for selected pretty formats Junio C Hamano
2016-03-30 1:38 ` Jeff King
2016-03-30 19:18 ` Junio C Hamano
2016-03-29 23:15 ` [PATCH v4 3/3] pretty: allow tweaking tabwidth in --expand-tabs Junio C Hamano
2016-04-05 0:58 ` [PATCH v5 0/4] Expanding tabs in "git log" output Junio C Hamano
2016-04-05 0:58 ` [PATCH v5 1/4] pretty: expand tabs in indented logs to make things line up properly Junio C Hamano
2016-04-05 0:58 ` [PATCH v5 2/4] pretty: enable --expand-tabs by default for selected pretty formats Junio C Hamano
2016-04-05 0:58 ` [PATCH v5 3/4] pretty: allow tweaking tabwidth in --expand-tabs Junio C Hamano
2016-04-05 0:58 ` [PATCH v5 4/4] pretty: test --expand-tabs Junio C Hamano
2016-04-05 1:10 ` Eric Sunshine
2016-04-05 1:47 ` Jeff King
2016-04-05 6:25 ` Junio C Hamano
2016-04-05 1:52 ` Jeff King
2016-04-05 6:32 ` Junio C Hamano
2016-04-05 7:13 ` Perry Hutchison
2016-04-05 1:53 ` [PATCH v5 0/4] Expanding tabs in "git log" output Jeff King
2016-03-16 19:50 ` [PATCH] pretty-print: de-tabify indented logs to make things line up properly Linus Torvalds
2016-03-16 21:55 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458775426-2215-2-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.