Some projects (especially in Java), have long filename paths, with nested directories or long individual filenames. When files are renamed, the 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 use the full terminal width. If commits changing a lot of lines are displayed in a wide terminal window (200 or more columns), and the +- graph uses the full width, the output looks bad. Messages wrapped to about 80 columns are interspersed with very long +- lines. It makes sense to limit the width of the graph to a fixed value, even if more columns are available. This fixed value is subjectively hard-coded to be 40 columns, but seems to work well for git.git and linux-2.6.git and other repositories. Three tests are added: the first one check that --stat output for a long file name is the same as previously (the test should pass independently of this patch). The last two check that --stat output with a massive change uses only 40 columns for +- in graph output. Those two tests are dependent on this patch. Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@xxxxxxxxx> --- diff.c | 26 ++++++++++++++------------ t/t4014-format-patch.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/diff.c b/diff.c index 84780fd..8176d74 100644 --- a/diff.c +++ b/diff.c @@ -7,6 +7,7 @@ #include "diffcore.h" #include "delta.h" #include "xdiff-interface.h" +#include "help.h" #include "color.h" #include "attr.h" #include "run-command.h" @@ -1376,7 +1377,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) int i, len, add, del, adds = 0, dels = 0; uintmax_t max_change = 0, max_len = 0; int total_files = data->nr; - int width, name_width, count; + int width, name_width, graph_width, count; const char *reset, *add_c, *del_c; const char *line_prefix = ""; int extra_shown = 0; @@ -1390,8 +1391,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) line_prefix = msg->buf; } - width = options->stat_width ? options->stat_width : 80; - name_width = options->stat_name_width ? options->stat_name_width : 50; + width = options->stat_width ? options->stat_width : term_columns(); + name_width = options->stat_name_width ? options->stat_name_width + : width * 5/8; /* this gives 50 if not on tty */ count = options->stat_count ? options->stat_count : data->nr; /* Sanity: give at least 5 columns to the graph, @@ -1433,14 +1435,14 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) * 10 is for one blank at the beginning of the line plus * " | count " between the name and the graph. * - * From here on, name_width is the width of the name area, - * and width is the width of the graph area. + * From here name_width is the width of the name area, + * and graph_width is the width of the graph area. + * max_change is used to scale graph properly. */ name_width = (name_width < max_len) ? name_width : max_len; - if (width < (name_width + 10) + max_change) - width = width - (name_width + 10); - else - width = max_change; + graph_width = max_change < 40 ? max_change : 40; + if (width < (name_width + 10) + graph_width) + graph_width = width - (name_width + 10); for (i = 0; i < count; i++) { const char *prefix = ""; @@ -1497,9 +1499,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) adds += add; dels += del; - if (width <= max_change) { - add = scale_linear(add, width, max_change); - del = scale_linear(del, width, max_change); + if (graph_width <= max_change) { + add = scale_linear(add, graph_width, max_change); + del = scale_linear(del, graph_width, max_change); } fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 7dfe716..bd3002b 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -894,4 +894,44 @@ test_expect_success 'format patch ignores color.ui' ' test_cmp expect actual ' +cat >expect <<'EOF' + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + +EOF +name=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +test_expect_success 'format patch filename width is limited' " + > ${name} && + git add ${name} && + git commit -m message && + echo a > ${name} && + git commit -m message ${name} && + git format-patch --stat --stdout -1 | + grep -m 1 aaaaa > actual && + test_cmp expect actual +" + +cat >expect <<'EOF' + abcd | 1000 ++++++++++++++++++++++++++++++++++++++++ +EOF +test_expect_success 'format patch graph width is 40 columns' ' + > abcd && + git add abcd && + git commit -m message && + seq 1000 > abcd && + git commit -m message abcd && + git format-patch --stat --stdout -1 | + grep -m 1 abcd > actual && + test_cmp expect actual +' + +test_expect_success 'format patch ignores COLUMNS' ' + > abcd && + git add abcd && + git commit -m message && + seq 1000 > abcd && + git commit -m message abcd && + COLUMNS=200 git format-patch --stat --stdout -1 | + grep -m 1 abcd > actual && + test_cmp expect actual +' + test_done -- 1.7.9.263.g4be11.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html