Skip to content

Commit

Permalink
Merge branch 'jc/diff-stat-scaler' into maint
Browse files Browse the repository at this point in the history
* jc/diff-stat-scaler:
  diff --stat: show bars of same length for paths with same amount of changes
  • Loading branch information
Junio C Hamano committed Feb 21, 2012
2 parents c17ff2a + 2eeeef2 commit a67c235
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1276,13 +1276,15 @@ const char mime_boundary_leader[] = "------------";

static int scale_linear(int it, int width, int max_change)
{
if (!it)
return 0;
/*
* make sure that at least one '-' is printed if there were deletions,
* and likewise for '+'.
* make sure that at least one '-' or '+' is printed if
* there is any change to this path. The easiest way is to
* scale linearly as if the alloted width is one column shorter
* than it is, and then add 1 to the result.
*/
if (max_change < 2)
return it;
return ((it - 1) * (width - 1) + max_change - 1) / (max_change - 1);
return 1 + (it * (width - 1) / max_change);
}

static void show_name(FILE *file,
Expand Down Expand Up @@ -1498,8 +1500,19 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
dels += del;

if (width <= max_change) {
add = scale_linear(add, width, max_change);
del = scale_linear(del, width, max_change);
int total = add + del;

total = scale_linear(add + del, width, max_change);
if (total < 2 && add && del)
/* width >= 2 due to the sanity check */
total = 2;
if (add < del) {
add = scale_linear(add, width, max_change);
del = total - add;
} else {
del = scale_linear(del, width, max_change);
add = total - del;
}
}
fprintf(options->file, "%s", line_prefix);
show_name(options->file, prefix, name, len);
Expand Down

0 comments on commit a67c235

Please sign in to comment.