Fix packname hash generation.
authorJunio C Hamano <junkio@cox.net>
Wed, 12 Oct 2005 23:54:19 +0000 (16:54 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 13 Oct 2005 01:32:02 +0000 (18:32 -0700)
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>
index-pack.c
pack-objects.c

index badbeab70e2d8426a4e11c4ecda3b0f4ed518206..785fe71a6fb5e518f92d62bace43cdd13f3c37ae 100644 (file)
@@ -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;
 }
index 3d622787cc554eb2936995441e4591ec1986bded..ef55cab5f3f4233805c6fa1958655afc6f2cad2f 100644 (file)
@@ -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);