Skip to content

Commit

Permalink
Fix packname hash generation.
Browse files Browse the repository at this point in the history
This changes the generation of hash packfiles have in their names, from
"hash of object names as fed to us" to "hash of object names in the
resulting pack, in the order they appear in the index file".  The new
"git-index-pack" command is taught to output the computed hash value
to its standard output.

With this, we can store downloaded pack in a temporary file without
knowing its final name, run git-index-pack to generate idx for it
while finding out its final name, and then rename the pack and idx to
their final names.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Oct 13, 2005
1 parent 9cf6d33 commit 84c8d8a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
15 changes: 13 additions & 2 deletions index-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand All @@ -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];
Expand Down Expand Up @@ -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..
*/
Expand All @@ -394,17 +400,20 @@ 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)
{
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];
Expand Down Expand Up @@ -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;
}
14 changes: 10 additions & 4 deletions pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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;
Expand All @@ -451,17 +451,23 @@ 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();

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);
Expand Down

0 comments on commit 84c8d8a

Please sign in to comment.