Re: [PATCH 1/2] diff --stat: use asymptotic scaling in graph
- From
- apodtele <apodtele@gmail.com>
- Date
- Oct 12, 2006, 21:37 UTC
- Message-ID
- <d620685f0610121437m38eb454g7597b2a93010b023@mail.gmail.com>
- In-Reply-To
- <20061012201646.GC10922@admingilde.org>
On 10/12/06, Martin Waitz <tali@admingilde.org> wrote:
Show 11 quoted lines
> On Thu, Oct 12, 2006 at 03:37:17PM -0400, apodtele wrote: > > Instead of conditionally scaling the stat graph for large changes, > > always scale it asymptotically: small changes shall appear without any > > distortions. > > very nice idea! > > > + return it * width / (it + width) + 1; > > but wouldn't this formula result in at least 1, even for a 0 change? > Perhaps we'd have to special case an input of 0?
Corrected patch follows.
--- diff.c 2006-10-12 14:45:13.000000000 -0400 +++ diff.c 2006-10-12 17:32:15.000000000 -0400
@@ -637,15 +637,12 @@ const char mime_boundary_leader[] = "------------"; -static int scale_linear(int it, int width, int max_change) +static int scale_nonlinear(int it, int width) { - /* - * make sure that at least one '-' is printed if there were deletions, - * and likewise for '+'. - */ - if (max_change < 2) - return it; - return ((it - 1) * (width - 1) + max_change - 1) / (max_change - 1); + if (it) + return it * width / (it + width) + 1; + else + return 0; } static void show_name(const char *prefix, const char *name, int len, @@ -776,11 +773,9 @@ adds += add; dels += del; - if (width <= max_change) { - add = scale_linear(add, width, max_change); - del = scale_linear(del, width, max_change); - total = add + del; - } + add = scale_nonlinear(add, width / 2); + del = scale_nonlinear(del, width / 2); + total = add + del; show_name(prefix, name, len, reset, set); printf("%5d ", added + deleted); show_graph('+', add, add_c, reset);