diff options
Diffstat (limited to 'fetch-clone.c')
-rw-r--r-- | fetch-clone.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/fetch-clone.c b/fetch-clone.c index 859f400941..b67d976497 100644 --- a/fetch-clone.c +++ b/fetch-clone.c @@ -1,6 +1,7 @@ #include "cache.h" #include "exec_cmd.h" #include <sys/wait.h> +#include <sys/time.h> static int finish_pack(const char *pack_tmp_name, const char *me) { @@ -129,10 +130,12 @@ int receive_unpack_pack(int fd[2], const char *me, int quiet) die("git-unpack-objects died of unnatural causes %d", status); } -int receive_keep_pack(int fd[2], const char *me) +int receive_keep_pack(int fd[2], const char *me, int quiet) { char tmpfile[PATH_MAX]; int ofd, ifd; + unsigned long total; + static struct timeval prev_tv; ifd = fd[0]; snprintf(tmpfile, sizeof(tmpfile), @@ -141,6 +144,8 @@ int receive_keep_pack(int fd[2], const char *me) if (ofd < 0) return error("unable to create temporary file %s", tmpfile); + gettimeofday(&prev_tv, NULL); + total = 0; while (1) { char buf[8192]; ssize_t sz, wsz, pos; @@ -165,6 +170,27 @@ int receive_keep_pack(int fd[2], const char *me) } pos += wsz; } + total += sz; + if (!quiet) { + static unsigned long last; + struct timeval tv; + unsigned long diff = total - last; + /* not really "msecs", but a power-of-two millisec (1/1024th of a sec) */ + unsigned long msecs; + + gettimeofday(&tv, NULL); + msecs = tv.tv_sec - prev_tv.tv_sec; + msecs <<= 10; + msecs += (int)(tv.tv_usec - prev_tv.tv_usec) >> 10; + if (msecs > 500) { + prev_tv = tv; + last = total; + fprintf(stderr, "%4lu.%03luMB (%lu kB/s) \r", + total >> 20, + 1000*((total >> 10) & 1023)>>10, + diff / msecs ); + } + } } close(ofd); return finish_pack(tmpfile, me); |