1
0
mirror of https://github.com/git/git.git synced 2024-11-18 02:14:03 +01:00

[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 <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
barkalow@iabervon.org 2005-08-02 19:45:48 -04:00 committed by Junio C Hamano
parent 29f3b3de99
commit 66e481b007
3 changed files with 65 additions and 1 deletions

@ -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;
}

@ -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 */

1
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;