1. Stefan Saasen
  2. git

Commits

Linus Torvalds  committed d36f7b8

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)...

  • Participants
  • Parent commits 1855c04
  • Branches master

Comments (0)

Files changed (1)

File unpack-objects.c

View file
 #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. */
 	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;
 		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:
 
 	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");
 }
 				dry_run = 1;
 				continue;
 			}
+			if (!strcmp(arg, "-q")) {
+				quiet = 1;
+				continue;
+			}
 			usage(unpack_usage);
 		}
 
 	}
 
 	/* All done */
+	if (!quiet)
+		fprintf(stderr, "\n");
 	return 0;
 }