From: barkalow@iabervon.org Date: Tue, 2 Aug 2005 23:45:48 +0000 (-0400) Subject: [PATCH] Object library enhancements X-Git-Tag: v0.99.4~60 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=66e481b007e843be54b9ff6a4be6e139c103a695;p=git.git [PATCH] Object library enhancements Add function to look up an object which is entirely unknown, so that it can be put in a list. Various other functions related to lists of objects. Signed-off-by: Daniel Barkalow Signed-off-by: Junio C Hamano --- diff --git a/object.c b/object.c index c410e97c8..72f6aa552 100644 --- a/object.c +++ b/object.c @@ -99,7 +99,9 @@ void mark_reachable(struct object *obj, unsigned int mask) struct object *lookup_object_type(const unsigned char *sha1, const char *type) { - if (!strcmp(type, blob_type)) { + if (!type) { + return lookup_unknown_object(sha1); + } else if (!strcmp(type, blob_type)) { return &lookup_blob(sha1)->object; } else if (!strcmp(type, tree_type)) { return &lookup_tree(sha1)->object; @@ -113,6 +115,27 @@ struct object *lookup_object_type(const unsigned char *sha1, const char *type) } } +union any_object { + struct object object; + struct commit commit; + struct tree tree; + struct blob blob; + struct tag tag; +}; + +struct object *lookup_unknown_object(const unsigned char *sha1) +{ + struct object *obj = lookup_object(sha1); + if (!obj) { + union any_object *ret = xmalloc(sizeof(*ret)); + memset(ret, 0, sizeof(*ret)); + created_object(sha1, &ret->object); + ret->object.type = NULL; + return &ret->object; + } + return obj; +} + struct object *parse_object(const unsigned char *sha1) { unsigned long size; @@ -150,3 +173,33 @@ struct object *parse_object(const unsigned char *sha1) } return NULL; } + +struct object_list *object_list_insert(struct object *item, + struct object_list **list_p) +{ + struct object_list *new_list = xmalloc(sizeof(struct object_list)); + new_list->item = item; + new_list->next = *list_p; + *list_p = new_list; + return new_list; +} + +unsigned object_list_length(struct object_list *list) +{ + unsigned ret = 0; + while (list) { + list = list->next; + ret++; + } + return ret; +} + +int object_list_contains(struct object_list *list, struct object *obj) +{ + while (list) { + if (list->item == obj) + return 1; + list = list->next; + } + return 0; +} diff --git a/object.h b/object.h index d82c7c454..5af530da5 100644 --- a/object.h +++ b/object.h @@ -31,8 +31,18 @@ void created_object(const unsigned char *sha1, struct object *obj); /** Returns the object, having parsed it to find out what it is. **/ struct object *parse_object(const unsigned char *sha1); +/** Returns the object, with potentially excess memory allocated. **/ +struct object *lookup_unknown_object(const unsigned char *sha1); + void add_ref(struct object *refer, struct object *target); void mark_reachable(struct object *obj, unsigned int mask); +struct object_list *object_list_insert(struct object *item, + struct object_list **list_p); + +unsigned object_list_length(struct object_list *list); + +int object_list_contains(struct object_list *list, struct object *obj); + #endif /* OBJECT_H */ diff --git a/tree.h b/tree.h index ae61bcca6..0df065ae3 100644 --- a/tree.h +++ b/tree.h @@ -14,6 +14,7 @@ struct tree_entry_list { unsigned int mode; char *name; union { + struct object *any; struct tree *tree; struct blob *blob; } item;