Merge branch 'ds/reachable'
[gitweb.git] / commit-reach.c
index 00e5ceee6fc8c33dad6071862ee7fe7923f3aa33..a9da65c4625cbbeb165b0c2d54fe3edabb1a3a34 100644 (file)
@@ -426,7 +426,7 @@ struct contains_stack {
 static int in_commit_list(const struct commit_list *want, struct commit *c)
 {
        for (; want; want = want->next)
-               if (!oidcmp(&want->item->object.oid, &c->object.oid))
+               if (oideq(&want->item->object.oid, &c->object.oid))
                        return 1;
        return 0;
 }
@@ -529,8 +529,8 @@ int commit_contains(struct ref_filter *filter, struct commit *commit,
 
 static int compare_commits_by_gen(const void *_a, const void *_b)
 {
-       const struct commit *a = (const struct commit *)_a;
-       const struct commit *b = (const struct commit *)_b;
+       const struct commit *a = *(const struct commit * const *)_a;
+       const struct commit *b = *(const struct commit * const *)_b;
 
        if (a->generation < b->generation)
                return -1;
@@ -561,7 +561,8 @@ int can_all_from_reach_with_flag(struct object_array *from,
                from_one = deref_tag(the_repository, from_one,
                                     "a from object", 0);
                if (!from_one || from_one->type != OBJ_COMMIT) {
-                       /* no way to tell if this is reachable by
+                       /*
+                        * no way to tell if this is reachable by
                         * looking at the ancestry chain alone, so
                         * leave a note to ourselves not to worry about
                         * this object anymore.
@@ -592,8 +593,10 @@ int can_all_from_reach_with_flag(struct object_array *from,
                while (stack) {
                        struct commit_list *parent;
 
-                       if (stack->item->object.flags & with_flag) {
+                       if (stack->item->object.flags & (with_flag | RESULT)) {
                                pop_commit(&stack);
+                               if (stack)
+                                       stack->item->object.flags |= RESULT;
                                continue;
                        }
 
@@ -625,10 +628,7 @@ int can_all_from_reach_with_flag(struct object_array *from,
        }
 
 cleanup:
-       for (i = 0; i < nr_commits; i++) {
-               clear_commit_marks(list[i], RESULT);
-               clear_commit_marks(list[i], assign_flag);
-       }
+       clear_commit_marks_many(nr_commits, list, RESULT | assign_flag);
        free(list);
 
        for (i = 0; i < from->nr; i++)