git-svn: several graft-branches improvements
[gitweb.git] / object.c
index 9adc87479bde2a0b2a0a0335aed12a9f485facff..37784cee9a90a7e5b44dd660d6b7ea9191b59486 100644 (file)
--- a/object.c
+++ b/object.c
@@ -9,7 +9,9 @@ struct object **objs;
 static int nr_objs;
 int obj_allocs;
 
-int track_object_refs = 0;
+const char *type_names[] = {
+       "none", "blob", "tree", "commit", "bad"
+};
 
 static int hashtable_index(const unsigned char *sha1)
 {
@@ -50,8 +52,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
 
        obj->parsed = 0;
        memcpy(obj->sha1, sha1, 20);
-       obj->type = NULL;
-       obj->refs = NULL;
+       obj->type = TYPE_NONE;
        obj->used = 0;
 
        if (obj_allocs - 1 <= nr_objs * 2) {
@@ -80,73 +81,6 @@ void created_object(const unsigned char *sha1, struct object *obj)
        nr_objs++;
 }
 
-struct object_refs *alloc_object_refs(unsigned count)
-{
-       struct object_refs *refs;
-       size_t size = sizeof(*refs) + count*sizeof(struct object *);
-
-       refs = xcalloc(1, size);
-       refs->count = count;
-       return refs;
-}
-
-static int compare_object_pointers(const void *a, const void *b)
-{
-       const struct object * const *pa = a;
-       const struct object * const *pb = b;
-       if (*pa == *pb)
-               return 0;
-       else if (*pa < *pb)
-               return -1;
-       else
-               return 1;
-}
-
-void set_object_refs(struct object *obj, struct object_refs *refs)
-{
-       unsigned int i, j;
-
-       /* Do not install empty list of references */
-       if (refs->count < 1) {
-               free(refs);
-               return;
-       }
-
-       /* Sort the list and filter out duplicates */
-       qsort(refs->ref, refs->count, sizeof(refs->ref[0]),
-             compare_object_pointers);
-       for (i = j = 1; i < refs->count; i++) {
-               if (refs->ref[i] != refs->ref[i - 1])
-                       refs->ref[j++] = refs->ref[i];
-       }
-       if (j < refs->count) {
-               /* Duplicates were found - reallocate list */
-               size_t size = sizeof(*refs) + j*sizeof(struct object *);
-               refs->count = j;
-               refs = xrealloc(refs, size);
-       }
-
-       for (i = 0; i < refs->count; i++)
-               refs->ref[i]->used = 1;
-       obj->refs = refs;
-}
-
-void mark_reachable(struct object *obj, unsigned int mask)
-{
-       if (!track_object_refs)
-               die("cannot do reachability with object refs turned off");
-       /* If we've been here already, don't bother */
-       if (obj->flags & mask)
-               return;
-       obj->flags |= mask;
-       if (obj->refs) {
-               const struct object_refs *refs = obj->refs;
-               unsigned i;
-               for (i = 0; i < refs->count; i++)
-                       mark_reachable(refs->ref[i], mask);
-       }
-}
-
 struct object *lookup_object_type(const unsigned char *sha1, const char *type)
 {
        if (!type) {
@@ -179,7 +113,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
        if (!obj) {
                union any_object *ret = xcalloc(1, sizeof(*ret));
                created_object(sha1, &ret->object);
-               ret->object.type = NULL;
+               ret->object.type = TYPE_NONE;
                return &ret->object;
        }
        return obj;
@@ -266,3 +200,20 @@ int object_list_contains(struct object_list *list, struct object *obj)
        }
        return 0;
 }
+
+void add_object_array(struct object *obj, const char *name, struct object_array *array)
+{
+       unsigned nr = array->nr;
+       unsigned alloc = array->alloc;
+       struct object_array_entry *objects = array->objects;
+
+       if (nr >= alloc) {
+               alloc = (alloc + 32) * 2;
+               objects = xrealloc(objects, alloc * sizeof(*objects));
+               array->alloc = alloc;
+               array->objects = objects;
+       }
+       objects[nr].item = obj;
+       objects[nr].name = name;
+       array->nr = ++nr;
+}