From: Pablo Sabater Date: Sat, 20 Jun 2026 10:11:51 +0000 (+0200) Subject: revision: add peek functions for lookahead X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28308a0fe68e7b54ae948c8a29c96290b6f04fba;p=thirdparty%2Fgit.git revision: add peek functions for lookahead The graph code in a subsequent commit needs to be able to look ahead in order to set indentation-related flags. Using revs->commits is brittle and the data structure that holds the pending commits might change in the future. Add two functions that abstract this for the graph. Helped-by: Kristofer Karlsson Signed-off-by: Pablo Sabater Signed-off-by: Junio C Hamano --- diff --git a/revision.c b/revision.c index 6a8101e8b7..b9f947b03e 100644 --- a/revision.c +++ b/revision.c @@ -3692,6 +3692,44 @@ static unsigned int count_explore_walked; static unsigned int count_indegree_walked; static unsigned int count_topo_walked; +struct commit *revision_peek_next_commit (struct rev_info *revs) +{ + struct topo_walk_info *info = revs->topo_walk_info; + + if (info) + return prio_queue_peek(&info->topo_queue); + if (revs->commits) + return revs->commits->item; + + return NULL; +} + +int revision_has_commits_after (struct rev_info *revs, int n) +{ + struct topo_walk_info *info = revs->topo_walk_info; + + if (info) { + int visible = 0; + for (size_t i = 0; i < info->topo_queue.nr && visible < n; i++) { + struct commit *c = info->topo_queue.array[i].data; + if (get_commit_action(revs, c) == commit_show) + visible++; + } + return visible > n-1; + } + if (revs->commits) { + struct commit_list *cl; + int visible = 0; + for (cl = revs->commits; cl && visible < n; cl = cl->next) { + if (get_commit_action(revs, cl->item) == commit_show) + visible++; + } + return visible > n-1; + } + + return 0; +} + static void trace2_topo_walk_statistics_atexit(void) { struct json_writer jw = JSON_WRITER_INIT; diff --git a/revision.h b/revision.h index c9a11827cc..fe297fdfa5 100644 --- a/revision.h +++ b/revision.h @@ -560,4 +560,14 @@ int rewrite_parents(struct rev_info *revs, */ struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit); +/* + * Peek into revision's next commit without consuming it. + */ +struct commit *revision_peek_next_commit(struct rev_info *revs); + +/* + * Check if there are n more commits to be shown yet. + */ +int revision_has_commits_after(struct rev_info *revs, int n); + #endif