diff --stat: ensure at least one '-' for deletions, and one '+' for additions
The number of '-' and '+' is still linear. The idea is that scaled-length := floor(a * length + b) with the following constraints: if length == 1, scaled-length == 1, and the combined length of plusses and minusses should not be larger than the width by a small margin. Thus, a + b == 1 and a * max_plusses + b + a * max_minusses + b = width + 1 The solution is a * x + b = ((width - 1) * (x - 1) + max_change - 1) / (max_change - 1) Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:

committed by
Junio C Hamano

parent
5c5b2ea9ab
commit
3ed74e608a
11
diff.c
11
diff.c
@ -550,9 +550,12 @@ const char mime_boundary_leader[] = "------------";
|
|||||||
static int scale_linear(int it, int width, int max_change)
|
static int scale_linear(int it, int width, int max_change)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* round(width * it / max_change);
|
* make sure that at least one '-' is printed if there were deletions,
|
||||||
|
* and likewise for '+'.
|
||||||
*/
|
*/
|
||||||
return (it * width * 2 + max_change) / (max_change * 2);
|
if (max_change < 2)
|
||||||
|
return it;
|
||||||
|
return ((it - 1) * (width - 1) + max_change - 1) / (max_change - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_name(const char *prefix, const char *name, int len,
|
static void show_name(const char *prefix, const char *name, int len,
|
||||||
@ -684,9 +687,9 @@ static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
|||||||
dels += del;
|
dels += del;
|
||||||
|
|
||||||
if (width <= max_change) {
|
if (width <= max_change) {
|
||||||
total = scale_linear(total, width, max_change);
|
|
||||||
add = scale_linear(add, width, max_change);
|
add = scale_linear(add, width, max_change);
|
||||||
del = total - add;
|
del = scale_linear(del, width, max_change);
|
||||||
|
total = add + del;
|
||||||
}
|
}
|
||||||
show_name(prefix, name, len, reset, set);
|
show_name(prefix, name, len, reset, set);
|
||||||
printf("%5d ", added + deleted);
|
printf("%5d ", added + deleted);
|
||||||
|
Reference in New Issue
Block a user