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 <barkalow@iabervon.org> Index: object.c =================================================================== --- bcb43fecd82fa6f851e266b7e3873973068d51f3/object.c (mode:100644 sha1:91bbc6e5e2eadfb0a66b14d992eac260d07267f8) +++ 52505514b78c9bd77fcd701663c1967919d1cec3/object.c (mode:100644 sha1:ca4af8fa2dc0672b92310a3ebdd4d14bf070dd69) @@ -1,5 +1,9 @@ #include "object.h" +#include "blob.h" +#include "tree.h" +#include "commit.h" #include "cache.h" +#include "tag.h" #include <stdlib.h> #include <string.h> @@ -94,3 +98,39 @@ 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; +} Index: object.h =================================================================== --- bcb43fecd82fa6f851e266b7e3873973068d51f3/object.h (mode:100644 sha1:bc607fd55f6ce4e56ce87766369b5d4d55ec79af) +++ 52505514b78c9bd77fcd701663c1967919d1cec3/object.h (mode:100644 sha1:d53a35a4d7321b5ec970103208ac576f9f722dff) @@ -22,6 +22,9 @@ void created_object(unsigned char *sha1, struct object *obj); +/** Returns the object, having parsed it to find out what it is. **/ +struct object *parse_object(unsigned char *sha1); + void add_ref(struct object *refer, struct object *target); void mark_reachable(struct object *obj, unsigned int mask); - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.htmlReceived on Thu Apr 28 16:02:46 2005
This archive was generated by hypermail 2.1.8 : 2005-04-28 16:02:47 EST