]> git.ipfire.org Git - thirdparty/git.git/commitdiff
revision: add next_commit_to_show()
authorPablo Sabater <pabloosabaterr@gmail.com>
Tue, 14 Jul 2026 12:09:33 +0000 (14:09 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Jul 2026 14:32:51 +0000 (07:32 -0700)
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>
revision.c

index 0c95edef5947fa491a82a724c04a2143bd9f7a58..288935943f4fbab918d968abee7debfcb3a0569c 100644 (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);