Merge branch 'jc/rw-prefix'
[gitweb.git] / object.c
index 3259862ab2eeeb3adcd52c24c801fd4d4e3212b7..9adc87479bde2a0b2a0a0335aed12a9f485facff 100644 (file)
--- a/object.c
+++ b/object.c
@@ -9,21 +9,23 @@ struct object **objs;
 static int nr_objs;
 int obj_allocs;
 
-int track_object_refs = 1;
+int track_object_refs = 0;
 
 static int hashtable_index(const unsigned char *sha1)
 {
-       unsigned int i = *(unsigned int *)sha1;
+       unsigned int i;
+       memcpy(&i, sha1, sizeof(unsigned int));
        return (int)(i % obj_allocs);
 }
 
 static int find_object(const unsigned char *sha1)
 {
-       int i = hashtable_index(sha1);
+       int i;
 
        if (!objs)
                return -1;
 
+       i = hashtable_index(sha1);
        while (objs[i]) {
                if (memcmp(sha1, objs[i]->sha1, 20) == 0)
                        return i;
@@ -58,7 +60,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
                objs = xrealloc(objs, obj_allocs * sizeof(struct object *));
                memset(objs + count, 0, (obj_allocs - count)
                                * sizeof(struct object *));
-               for (i = 0; i < count; i++)
+               for (i = 0; i < obj_allocs; i++)
                        if (objs[i]) {
                                int j = find_object(objs[i]->sha1);
                                if (j != i) {
@@ -83,8 +85,7 @@ struct object_refs *alloc_object_refs(unsigned count)
        struct object_refs *refs;
        size_t size = sizeof(*refs) + count*sizeof(struct object *);
 
-       refs = xmalloc(size);
-       memset(refs, 0, size);
+       refs = xcalloc(1, size);
        refs->count = count;
        return refs;
 }
@@ -176,8 +177,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               union any_object *ret = xmalloc(sizeof(*ret));
-               memset(ret, 0, sizeof(*ret));
+               union any_object *ret = xcalloc(1, sizeof(*ret));
                created_object(sha1, &ret->object);
                ret->object.type = NULL;
                return &ret->object;
@@ -194,15 +194,18 @@ struct object *parse_object(const unsigned char *sha1)
                struct object *obj;
                if (check_sha1_signature(sha1, buffer, size, type) < 0)
                        printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
-               if (!strcmp(type, "blob")) {
+               if (!strcmp(type, blob_type)) {
                        struct blob *blob = lookup_blob(sha1);
                        parse_blob_buffer(blob, buffer, size);
                        obj = &blob->object;
-               } else if (!strcmp(type, "tree")) {
+               } else if (!strcmp(type, tree_type)) {
                        struct tree *tree = lookup_tree(sha1);
-                       parse_tree_buffer(tree, buffer, size);
                        obj = &tree->object;
-               } else if (!strcmp(type, "commit")) {
+                       if (!tree->object.parsed) {
+                               parse_tree_buffer(tree, buffer, size);
+                               buffer = NULL;
+                       }
+               } else if (!strcmp(type, commit_type)) {
                        struct commit *commit = lookup_commit(sha1);
                        parse_commit_buffer(commit, buffer, size);
                        if (!commit->buffer) {
@@ -210,7 +213,7 @@ struct object *parse_object(const unsigned char *sha1)
                                buffer = NULL;
                        }
                        obj = &commit->object;
-               } else if (!strcmp(type, "tag")) {
+               } else if (!strcmp(type, tag_type)) {
                        struct tag *tag = lookup_tag(sha1);
                        parse_tag_buffer(tag, buffer, size);
                        obj = &tag->object;