int parse_commit(struct commit *item) { char type[20]; void *buffer; unsigned long size; int ret; if (item->object.parsed) return 0; buffer = read_sha1_file(item->object.sha1, type, &size); if (!buffer) return error("Could not read %s", sha1_to_hex(item->object.sha1)); if (strcmp(type, commit_type)) { free(buffer); return error("Object %s not a commit", sha1_to_hex(item->object.sha1)); } ret = parse_commit_buffer(item, buffer, size); if (save_commit_buffer && !ret) { item->buffer = buffer; return 0; } free(buffer); return ret; }
struct object *parse_object_buffer(const struct object_id *oid, enum object_type type, unsigned long size, void *buffer, int *eaten_p) { struct object *obj; *eaten_p = 0; obj = NULL; if (type == OBJ_BLOB) { struct blob *blob = lookup_blob(oid); if (blob) { if (parse_blob_buffer(blob, buffer, size)) return NULL; obj = &blob->object; } } else if (type == OBJ_TREE) { struct tree *tree = lookup_tree(oid); if (tree) { obj = &tree->object; if (!tree->buffer) tree->object.parsed = 0; if (!tree->object.parsed) { if (parse_tree_buffer(tree, buffer, size)) return NULL; *eaten_p = 1; } } } else if (type == OBJ_COMMIT) { struct commit *commit = lookup_commit(oid); if (commit) { if (parse_commit_buffer(commit, buffer, size)) return NULL; if (!get_cached_commit_buffer(commit, NULL)) { set_commit_buffer(commit, buffer, size); *eaten_p = 1; } obj = &commit->object; } } else if (type == OBJ_TAG) { struct tag *tag = lookup_tag(oid); if (tag) { if (parse_tag_buffer(tag, buffer, size)) return NULL; obj = &tag->object; } } else { warning("object %s has unknown type id %d", oid_to_hex(oid), type); obj = NULL; } return obj; }