commit-reach: move min_generation check into paint_queue_get()
Consolidate the min_generation termination condition into paint_queue_get(), alongside the existing stale-entry and side-exhaustion checks. Move last_gen into struct paint_state so that commit_graph_generation() is called exactly once per dequeued commit and the result is shared across all termination checks and the monotonicity BUG assertion. Signed-off-by: Kristofer Karlsson <krka@spotify.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
02d7ba092d
commit
4e08160c2b
|
|
@ -90,6 +90,8 @@ struct paint_state {
|
|||
size_t parent2_count;
|
||||
size_t mb_candidate_count;
|
||||
int gen_ordered;
|
||||
timestamp_t min_generation;
|
||||
timestamp_t last_gen;
|
||||
timestamp_t topo_ceiling;
|
||||
};
|
||||
|
||||
|
|
@ -140,11 +142,23 @@ static void paint_queue_put(struct paint_state *state,
|
|||
static struct commit *paint_queue_get(struct paint_state *state)
|
||||
{
|
||||
struct commit *commit = prio_queue_get(&state->queue);
|
||||
timestamp_t generation;
|
||||
|
||||
if (!commit)
|
||||
return NULL;
|
||||
|
||||
commit->object.flags &= ~ENQUEUED;
|
||||
generation = commit_graph_generation(commit);
|
||||
|
||||
if (state->min_generation && generation > state->last_gen)
|
||||
BUG("bad generation skip %"PRItime" > %"PRItime" at %s",
|
||||
generation, state->last_gen,
|
||||
oid_to_hex(&commit->object.oid));
|
||||
state->last_gen = generation;
|
||||
|
||||
/* generation cutoff */
|
||||
if (generation < state->min_generation)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Check exit condition before decrementing: the counters
|
||||
|
|
@ -159,7 +173,7 @@ static struct commit *paint_queue_get(struct paint_state *state)
|
|||
/* one side is exhausted */
|
||||
if ((!state->parent1_count || !state->parent2_count) &&
|
||||
state->gen_ordered &&
|
||||
commit_graph_generation(commit) < state->topo_ceiling)
|
||||
generation < state->topo_ceiling)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -186,9 +200,10 @@ static int paint_down_to_common(struct repository *r,
|
|||
struct commit *commit;
|
||||
int i;
|
||||
int steps = 0;
|
||||
timestamp_t last_gen = GENERATION_NUMBER_INFINITY;
|
||||
struct commit_list **tail = result;
|
||||
|
||||
state.min_generation = min_generation;
|
||||
state.last_gen = GENERATION_NUMBER_INFINITY;
|
||||
state.topo_ceiling = corrected_commit_dates_enabled(r)
|
||||
? GENERATION_NUMBER_INFINITY
|
||||
: GENERATION_NUMBER_V1_MAX;
|
||||
|
|
@ -210,18 +225,8 @@ static int paint_down_to_common(struct repository *r,
|
|||
while ((commit = paint_queue_get(&state))) {
|
||||
struct commit_list *parents;
|
||||
int flags;
|
||||
timestamp_t generation = commit_graph_generation(commit);
|
||||
steps++;
|
||||
|
||||
if (min_generation && generation > last_gen)
|
||||
BUG("bad generation skip %"PRItime" > %"PRItime" at %s",
|
||||
generation, last_gen,
|
||||
oid_to_hex(&commit->object.oid));
|
||||
last_gen = generation;
|
||||
|
||||
if (generation < min_generation)
|
||||
break;
|
||||
|
||||
flags = commit->object.flags & (PARENT1 | PARENT2 | STALE);
|
||||
if (flags == (PARENT1 | PARENT2)) {
|
||||
if (!(commit->object.flags & RESULT)) {
|
||||
|
|
@ -234,7 +239,7 @@ static int paint_down_to_common(struct repository *r,
|
|||
*/
|
||||
if (!(mb_flags & MERGE_BASE_FIND_ALL) &&
|
||||
state.gen_ordered &&
|
||||
generation < state.topo_ceiling)
|
||||
state.last_gen < state.topo_ceiling)
|
||||
break;
|
||||
}
|
||||
/* Mark parents of a found merge stale */
|
||||
|
|
|
|||
Loading…
Reference in New Issue