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 =
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];
}
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..
*/
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)
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];
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;
}
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++) {
if (pack_to_stdout != !base_name)
usage(pack_usage);
- SHA1_Init(&ctx);
while (fgets(line, sizeof(line), stdin) != NULL) {
unsigned int hash;
char *p;
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();
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);