[PATCH v6 0/3] graph: indent visual roots in graph
- From
Pablo Sabater <pabloosabaterr@gmail.com>
- Date
- Jun 20, 2026, 10:11 UTC
- Message-ID
- <20260620-ps-pre-commit-indent-v6-0-cdc6d8fd5fbc@gmail.com>
- In-Reply-To
- <20260613-ps-pre-commit-indent-v5-0-8d308efea63d@gmail.com>
When rendering a graph, if the history contains multiple "visual roots", actual roots or commits that look like roots (i.e. have their parents filtered out) can end up being vertically adjacent to unrelated commits, falsely appearing to be related.
A fix for this issue was already attempted [1] a while ago.
This series adds indentation to the visual root commits, so they cannot be vertically adjacent anymore making it easier to identify them.
before indentation:
* A * B1 * B2 * C1 * C2
after indentation:
* A * B1 \ * B2 * C1 * C2
Indents the visual root commits that have still commits to show after them, and if they have children it connects them with an edge at a new row.
If there are multiple visual roots adjacent in history, the indentation starts with the second one, avoiding redundant indentation of the first one and cascades after the second.
* A * B * C * D1 * D2
This series first commit is a cleanup that brings a common function from t4215 and t6016 to a graph functions file which they both use, so the new test file for indentation, t4218, can use it as well.
There are two main limitations to predict if the next commit will be a visual root candidate:
1. The peek only gives us the next entry reliably, we cannot see past it reliably in order.
2. Even if we could peek past in order, its parents might not have been simplified yet, so a future commit that will become a visual root is not detected as a visual root in peek-time.
This causes the cascading to not be set and result in a extra indentation. For example:
Given:
* A unrelated (visual root) * B child of C * C visual root WILL BE FILTERED OUT * D unrelated (visual root)
The actual output is:
* A * B * D
But we wanted:
* A * B * D
A test has been added to t4218 and a NEEDSWORK to the lookahead function to document this edge case but I'm not that familiar with revision.c. Maybe there's a better way to make the lookahead more reliable.
[1]: https://lore.kernel.org/git/xmqqwnwajbuj.fsf@gitster.c.googlers.com/
V5 DIFF:
- Added new commit with lookahead functions to abstract the commit traverse to the graph. Changed the lookahead function from graph to call this new functions. - Added new test with two unrelated branches with merges. - Fixed test_expect_failure to have the correct expected output. - Simplified the NEEDSWORK.
Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
---
Pablo Sabater (3):
lib-log-graph: move check_graph function
revision: add peek functions for lookahead
graph: indent visual root in graphgraph.c | 271 +++++++++++++++++ revision.c | 38 +++ revision.h | 10 + t/lib-log-graph.sh | 5 + t/meson.build | 1 + t/t4215-log-skewed-merges.sh | 33 +- t/t4218-log-graph-indentation.sh | 468 +++++++++++++++++++++++++++++ t/t6016-rev-list-graph-simplify-history.sh | 25 +- 8 files changed, 817 insertions(+), 34 deletions(-) --- base-commit: 95e20213faefeb95df29277c58ac1980ab68f701 change-id: 20260612-ps-pre-commit-indent-39ca72816382
Best regards, -- Pablo Sabater <pabloosabaterr@gmail.com>