X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=object.c;h=0f70890a4582fec845fb9399b3dc9f388c6538fc;hb=HEAD;hp=c9ca481498281adab056a364a3854180456f20f3;hpb=16ee9020159a6caddea47e89efbdba2935b9108a;p=git.git diff --git a/object.c b/object.c index c9ca4814..0f70890a 100644 --- 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; @@ -85,8 +89,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,10 +181,9 @@ 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; + ret->object.type = TYPE_NONE; return &ret->object; } return obj; @@ -196,15 +198,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) { @@ -212,7 +217,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;