git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v7a 2/9] diff --stat: use the full terminal width

From
Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Date
Mar 1, 2012, 12:26 UTC
Message-ID
<1330604806-30288-2-git-send-email-zbyszek@in.waw.pl>
In-Reply-To
<1330604806-30288-1-git-send-email-zbyszek@in.waw.pl>

Default to the real terminal width for diff --stat output, instead of the hard-coded 80 columns.

Some projects (especially in Java), have long filename paths, with nested directories or long individual filenames. When files are renamed, the filename part in stat output can be almost useless. If the middle part between { and } is long (because the file was moved to a completely different directory), then most of the path would be truncated.

It makes sense to detect and use the full terminal width and display full filenames if possible.

The are commands like diff, show, and log, which can adapt the output to the terminal width. There are also commands like format-patch, whose output should be independent of the terminal width. Since it is safer to use the 80-column default, the real terminal width is only used if requested by the calling code by setting diffopts.stat_width=-1. Normally this value is 0, and can be set by the user only to a non-negative value, so -1 is safe to use internally.

This patch only changes the diff builtin to use the full terminal width.
Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin/diff.c         |    3 +++
 diff.c                 |    5 ++++-
 t/t4052-stat-output.sh |   11 +++++++++--
 3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/builtin/diff.c b/builtin/diff.c
index 387afa7..81b6bae 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -285,6 +285,9 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 	/* Otherwise, we are doing the usual "git" diff */
 	rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
 
+	/* Scale to real terminal size */
+	rev.diffopt.stat_width = -1;
+
 	/* Default to let external and textconv be used */
 	DIFF_OPT_SET(&rev.diffopt, ALLOW_EXTERNAL);
 	DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);
diff --git a/diff.c b/diff.c
index e0590a3..7478277 100644
--- a/diff.c
+++ b/diff.c
@@ -1343,7 +1343,10 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
 		line_prefix = msg->buf;
 	}
 
-	width = options->stat_width ? options->stat_width : 80;
+	if (options->stat_width == -1)
+		width = term_columns();
+	else
+		width = options->stat_width ? options->stat_width : 80;
 	name_width = options->stat_name_width ? options->stat_name_width : 50;
 	count = options->stat_count ? options->stat_count : data->nr;
 
diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh
index f766c47..29c06e5 100755
--- a/t/t4052-stat-output.sh
+++ b/t/t4052-stat-output.sh
@@ -83,6 +83,10 @@ cat >expect80 <<'EOF'
  abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 EOF
 
+cat >expect200 <<'EOF'
+ abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+EOF
+
 while read verb expect cmd args
 do
 	test_expect_success "$cmd $verb COLUMNS (big change)" '
@@ -92,7 +96,7 @@ do
 	'
 done <<\EOF
 ignores expect80 format-patch -1 --stdout
-ignores expect80 diff HEAD^ HEAD --stat
+respects expect200 diff HEAD^ HEAD --stat
 ignores expect80 show --stat
 ignores expect80 log -1 --stat
 EOF
@@ -146,6 +150,9 @@ EOF
 cat >expect80 <<'EOF'
  ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++
 EOF
+cat >expect200 <<'EOF'
+ ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+EOF
 while read verb expect cmd args
 do
 	test_expect_success "$cmd $verb COLUMNS (long filename)" '
@@ -155,7 +162,7 @@ do
 	'
 done <<\EOF
 ignores expect80 format-patch -1 --stdout
-ignores expect80 diff HEAD^ HEAD --stat
+respects expect200 diff HEAD^ HEAD --stat
 ignores expect80 show --stat
 ignores expect80 log -1 --stat
 EOF
-- 
1.7.9.2.399.gdf4d.dirty
Previous: Zbigniew Jędrzejewski-SzmekNext: Zbigniew Jędrzejewski-Szmek
Message 9 of 23 in “Incremental updates to What's cooking”
  1. Junio C HamanoFeb 28, 2012
  2. Zbigniew Jędrzejewski-SzmekFeb 29, 2012
  3. Junio C HamanoFeb 29, 2012
  4. Zbigniew Jędrzejewski-SzmekFeb 29, 2012
  5. Junio C HamanoFeb 29, 2012
  6. Zbigniew Jędrzejewski-SzmekFeb 29, 2012
  7. Junio C HamanoFeb 29, 2012
  8. 1/9 diff --stat: tests for long filenames and big change countsZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  9. 2/9 diff --stat: use the full terminal widthZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  10. 3/9 show --stat: use the full terminal widthZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  11. 4/9 log --stat: use the full terminal widthZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  12. 5/9 merge --stat: use the full terminal widthZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  13. 6/9 diff --stat: use a maximum of 5/8 for the filename partZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  14. Junio C HamanoMar 1, 2012
  15. Jeff KingMar 26, 2012
  16. t4052: unset $COLUMNS inherited from environmentZbigniew Jędrzejewski-Szmek, Mar 27, 2012
  17. Jeff KingMar 27, 2012
  18. tests: unset COLUMNS inherited from environmentZbigniew Jędrzejewski-Szmek, Mar 27, 2012
  19. Jeff KingMar 27, 2012
  20. Johannes SixtMar 27, 2012
  21. 7/9 diff --stat: add a test for output with COLUMNS=40Zbigniew Jędrzejewski-Szmek, Mar 1, 2012
  22. 8/9 diff --stat: enable limiting of the graph partZbigniew Jędrzejewski-Szmek, Mar 1, 2012
  23. 9/9 diff --stat: add config option to limit graph widthZbigniew Jędrzejewski-Szmek, Mar 1, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.