diff options
-rw-r--r-- | cache.h | 2 | ||||
-rw-r--r-- | clone-pack.c | 10 | ||||
-rw-r--r-- | fetch-clone.c | 28 | ||||
-rw-r--r-- | fetch-pack.c | 2 |
4 files changed, 37 insertions, 5 deletions
@@ -348,6 +348,6 @@ extern int copy_fd(int ifd, int ofd); /* Finish off pack transfer receiving end */ extern int receive_unpack_pack(int fd[2], const char *me, int quiet); -extern int receive_keep_pack(int fd[2], const char *me); +extern int receive_keep_pack(int fd[2], const char *me, int quiet); #endif /* CACHE_H */ diff --git a/clone-pack.c b/clone-pack.c index f634431be..719e1c4fc 100644 --- a/clone-pack.c +++ b/clone-pack.c @@ -6,6 +6,8 @@ static const char clone_pack_usage[] = "git-clone-pack [--exec=<git-upload-pack>] [<host>:]<directory> [<heads>]*"; static const char *exec = "git-upload-pack"; +static int quiet = 0; + static void clone_handshake(int fd[2], struct ref *ref) { unsigned char sha1[20]; @@ -123,7 +125,9 @@ static int clone_pack(int fd[2], int nr_match, char **match) } clone_handshake(fd, refs); - status = receive_keep_pack(fd, "git-clone-pack"); + if (!quiet) + fprintf(stderr, "Generating pack ...\r"); + status = receive_keep_pack(fd, "git-clone-pack", quiet); if (!status) { if (nr_match == 0) @@ -154,8 +158,10 @@ int main(int argc, char **argv) char *arg = argv[i]; if (*arg == '-') { - if (!strcmp("-q", arg)) + if (!strcmp("-q", arg)) { + quiet = 1; continue; + } if (!strncmp("--exec=", arg, 7)) { exec = arg + 7; continue; diff --git a/fetch-clone.c b/fetch-clone.c index 859f40094..b67d97649 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); diff --git a/fetch-pack.c b/fetch-pack.c index 27f5d2a5f..aa6f42ae1 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -378,7 +378,7 @@ static int fetch_pack(int fd[2], int nr_match, char **match) fprintf(stderr, "warning: no common commits\n"); if (keep_pack) - status = receive_keep_pack(fd, "git-fetch-pack"); + status = receive_keep_pack(fd, "git-fetch-pack", quiet); else status = receive_unpack_pack(fd, "git-fetch-pack", quiet); |