[PATCH] Add function to parse an object of unspecified type (take 2)
authorDaniel Barkalow <barkalow@iabervon.org>
Thu, 28 Apr 2005 14:46:33 +0000 (07:46 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 28 Apr 2005 14:46:33 +0000 (07:46 -0700)
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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
object.c
object.h

index 91bbc6e5e2eadfb0a66b14d992eac260d07267f8..ca4af8fa2dc0672b92310a3ebdd4d14bf070dd69 100644 (file)
--- 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 <stdlib.h>
 #include <string.h>
 
@@ -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;
+}
index bc607fd55f6ce4e56ce87766369b5d4d55ec79af..d53a35a4d7321b5ec970103208ac576f9f722dff 100644 (file)
--- a/object.h
+++ b/object.h
@@ -22,6 +22,9 @@ struct object *lookup_object(unsigned char *sha1);
 
 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);