diff --stat: enable limiting of the graph part
A new option --stat-graph-width=<width> can be used to limit the width of the graph part even is more space is available. Up to <width> columns will be used for the graph. 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 can be hard to comfortably scan with a horizontal movement of human eyes. Messages wrapped to about 80 columns would be interspersed with very long +- lines. It makes sense to limit the width of the graph part to a fixed value (e.g. 70 columns), even if more columns are available. Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
c4432d5511
commit
969fe57b84
@ -59,6 +59,8 @@ endif::git-format-patch[]
|
|||||||
or 80 columns if not connected to a terminal, and can be
|
or 80 columns if not connected to a terminal, and can be
|
||||||
overriden by `<width>`. The width of the filename part can be
|
overriden by `<width>`. The width of the filename part can be
|
||||||
limited by giving another width `<name-width>` after a comma.
|
limited by giving another width `<name-width>` after a comma.
|
||||||
|
The width of the graph part can be limited by using
|
||||||
|
`--stat-graph-width=<width>`.
|
||||||
By giving a third parameter `<count>`, you can limit the
|
By giving a third parameter `<count>`, you can limit the
|
||||||
output to the first `<count>` lines, followed by `...` if
|
output to the first `<count>` lines, followed by `...` if
|
||||||
there are more.
|
there are more.
|
||||||
|
23
diff.c
23
diff.c
@ -1375,13 +1375,15 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
|
|||||||
/*
|
/*
|
||||||
* We have width = stat_width or term_columns() columns total.
|
* We have width = stat_width or term_columns() columns total.
|
||||||
* We want a maximum of min(max_len, stat_name_width) for the name part.
|
* We want a maximum of min(max_len, stat_name_width) for the name part.
|
||||||
|
* We want a maximum of min(max_change, stat_graph_width) for the +- part.
|
||||||
* We also need 1 for " " and 4 + decimal_width(max_change)
|
* We also need 1 for " " and 4 + decimal_width(max_change)
|
||||||
* for " | NNNN " and one the empty column at the end, altogether
|
* for " | NNNN " and one the empty column at the end, altogether
|
||||||
* 6 + decimal_width(max_change).
|
* 6 + decimal_width(max_change).
|
||||||
*
|
*
|
||||||
* If there's not enough space, we will use the smaller of
|
* If there's not enough space, we will use the smaller of
|
||||||
* stat_name_width (if set) and 5/8*width for the filename,
|
* stat_name_width (if set) and 5/8*width for the filename,
|
||||||
* and the rest for constant elements + graph part.
|
* and the rest for constant elements + graph part, but no more
|
||||||
|
* than stat_graph_width for the graph part.
|
||||||
* (5/8 gives 50 for filename and 30 for the constant parts + graph
|
* (5/8 gives 50 for filename and 30 for the constant parts + graph
|
||||||
* for the standard terminal size).
|
* for the standard terminal size).
|
||||||
*
|
*
|
||||||
@ -1406,7 +1408,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
|
|||||||
/*
|
/*
|
||||||
* First assign sizes that are wanted, ignoring available width.
|
* First assign sizes that are wanted, ignoring available width.
|
||||||
*/
|
*/
|
||||||
graph_width = max_change;
|
graph_width = (options->stat_graph_width &&
|
||||||
|
options->stat_graph_width < max_change) ?
|
||||||
|
options->stat_graph_width : max_change;
|
||||||
name_width = (options->stat_name_width > 0 &&
|
name_width = (options->stat_name_width > 0 &&
|
||||||
options->stat_name_width < max_len) ?
|
options->stat_name_width < max_len) ?
|
||||||
options->stat_name_width : max_len;
|
options->stat_name_width : max_len;
|
||||||
@ -1417,6 +1421,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
|
|||||||
if (name_width + number_width + 6 + graph_width > width) {
|
if (name_width + number_width + 6 + graph_width > width) {
|
||||||
if (graph_width > width * 3/8 - number_width - 6)
|
if (graph_width > width * 3/8 - number_width - 6)
|
||||||
graph_width = width * 3/8 - number_width - 6;
|
graph_width = width * 3/8 - number_width - 6;
|
||||||
|
if (options->stat_graph_width &&
|
||||||
|
graph_width > options->stat_graph_width)
|
||||||
|
graph_width = options->stat_graph_width;
|
||||||
if (name_width > width - number_width - 6 - graph_width)
|
if (name_width > width - number_width - 6 - graph_width)
|
||||||
name_width = width - number_width - 6 - graph_width;
|
name_width = width - number_width - 6 - graph_width;
|
||||||
else
|
else
|
||||||
@ -3289,6 +3296,7 @@ static int stat_opt(struct diff_options *options, const char **av)
|
|||||||
char *end;
|
char *end;
|
||||||
int width = options->stat_width;
|
int width = options->stat_width;
|
||||||
int name_width = options->stat_name_width;
|
int name_width = options->stat_name_width;
|
||||||
|
int graph_width = options->stat_graph_width;
|
||||||
int count = options->stat_count;
|
int count = options->stat_count;
|
||||||
int argcount = 1;
|
int argcount = 1;
|
||||||
|
|
||||||
@ -3317,6 +3325,16 @@ static int stat_opt(struct diff_options *options, const char **av)
|
|||||||
name_width = strtoul(av[1], &end, 10);
|
name_width = strtoul(av[1], &end, 10);
|
||||||
argcount = 2;
|
argcount = 2;
|
||||||
}
|
}
|
||||||
|
} else if (!prefixcmp(arg, "-graph-width")) {
|
||||||
|
arg += strlen("-graph-width");
|
||||||
|
if (*arg == '=')
|
||||||
|
graph_width = strtoul(arg + 1, &end, 10);
|
||||||
|
else if (!*arg && !av[1])
|
||||||
|
die("Option '--stat-graph-width' requires a value");
|
||||||
|
else if (!*arg) {
|
||||||
|
graph_width = strtoul(av[1], &end, 10);
|
||||||
|
argcount = 2;
|
||||||
|
}
|
||||||
} else if (!prefixcmp(arg, "-count")) {
|
} else if (!prefixcmp(arg, "-count")) {
|
||||||
arg += strlen("-count");
|
arg += strlen("-count");
|
||||||
if (*arg == '=')
|
if (*arg == '=')
|
||||||
@ -3342,6 +3360,7 @@ static int stat_opt(struct diff_options *options, const char **av)
|
|||||||
return 0;
|
return 0;
|
||||||
options->output_format |= DIFF_FORMAT_DIFFSTAT;
|
options->output_format |= DIFF_FORMAT_DIFFSTAT;
|
||||||
options->stat_name_width = name_width;
|
options->stat_name_width = name_width;
|
||||||
|
options->stat_graph_width = graph_width;
|
||||||
options->stat_width = width;
|
options->stat_width = width;
|
||||||
options->stat_count = count;
|
options->stat_count = count;
|
||||||
return argcount;
|
return argcount;
|
||||||
|
1
diff.h
1
diff.h
@ -129,6 +129,7 @@ struct diff_options {
|
|||||||
|
|
||||||
int stat_width;
|
int stat_width;
|
||||||
int stat_name_width;
|
int stat_name_width;
|
||||||
|
int stat_graph_width;
|
||||||
int stat_count;
|
int stat_count;
|
||||||
const char *word_regex;
|
const char *word_regex;
|
||||||
enum diff_words_type word_diff;
|
enum diff_words_type word_diff;
|
||||||
|
@ -136,6 +136,12 @@ do
|
|||||||
grep " | " output >actual &&
|
grep " | " output >actual &&
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success "$cmd --stat-graph--width with big change" '
|
||||||
|
git $cmd $args --stat-graph-width=26 >output
|
||||||
|
grep " | " output >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
done <<\EOF
|
done <<\EOF
|
||||||
format-patch -1 --stdout
|
format-patch -1 --stdout
|
||||||
diff HEAD^ HEAD --stat
|
diff HEAD^ HEAD --stat
|
||||||
|
Reference in New Issue
Block a user