Junio C Hamano <gitster@xxxxxxxxx> writes: > Now we have identified three callchains that have a set of refs that > they want to show their <old, new> object names in an aligned output, > we can replace their reference to the constant TRANSPORT_SUMMARY_WIDTH > with a helper function call to transport_summary_width() that takes > the set of ref as a parameter. This step does not yet iterate over > the refs and compute, which is left as an exercise to the readers. And this is the final one. -- >8 -- From: Junio C Hamano <gitster@xxxxxxxxx> Date: Fri, 21 Oct 2016 21:33:06 -0700 Subject: [PATCH] transport: compute summary-width dynamically Now all that is left to do is to actually iterate over the refs and measure the display width needed to show their abbreviation. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- transport.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/transport.c b/transport.c index d4b8bf5f25..f1f95cf7c7 100644 --- a/transport.c +++ b/transport.c @@ -429,9 +429,25 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, return 1; } +static int measure_abbrev(const struct object_id *oid, int sofar) +{ + char hex[GIT_SHA1_HEXSZ + 1]; + int w = find_unique_abbrev_r(hex, oid->hash, DEFAULT_ABBREV); + + return (w < sofar) ? sofar : w; +} + int transport_summary_width(const struct ref *refs) { - return (2 * FALLBACK_DEFAULT_ABBREV + 3); + int maxw; + + for (maxw = -1; refs; refs = refs->next) { + maxw = measure_abbrev(&refs->old_oid, maxw); + maxw = measure_abbrev(&refs->new_oid, maxw); + } + if (maxw < 0) + maxw = FALLBACK_DEFAULT_ABBREV; + return (2 * maxw + 3); } void transport_print_push_status(const char *dest, struct ref *refs, -- 2.10.1-723-g2384e83bc3