Skip to content

Commit

Permalink
diff --stat: move the "total count" logic to the last loop
Browse files Browse the repository at this point in the history
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 <gitster@pobox.com>
  • Loading branch information
gitster committed Nov 27, 2012
1 parent af0ed81 commit a20d3c0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 10 deletions.
21 changes: 12 additions & 9 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1498,7 +1498,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
if (max_change < change)
max_change = change;
}
count = i; /* min(count, data->nr) */
count = i; /* where we can stop scanning in data->files[] */

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

if (!file->is_interesting && (added + deleted == 0)) {
total_files--;
if (!file->is_interesting && (added + deleted == 0))
continue;
}

/*
* "scale" the filename
*/
Expand Down Expand Up @@ -1640,8 +1639,6 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
*/
add = added;
del = deleted;
adds += add;
dels += del;

if (graph_width <= max_change) {
int total = add + del;
Expand All @@ -1667,16 +1664,22 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
show_graph(options->file, '-', del, del_c, reset);
fprintf(options->file, "\n");
}
for (i = count; i < data->nr; i++) {

for (i = 0; i < data->nr; i++) {
struct diffstat_file *file = data->files[i];
uintmax_t added = file->added;
uintmax_t deleted = file->deleted;
if (!file->is_interesting && (added + deleted == 0)) {
total_files--;
continue;
}
adds += added;
dels += deleted;

if (!file->is_binary && !file->is_unmerged) {
adds += added;
dels += deleted;
}
if (i < count)
continue;
if (!extra_shown)
fprintf(options->file, "%s ...\n", line_prefix);
extra_shown = 1;
Expand Down
2 changes: 1 addition & 1 deletion t/t4049-diff-stat-count.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ test_expect_success 'limit output to 2 (simple)' '
test_i18ncmp expect actual
'

test_expect_failure 'binary changes do not count in lines' '
test_expect_success 'binary changes do not count in lines' '
git reset --hard &&
chmod +x c d &&
echo a >a &&
Expand Down

0 comments on commit a20d3c0

Please sign in to comment.