]> git.ipfire.org Git - thirdparty/git.git/commitdiff
progress: show overall rate in last update
authorRené Scharfe <l.s.r@web.de>
Sat, 8 Jul 2017 16:43:42 +0000 (18:43 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 9 Jul 2017 16:54:20 +0000 (09:54 -0700)
The values in struct throughput are only updated every 0.5 seconds.  If
we're all done before that time span then the final update will show a
rate of 0 bytes/s, which is misleading if some bytes had been handled.
Remember the start time and show the total throughput instead.

And avoid division by zero by enforcing a minimum time span value of 1
(unit: 1/1024th of a second).  That makes the resulting rate an
underestimation, but it's closer to the actual value than the currently
shown 0 bytes/s.

Reported-by: 積丹尼 Dan Jacobson <jidanni@jidanni.org>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
progress.c

index 29378caa05336efe15cdf2a9473ca6cbe2bcfa14..73e36d4a423067756ccd52af8cdb4cf0f762684b 100644 (file)
@@ -36,6 +36,7 @@ struct progress {
        unsigned delay;
        unsigned delayed_percent_treshold;
        struct throughput *throughput;
+       uint64_t start_ns;
 };
 
 static volatile sig_atomic_t progress_update;
@@ -221,6 +222,7 @@ struct progress *start_progress_delay(const char *title, unsigned total,
        progress->delayed_percent_treshold = percent_treshold;
        progress->delay = delay;
        progress->throughput = NULL;
+       progress->start_ns = getnanotime();
        set_progress_signal();
        return progress;
 }
@@ -247,8 +249,10 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
                struct throughput *tp = progress->throughput;
 
                if (tp) {
-                       unsigned int rate = !tp->avg_misecs ? 0 :
-                                       tp->avg_bytes / tp->avg_misecs;
+                       uint64_t now_ns = getnanotime();
+                       unsigned int misecs, rate;
+                       misecs = ((now_ns - progress->start_ns) * 4398) >> 32;
+                       rate = tp->curr_total / (misecs ? misecs : 1);
                        throughput_string(&tp->display, tp->curr_total, rate);
                }
                progress_update = 1;