aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2005-04-28 07:46:33 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-28 07:46:33 -0700
commite9eefa676178a972f055c978cac9a9ae06b6703a (patch)
treee016f9668c17e0b1641805b76ee1c4dc3d0b963b
parent2636f6143751a064e366cb7763d0705b296726e3 (diff)
downloadgit-e9eefa676178a972f055c978cac9a9ae06b6703a.tar.gz
git-e9eefa676178a972f055c978cac9a9ae06b6703a.tar.xz
[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 <barkalow@iabervon.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--object.c40
-rw-r--r--object.h3
2 files changed, 43 insertions, 0 deletions
diff --git a/object.c b/object.c
index 91bbc6e5e..ca4af8fa2 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 <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;
+}
diff --git a/object.h b/object.h
index bc607fd55..d53a35a4d 100644
--- 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);