diff options
-rw-r--r-- | index-pack.c | 15 | ||||
-rw-r--r-- | pack-objects.c | 14 |
2 files changed, 23 insertions, 6 deletions
diff --git a/index-pack.c b/index-pack.c index badbeab70e..785fe71a6f 100644 --- a/index-pack.c +++ b/index-pack.c @@ -349,7 +349,7 @@ static int sha1_compare(const void *_a, const void *_b) return memcmp(a->sha1, b->sha1, 20); } -static void write_index_file(const char *index_name) +static void write_index_file(const char *index_name, unsigned char *sha1) { struct sha1file *f; struct object_entry **sorted_by_sha = @@ -358,6 +358,7 @@ static void write_index_file(const char *index_name) struct object_entry **last = sorted_by_sha + nr_objects; unsigned int array[256]; int i; + SHA_CTX ctx; for (i = 0; i < nr_objects; ++i) sorted_by_sha[i] = &objects[i]; @@ -385,6 +386,11 @@ static void write_index_file(const char *index_name) } sha1write(f, array, 256 * sizeof(int)); + /* recompute the SHA1 hash of sorted object names. + * currently pack-objects does not do this, but that + * can be fixed. + */ + SHA1_Init(&ctx); /* * Write the actual SHA1 entries.. */ @@ -394,10 +400,12 @@ static void write_index_file(const char *index_name) unsigned int offset = htonl(obj->offset); sha1write(f, &offset, 4); sha1write(f, obj->sha1, 20); + SHA1_Update(&ctx, obj->sha1, 20); } sha1write(f, pack_base + pack_size - 20, 20); sha1close(f, NULL, 1); free(sorted_by_sha); + SHA1_Final(sha1, &ctx); } int main(int argc, char **argv) @@ -405,6 +413,7 @@ int main(int argc, char **argv) int i; char *index_name = NULL; char *index_name_buf = NULL; + unsigned char sha1[20]; for (i = 1; i < argc; i++) { const char *arg = argv[i]; @@ -443,9 +452,11 @@ int main(int argc, char **argv) deltas = xcalloc(nr_objects, sizeof(struct delta_entry)); parse_pack_objects(); free(deltas); - write_index_file(index_name); + write_index_file(index_name, sha1); free(objects); free(index_name_buf); + printf("%s\n", sha1_to_hex(sha1)); + return 0; } diff --git a/pack-objects.c b/pack-objects.c index 3d622787cc..ef55cab5f3 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -393,6 +393,7 @@ int main(int argc, char **argv) SHA_CTX ctx; char line[PATH_MAX + 20]; int window = 10, depth = 10, pack_to_stdout = 0; + struct object_entry **list; int i; for (i = 1; i < argc; i++) { @@ -435,7 +436,6 @@ int main(int argc, char **argv) if (pack_to_stdout != !base_name) usage(pack_usage); - SHA1_Init(&ctx); while (fgets(line, sizeof(line), stdin) != NULL) { unsigned int hash; char *p; @@ -451,10 +451,8 @@ int main(int argc, char **argv) continue; hash = hash * 11 + c; } - if (add_object_entry(sha1, hash)) - SHA1_Update(&ctx, sha1, 20); + add_object_entry(sha1, hash); } - SHA1_Final(object_list_sha1, &ctx); if (non_empty && !nr_objects) return 0; get_object_details(); @@ -462,6 +460,14 @@ int main(int argc, char **argv) fprintf(stderr, "Packing %d objects\n", nr_objects); sorted_by_sha = create_sorted_list(sha1_sort); + SHA1_Init(&ctx); + list = sorted_by_sha; + for (i = 0; i < nr_objects; i++) { + struct object_entry *entry = *list++; + SHA1_Update(&ctx, entry->sha1, 20); + } + SHA1_Final(object_list_sha1, &ctx); + sorted_by_type = create_sorted_list(type_size_sort); if (window && depth) find_deltas(sorted_by_type, window+1, depth); |