From e9eefa676178a972f055c978cac9a9ae06b6703a Mon Sep 17 00:00:00 2001 From: Daniel Barkalow Date: Thu, 28 Apr 2005 07:46:33 -0700 Subject: [PATCH] Add function to parse an object of unspecified type (take 2) This adds a function that parses an object from the database when we have to look up its actual type. It also checks the hash of the file, due to its heritage as part of fsck-cache. Signed-Off-By: Daniel Barkalow Signed-off-by: Linus Torvalds --- object.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'object.c') diff --git a/object.c b/object.c index 91bbc6e5e2..ca4af8fa2d 100644 --- a/object.c +++ b/object.c @@ -1,5 +1,9 @@ #include "object.h" +#include "blob.h" +#include "tree.h" +#include "commit.h" #include "cache.h" +#include "tag.h" #include #include @@ -94,3 +98,39 @@ void mark_reachable(struct object *obj, unsigned int mask) p = p->next; } } + +struct object *parse_object(unsigned char *sha1) +{ + unsigned long mapsize; + void *map = map_sha1_file(sha1, &mapsize); + if (map) { + char type[100]; + unsigned long size; + void *buffer = unpack_sha1_file(map, mapsize, type, &size); + if (!buffer) + return NULL; + if (check_sha1_signature(sha1, buffer, size, type) < 0) + printf("sha1 mismatch %s\n", sha1_to_hex(sha1)); + munmap(map, mapsize); + if (!strcmp(type, "blob")) { + struct blob *ret = lookup_blob(sha1); + parse_blob(ret); + return &ret->object; + } else if (!strcmp(type, "tree")) { + struct tree *ret = lookup_tree(sha1); + parse_tree(ret); + return &ret->object; + } else if (!strcmp(type, "commit")) { + struct commit *ret = lookup_commit(sha1); + parse_commit(ret); + return &ret->object; + } else if (!strcmp(type, "tag")) { + struct tag *ret = lookup_tag(sha1); + parse_tag(ret); + return &ret->object; + } else { + return NULL; + } + } + return NULL; +} -- cgit v1.2.3