зеркало из https://github.com/microsoft/git.git
also adds progress when actually writing a pack
If that pack is big, it takes significant time to write and might benefit from some more eye candies as well. This is however disabled when the pack is written to stdout since in that case the output is usually piped into unpack_objects which already does its own progress reporting. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
b2504a0d2f
Коммит
5e8dc750ee
|
@ -53,6 +53,7 @@ static int nr_objects = 0, nr_alloc = 0;
|
||||||
static const char *base_name;
|
static const char *base_name;
|
||||||
static unsigned char pack_file_sha1[20];
|
static unsigned char pack_file_sha1[20];
|
||||||
static int progress = 1;
|
static int progress = 1;
|
||||||
|
static volatile int progress_update = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The object names in objects array are hashed with this hashtable,
|
* The object names in objects array are hashed with this hashtable,
|
||||||
|
@ -333,8 +334,14 @@ static void write_pack_file(void)
|
||||||
hdr.hdr_entries = htonl(nr_objects);
|
hdr.hdr_entries = htonl(nr_objects);
|
||||||
sha1write(f, &hdr, sizeof(hdr));
|
sha1write(f, &hdr, sizeof(hdr));
|
||||||
offset = sizeof(hdr);
|
offset = sizeof(hdr);
|
||||||
for (i = 0; i < nr_objects; i++)
|
for (i = 0; i < nr_objects; i++) {
|
||||||
offset = write_one(f, objects + i, offset);
|
offset = write_one(f, objects + i, offset);
|
||||||
|
if (progress_update) {
|
||||||
|
fprintf(stderr, "Writing (%d %d%%)\r",
|
||||||
|
i+1, (i+1) * 100/nr_objects);
|
||||||
|
progress_update = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sha1close(f, pack_file_sha1, 1);
|
sha1close(f, pack_file_sha1, 1);
|
||||||
}
|
}
|
||||||
|
@ -662,7 +669,6 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile int progress_update = 0;
|
|
||||||
static void progress_interval(int signum)
|
static void progress_interval(int signum)
|
||||||
{
|
{
|
||||||
signal(SIGALRM, progress_interval);
|
signal(SIGALRM, progress_interval);
|
||||||
|
@ -735,7 +741,6 @@ static void prepare_pack(int window, int depth)
|
||||||
sorted_by_type = create_sorted_list(type_size_sort);
|
sorted_by_type = create_sorted_list(type_size_sort);
|
||||||
if (window && depth)
|
if (window && depth)
|
||||||
find_deltas(sorted_by_type, window+1, depth);
|
find_deltas(sorted_by_type, window+1, depth);
|
||||||
write_pack_file();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reuse_cached_pack(unsigned char *sha1, int pack_to_stdout)
|
static int reuse_cached_pack(unsigned char *sha1, int pack_to_stdout)
|
||||||
|
@ -905,6 +910,14 @@ int main(int argc, char **argv)
|
||||||
;
|
;
|
||||||
else {
|
else {
|
||||||
prepare_pack(window, depth);
|
prepare_pack(window, depth);
|
||||||
|
if (progress && pack_to_stdout) {
|
||||||
|
/* the other end usually displays progress itself */
|
||||||
|
struct itimerval v = {{0,},};
|
||||||
|
setitimer(ITIMER_REAL, &v, NULL);
|
||||||
|
signal(SIGALRM, SIG_IGN );
|
||||||
|
progress_update = 0;
|
||||||
|
}
|
||||||
|
write_pack_file();
|
||||||
if (!pack_to_stdout) {
|
if (!pack_to_stdout) {
|
||||||
write_index_file();
|
write_index_file();
|
||||||
puts(sha1_to_hex(object_list_sha1));
|
puts(sha1_to_hex(object_list_sha1));
|
||||||
|
|
Загрузка…
Ссылка в новой задаче