X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=object.c;h=21f872ee163e9eeff1a52854791c5b96a2ec2ceb;hb=180926636e47ecfe28d03cec493af75899994f0f;hp=d093e17d240cff9e62a62b74ca4b3c86a472f54a;hpb=6b0c3121061df6b323f430700e8077b324b5e9dd;p=git.git diff --git a/object.c b/object.c index d093e17d..21f872ee 100644 --- a/object.c +++ b/object.c @@ -10,7 +10,7 @@ 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; @@ -31,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) @@ -39,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); @@ -98,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); @@ -129,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);