X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=object.c;h=21f872ee163e9eeff1a52854791c5b96a2ec2ceb;hb=d0587fd59f4452ed8461416d21bc7e47378e70b3;hp=deb683076d7e1a91e913398ff905085230014a4f;hpb=d1af002dc608be3213ba18df1a99ced0ab42e6d6;p=git.git diff --git a/object.c b/object.c index deb683076..21f872ee1 100644 --- a/object.c +++ b/object.c @@ -5,14 +5,12 @@ #include "cache.h" #include "tag.h" #include "delta.h" -#include -#include struct object **objs; int nr_objs; static int obj_allocs; -static int find_object(unsigned char *sha1) +static int find_object(const unsigned char *sha1) { int first = 0, last = nr_objs; @@ -33,7 +31,7 @@ static int find_object(unsigned char *sha1) return -first-1; } -struct object *lookup_object(unsigned char *sha1) +struct object *lookup_object(const unsigned char *sha1) { int pos = find_object(sha1); if (pos >= 0) @@ -41,7 +39,7 @@ struct object *lookup_object(unsigned char *sha1) return NULL; } -void created_object(unsigned char *sha1, struct object *obj) +void created_object(const unsigned char *sha1, struct object *obj) { int pos = find_object(sha1); @@ -100,7 +98,23 @@ void mark_reachable(struct object *obj, unsigned int mask) } } -struct object *parse_object(unsigned char *sha1) +struct object *lookup_object_type(const unsigned char *sha1, const char *type) +{ + if (!strcmp(type, blob_type)) { + return &lookup_blob(sha1)->object; + } else if (!strcmp(type, tree_type)) { + return &lookup_tree(sha1)->object; + } else if (!strcmp(type, commit_type)) { + return &lookup_commit(sha1)->object; + } else if (!strcmp(type, tag_type)) { + return &lookup_tag(sha1)->object; + } else { + error("Unknown type %s", type); + return NULL; + } +} + +struct object *parse_object(const unsigned char *sha1) { unsigned long mapsize; void *map = map_sha1_file(sha1, &mapsize); @@ -131,6 +145,10 @@ struct object *parse_object(unsigned char *sha1) } else if (!strcmp(type, "commit")) { struct commit *commit = lookup_commit(sha1); parse_commit_buffer(commit, buffer, size); + if (!commit->buffer) { + commit->buffer = buffer; + buffer = NULL; + } obj = &commit->object; } else if (!strcmp(type, "tag")) { struct tag *tag = lookup_tag(sha1);