Code

git-unpack-objects: show progress report by default
authorLinus Torvalds <torvalds@g5.osdl.org>
Sat, 9 Jul 2005 17:43:02 +0000 (10:43 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sat, 9 Jul 2005 17:43:02 +0000 (10:43 -0700)
This ends up being very calming for big "git clone"s, since otherwise
you just get very frustrated with a long silence, wondering whether it's
working at all.

Use "-q" to quiet it down.

Now if we could just do the same for the initial "figure out what to
pack" phase, which can also be quite slow if the other end is busy (or
not packed and not in cache)...

unpack-objects.c

index 6383db94acc26ed3dc7f1c55abeef06db866d2c7..355889f65bef73e512cf4c053493ae25c6a77b96 100644 (file)
@@ -3,7 +3,9 @@
 #include "delta.h"
 #include "pack.h"
 
-static int dry_run;
+#include <sys/time.h>
+
+static int dry_run, quiet;
 static const char unpack_usage[] = "git-unpack-objects < pack-file";
 
 /* We always read in 4kB chunks. */
@@ -185,7 +187,7 @@ static int unpack_delta_entry(unsigned long delta_size)
        return resolve_delta(type, base, base_size, delta_data, delta_size);
 }
 
-static void unpack_one(void)
+static void unpack_one(unsigned nr, unsigned total)
 {
        unsigned shift;
        unsigned char *pack, c;
@@ -205,6 +207,19 @@ static void unpack_one(void)
                size += (c & 0x7f) << shift;
                shift += 7;
        }
+       if (!quiet) {
+               static unsigned long last_sec;
+               static unsigned last_percent;
+               struct timeval now;
+               unsigned percentage = ((1+nr) * 100) / total;
+
+               gettimeofday(&now, NULL);
+               if (percentage != last_percent || now.tv_sec != last_sec) {
+                       last_sec = now.tv_sec;
+                       last_percent = percentage;
+                       fprintf(stderr, "%4u%% (%u/%u) done\r", percentage, nr, total);
+               }
+       }
        switch (type) {
        case OBJ_COMMIT:
        case OBJ_TREE:
@@ -240,7 +255,7 @@ static void unpack_all(void)
 
        use(sizeof(struct pack_header));
        for (i = 0; i < nr_objects; i++)
-               unpack_one();
+               unpack_one(i, nr_objects);
        if (delta_list)
                die("unresolved deltas left after unpacking");
 }
@@ -258,6 +273,10 @@ int main(int argc, char **argv)
                                dry_run = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "-q")) {
+                               quiet = 1;
+                               continue;
+                       }
                        usage(unpack_usage);
                }
 
@@ -287,5 +306,7 @@ int main(int argc, char **argv)
        }
 
        /* All done */
+       if (!quiet)
+               fprintf(stderr, "\n");
        return 0;
 }