From: Junio C Hamano Date: Thu, 23 Feb 2006 00:38:21 +0000 (-0800) Subject: Merge master to get fixes up to GIT 1.2.3 X-Git-Tag: v1.3.0-rc1~54^2~43 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=597888adc6006cbca02175b6f070f8ef46b014e6;p=git.git Merge master to get fixes up to GIT 1.2.3 --- 597888adc6006cbca02175b6f070f8ef46b014e6 diff --cc pack-objects.c index 4f8814d8e,8f352aa6c..32befa002 --- a/pack-objects.c +++ b/pack-objects.c @@@ -3,8 -3,8 +3,9 @@@ #include "delta.h" #include "pack.h" #include "csum-file.h" +#include "diff.h" #include + #include static const char pack_usage[] = "git-pack-objects [-q] [--no-reuse-delta] [--non-empty] [--local] [--incremental] [--window=N] [--depth=N] {--stdout | base-name} < object-list"; @@@ -337,17 -329,34 +341,36 @@@ static void write_pack_file(void if (!base_name) f = sha1fd(1, ""); - else + else { f = sha1create("%s-%s.%s", base_name, sha1_to_hex(object_list_sha1), "pack"); + do_progress = progress; + } + if (do_progress) - fprintf(stderr, "Writing %d objects.\n", nr_objects); ++ fprintf(stderr, "Writing %d objects.\n", nr_result); + hdr.hdr_signature = htonl(PACK_SIGNATURE); hdr.hdr_version = htonl(PACK_VERSION); - hdr.hdr_entries = htonl(nr_objects); + hdr.hdr_entries = htonl(nr_result); sha1write(f, &hdr, sizeof(hdr)); offset = sizeof(hdr); - for (i = 0; i < nr_objects; i++) ++ if (!nr_result) ++ goto done; + for (i = 0; i < nr_objects; i++) { offset = write_one(f, objects + i, offset); - + if (do_progress) { - unsigned percent = written * 100 / nr_objects; ++ unsigned percent = written * 100 / nr_result; + if (progress_update || percent != last_percent) { + fprintf(stderr, "%4u%% (%u/%u) done\r", - percent, written, nr_objects); ++ percent, written, nr_result); + progress_update = 0; + last_percent = percent; + } + } + } + if (do_progress) + fputc('\n', stderr); - ++ done: sha1close(f, pack_file_sha1, 1); } @@@ -484,25 -431,11 +507,29 @@@ static int add_object_entry(const unsig memset(entry, 0, sizeof(*entry)); memcpy(entry->sha1, sha1, 20); entry->hash = hash; - if (found_pack) { - entry->in_pack = found_pack; - entry->in_pack_offset = found_offset; + + if (object_ix_hashsz * 3 <= nr_objects * 4) + rehash_objects(); + else { + ix = locate_object_entry_hash(entry->sha1); + if (0 <= ix) + die("internal error in object hashing."); + object_ix[-1 - ix] = idx + 1; + } + + already_added: ++ if (progress_update) { ++ fprintf(stderr, "Counting objects...%d\r", nr_objects); ++ progress_update = 0; ++ } + if (exclude) + entry->preferred_base = 1; + else { + if (found_pack) { + entry->in_pack = found_pack; + entry->in_pack_offset = found_offset; + } } - nr_objects = idx+1; return 1; } @@@ -809,7 -700,8 +843,8 @@@ static void find_deltas(struct object_e memset(array, 0, array_size); i = nr_objects; idx = 0; - eye_candy = i - (nr_objects / 20); + if (progress) - fprintf(stderr, "Deltifying %d objects.\n", nr_objects); ++ fprintf(stderr, "Deltifying %d objects.\n", nr_result); while (--i >= 0) { struct object_entry *entry = list[i]; @@@ -818,9 -710,15 +853,17 @@@ char type[10]; int j; - if (progress && i <= eye_candy) { - eye_candy -= nr_objects / 20; - fputc('.', stderr); - processed++; ++ if (!entry->preferred_base) ++ processed++; ++ + if (progress) { - unsigned percent = processed * 100 / nr_objects; ++ unsigned percent = processed * 100 / nr_result; + if (percent != last_percent || progress_update) { + fprintf(stderr, "%4u%% (%u/%u) done\r", - percent, processed, nr_objects); ++ percent, processed, nr_result); + progress_update = 0; + last_percent = percent; + } } if (entry->delta) @@@ -994,35 -883,25 +1028,26 @@@ int main(int argc, char **argv usage(pack_usage); prepare_packed_git(); + if (progress) { + struct itimerval v; + v.it_interval.tv_sec = 1; + v.it_interval.tv_usec = 0; + v.it_value = v.it_interval; + signal(SIGALRM, progress_interval); + setitimer(ITIMER_REAL, &v, NULL); fprintf(stderr, "Generating pack...\n"); - gettimeofday(&prev_tv, NULL); } + while (fgets(line, sizeof(line), stdin) != NULL) { - unsigned int hash; - char *p; unsigned char sha1[20]; - if (progress && (eye_candy <= nr_objects)) { - if (progress_update) { -- fprintf(stderr, "Counting objects...%d\r", nr_objects); - if (eye_candy && (50 <= eye_candy_incr)) { - struct timeval tv; - int time_diff; - gettimeofday(&tv, NULL); - time_diff = (tv.tv_sec - prev_tv.tv_sec); - time_diff <<= 10; - time_diff += (tv.tv_usec - prev_tv.tv_usec); - if ((1 << 9) < time_diff) - eye_candy_incr += 50; - else if (50 < eye_candy_incr) - eye_candy_incr -= 50; - } - eye_candy += eye_candy_incr; - } - progress_update = 0; + if (line[0] == '-') { + if (get_sha1_hex(line+1, sha1)) + die("expected edge sha1, got garbage:\n %s", + line+1); + add_preferred_base(sha1); + continue; } if (get_sha1_hex(line, sha1)) die("expected sha1, got garbage:\n %s", line); @@@ -1030,13 -917,13 +1055,13 @@@ } if (progress) fprintf(stderr, "Done counting %d objects.\n", nr_objects); -- if (non_empty && !nr_objects) ++ sorted_by_sha = create_final_object_list(); ++ if (non_empty && !nr_result) return 0; - sorted_by_sha = create_final_object_list(); - sorted_by_sha = create_sorted_list(sha1_sort); SHA1_Init(&ctx); list = sorted_by_sha; - for (i = 0; i < nr_objects; i++) { + for (i = 0; i < nr_result; i++) { struct object_entry *entry = *list++; SHA1_Update(&ctx, entry->sha1, 20); } @@@ -1047,7 -932,15 +1072,16 @@@ if (reuse_cached_pack(object_list_sha1, pack_to_stdout)) ; else { -- prepare_pack(window, depth); ++ if (nr_result) ++ 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) { write_index_file(); puts(sha1_to_hex(object_list_sha1));