aboutsummaryrefslogtreecommitdiff
path: root/unpack-objects.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-07-09 10:43:02 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-09 10:43:02 -0700
commitd36f7b805eccaf702c0be1c00d034711d0da1f77 (patch)
tree4c97890470f11774806c42d6d8869905497cd3b1 /unpack-objects.c
parent1855c044629a02488baa1bd25ae45341da33bd4e (diff)
downloadgit-d36f7b805eccaf702c0be1c00d034711d0da1f77.tar.gz
git-d36f7b805eccaf702c0be1c00d034711d0da1f77.tar.xz
git-unpack-objects: show progress report by default
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)...
Diffstat (limited to 'unpack-objects.c')
-rw-r--r--unpack-objects.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/unpack-objects.c b/unpack-objects.c
index 6383db94a..355889f65 100644
--- a/unpack-objects.c
+++ b/unpack-objects.c
@@ -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;
}