Daniel Ferreira <bnmvco@xxxxxxxxx> writes: > + if (!q->nr) > + return; > + > + for (i = 0; i < q->nr; i++) { > + struct diff_filepair *p; > + p = q->queue[i]; > + diff_flush_stat(p, options, &stat); > + } Commenting just on the part that interacts with the diff machinery, without/before carefully reading the remainder of the patches. I suspect that refactoring this part out of diff_flush() into a helper function "compute_diffstat()", like this: diff --git a/diff.c b/diff.c index 74283d9001..a42ff42e92 100644 --- a/diff.c +++ b/diff.c @@ -4770,12 +4770,7 @@ void diff_flush(struct diff_options *options) dirstat_by_line) { struct diffstat_t diffstat; - memset(&diffstat, 0, sizeof(struct diffstat_t)); - for (i = 0; i < q->nr; i++) { - struct diff_filepair *p = q->queue[i]; - if (check_pair_status(p)) - diff_flush_stat(p, options, &diffstat); - } + compute_diffstat(&options, &diffstat); if (output_format & DIFF_FORMAT_NUMSTAT) show_numstat(&diffstat, options); if (output_format & DIFF_FORMAT_DIFFSTAT) and then exporting that function and "struct diffstat_t" to your helper, may make it a better API, rather than having the callers to call diff_flush_stat() for each and every path.