Merge branch 'master' into next
[gitweb.git] / object.c
index b5c0ecf2b72bd520ee88b790aa424588178d02d3..9adc87479bde2a0b2a0a0335aed12a9f485facff 100644 (file)
--- a/object.c
+++ b/object.c
@@ -9,7 +9,7 @@ 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)
 {
@@ -85,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;
 }
@@ -178,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;
@@ -202,8 +200,11 @@ struct object *parse_object(const unsigned char *sha1)
                        obj = &blob->object;
                } else if (!strcmp(type, tree_type)) {
                        struct tree *tree = lookup_tree(sha1);
-                       parse_tree_buffer(tree, buffer, size);
                        obj = &tree->object;
+                       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);