git-tar-tree: no more void pointer arithmetic
[git.git] / object.c
index 4d46e0d..0f70890 100644 (file)
--- a/object.c
+++ b/object.c
@@ -9,7 +9,11 @@ struct object **objs;
 static int nr_objs;
 int obj_allocs;
 
-int track_object_refs = 1;
+const char *type_names[] = {
+       "none", "blob", "tree", "commit", "bad"
+};
+
+int track_object_refs = 0;
 
 static int hashtable_index(const unsigned char *sha1)
 {
@@ -50,7 +54,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
 
        obj->parsed = 0;
        memcpy(obj->sha1, sha1, 20);
-       obj->type = NULL;
+       obj->type = TYPE_NONE;
        obj->refs = NULL;
        obj->used = 0;
 
@@ -179,7 +183,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
        if (!obj) {
                union any_object *ret = xcalloc(1, sizeof(*ret));
                created_object(sha1, &ret->object);
-               ret->object.type = NULL;
+               ret->object.type = TYPE_NONE;
                return &ret->object;
        }
        return obj;
@@ -200,8 +204,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);