summaryrefslogtreecommitdiff
path: root/commit-reach.c
diff options
context:
space:
mode:
Diffstat (limited to 'commit-reach.c')
-rw-r--r--commit-reach.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/commit-reach.c b/commit-reach.c
index c6de0cc89c..a9da65c462 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -39,6 +39,9 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n,
int i;
uint32_t last_gen = GENERATION_NUMBER_INFINITY;
+ if (!min_generation)
+ queue.compare = compare_commits_by_commit_date;
+
one->object.flags |= PARENT1;
if (!n) {
commit_list_append(one, &result);
@@ -56,7 +59,7 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n,
struct commit_list *parents;
int flags;
- if (commit->generation > last_gen)
+ if (min_generation && commit->generation > last_gen)
BUG("bad generation skip %8x > %8x at %s",
commit->generation, last_gen,
oid_to_hex(&commit->object.oid));
@@ -423,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;
}
@@ -558,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.
@@ -589,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;
}
@@ -622,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++)