This adds support for calling lookup_object_type() with NULL for the type, which will cause it to allocate enough memory for the largest type. This allows struct object_lists for objects that need to be fetched to find out what they are.
Signed-off-by: Daniel Barkalow <[EMAIL PROTECTED]> --- object.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- object.h | 8 ++++++++ tree.h | 1 + 3 files changed, 53 insertions(+), 1 deletions(-) 6ed7f76e658c02cb2539a52813fe20d3fd9aa250 diff --git a/object.c b/object.c --- a/object.c +++ b/object.c @@ -99,7 +99,9 @@ void mark_reachable(struct object *obj, 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 } } +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,23 @@ struct object *parse_object(const unsign } 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; +} diff --git a/object.h b/object.h --- a/object.h +++ b/object.h @@ -31,8 +31,16 @@ void created_object(const unsigned char /** 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); + #endif /* OBJECT_H */ diff --git a/tree.h b/tree.h --- 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; - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html