Skip to content

Commit a20d3c0

Browse files
committed
diff --stat: move the "total count" logic to the last loop
The diffstat generation logic, with --stat-count limit, is implemented as three loops. - The first counts the width necessary to show stats up to specified number of entries, and notes up to how many entries in the data we need to iterate to show the graph; - The second iterates that many times to draw the graph, adjusts the number of "total modified files", and counts the total added/deleted lines for the part that was shown in the graph; - The third iterates over the remainder and only does the part to count "total added/deleted lines" and to adjust "total modified files" without drawing anything. Move the logic to count added/deleted lines and modified files from the second loop to the third loop. This incidentally fixes a bug. The third loop was not filtering binary changes (counted in bytes) from the total added/deleted as it should. The second loop implemented this correctly, so if a binary change appeared earlier than the --stat-count cutoff, the code counted number of added/deleted lines correctly, but if it appeared beyond the cutoff, the number of lines would have mixed with the byte count in the buggy third loop. Signed-off-by: Junio C Hamano <[email protected]>
1 parent af0ed81 commit a20d3c0

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

diff.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,7 +1498,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
14981498
if (max_change < change)
14991499
max_change = change;
15001500
}
1501-
count = i; /* min(count, data->nr) */
1501+
count = i; /* where we can stop scanning in data->files[] */
15021502

15031503
/*
15041504
* We have width = stat_width or term_columns() columns total.
@@ -1592,10 +1592,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
15921592
uintmax_t deleted = file->deleted;
15931593
int name_len;
15941594

1595-
if (!file->is_interesting && (added + deleted == 0)) {
1596-
total_files--;
1595+
if (!file->is_interesting && (added + deleted == 0))
15971596
continue;
1598-
}
1597+
15991598
/*
16001599
* "scale" the filename
16011600
*/
@@ -1640,8 +1639,6 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
16401639
*/
16411640
add = added;
16421641
del = deleted;
1643-
adds += add;
1644-
dels += del;
16451642

16461643
if (graph_width <= max_change) {
16471644
int total = add + del;
@@ -1667,16 +1664,22 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
16671664
show_graph(options->file, '-', del, del_c, reset);
16681665
fprintf(options->file, "\n");
16691666
}
1670-
for (i = count; i < data->nr; i++) {
1667+
1668+
for (i = 0; i < data->nr; i++) {
16711669
struct diffstat_file *file = data->files[i];
16721670
uintmax_t added = file->added;
16731671
uintmax_t deleted = file->deleted;
16741672
if (!file->is_interesting && (added + deleted == 0)) {
16751673
total_files--;
16761674
continue;
16771675
}
1678-
adds += added;
1679-
dels += deleted;
1676+
1677+
if (!file->is_binary && !file->is_unmerged) {
1678+
adds += added;
1679+
dels += deleted;
1680+
}
1681+
if (i < count)
1682+
continue;
16801683
if (!extra_shown)
16811684
fprintf(options->file, "%s ...\n", line_prefix);
16821685
extra_shown = 1;

t/t4049-diff-stat-count.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test_expect_success 'limit output to 2 (simple)' '
2828
test_i18ncmp expect actual
2929
'
3030

31-
test_expect_failure 'binary changes do not count in lines' '
31+
test_expect_success 'binary changes do not count in lines' '
3232
git reset --hard &&
3333
chmod +x c d &&
3434
echo a >a &&

0 commit comments

Comments
 (0)