revision: add next_commit_to_show()

get_revision() gets its commits from two sources depending on the mode:

1. Normally it gets the commits from get_revision_internal().

2. --max-count-oldest which was introduced at bb4ce23284 (revision.c:
   implement --max-count-oldest, 2026-05-19) gets the commits by popping
   from a saved list at revs->commits marking SHOWN and CHILD_SHOWN on
   each popped commit.

Extract the choice logic into a helper, next_commit_to_show(), which
returns the next commit regardless of the source it comes from.

This has no change in behavior. The helper is needed in a subsequent
commit that pre-fetches two commits into a buffer for lookahead purposes
and needs to pre-fetch from the same source.

The --reverse branch keeps its own pop loop. Using the helper for
--reverse would additionally set SHOWN and CHILD_SHOWN which is not
desired and a behavior change.

Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
next
Pablo Sabater 2026-07-14 14:09:33 +02:00 committed by Junio C Hamano
parent 641588bbcd
commit 08a0bef796
1 changed files with 24 additions and 12 deletions

View File

@ -4658,12 +4658,34 @@ static void retrieve_oldest_commits(struct rev_info *revs,
commit_list_insert(c, queue);
}

/*
* Returns the next commit that will be shown, regardless of whether it comes
* directly from the revision walk or from the list saved by the staged output
* of --max-count-oldest.
*/
static struct commit *next_commit_to_show(struct rev_info *revs)
{
struct commit *c;
struct commit_list *p;

if (!revs->max_count_stage)
return get_revision_internal(revs);

c = pop_commit(&revs->commits);
if (c) {
c->object.flags |= SHOWN;
if (!(c->object.flags & BOUNDARY))
for (p = c->parents; p; p = p->next)
p->item->object.flags |= CHILD_SHOWN;
}
return c;
}

struct commit *get_revision(struct rev_info *revs)
{
struct commit *c;
struct commit_list *reversed;
struct commit_list *queue = NULL;
struct commit_list *p;

if (revs->max_count_type == 1 && !revs->max_count_stage) {
retrieve_oldest_commits(revs, &queue);
@ -4693,17 +4715,7 @@ struct commit *get_revision(struct rev_info *revs)
return c;
}

if (revs->max_count_stage) {
c = pop_commit(&revs->commits);
if (c) {
c->object.flags |= SHOWN;
if (!(c->object.flags & BOUNDARY))
for (p = c->parents; p; p = p->next)
p->item->object.flags |= CHILD_SHOWN;
}
} else {
c = get_revision_internal(revs);
}
c = next_commit_to_show(revs);

if (c && revs->graph)
graph_update(revs->graph, c);