[PATCH v12 0/7] graph: indent visual roots in graph
- From
Pablo Sabater <pabloosabaterr@gmail.com>
- Date
- Jul 14, 2026, 12:09 UTC
- Message-ID
- <20260714-ps-pre-commit-indent-v12-0-d50938e006df@gmail.com>
- In-Reply-To
- <20260713-ps-pre-commit-indent-v11-0-dcb65bc4ba99@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 * D * E * F * G * H * I * J1 * J2
The indentation wraps after cascading columns and when wrapping back to the initial column if the next commit is a non-visual-root commit, force the indentation one extra level.
Series explanation:
1. Cleanup to bring a common function from t4215 and t6016 that will be used in t4218.
2. Logic extraction of the chose of from where the commit source comes from.
3. Add a buffer for lookahead purposes.
4. Principal commit. Implement the logic to get the visual roots indented.
5. Make visual root cascading wrap after 4 columns
6. Add --[no-]graph-indent and log.graphIndent options.
GitHub CI: https://github.com/pabloosabaterr/git/actions/runs/29331144667
[1]: https://lore.kernel.org/git/xmqqwnwajbuj.fsf@gitster.c.googlers.com/
V11 DIFF:
- Changed the check that required graph, to not confuse because it is a boolean value.
- Typos
Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
---
Pablo Sabater (7):
lib-log-graph: move check_graph function
revision: add next_commit_to_show()
graph: add a 2 commit buffer for lookahead
graph: indent visual root in graph
graph: wrap cascading commits after 4 columns
graph: move config reading into graph_read_config()
graph: add --[no-]graph-indent and log.graphIndentDocumentation/config/log.adoc | 4 + Documentation/rev-list-options.adoc | 8 + graph.c | 332 +++++++++++++++- graph.h | 17 + revision.c | 57 ++- revision.h | 2 + t/lib-log-graph.sh | 5 + t/meson.build | 1 + t/t4215-log-skewed-merges.sh | 33 +- t/t4218-log-graph-indentation.sh | 596 +++++++++++++++++++++++++++++ t/t6016-rev-list-graph-simplify-history.sh | 25 +- 11 files changed, 1032 insertions(+), 48 deletions(-)
Range-diff versus v11:
1: dd0bb0d215 = 1: d754392142 lib-log-graph: move check_graph function
2: 07e239533d = 2: c93c2c0771 revision: add next_commit_to_show()
3: 4d71f674a1 = 3: 70fe612ae1 graph: add a 2 commit buffer for lookahead
4: 48ad2562f0 = 4: e1ac06c4ea graph: indent visual root in graph
5: 45be69d11b = 5: ce52b41527 graph: wrap cascading commits after 4 columns
6: 8ce53ae21b = 6: 9b7bb2cebc graph: move config reading into graph_read_config()
7: c1fa81022e ! 7: 13e830725f graph: add --[no-]graph-indent and log.graphIndent
@@ Documentation/rev-list-options.adoc: This implies the `--topo-order` option by d
+ When used with `--graph`, indent visual roots (commits with no parents
+ or whose parents are not shown) to differentiate them from commits that
+ are vertically adjacent but unrelated. Enabled by default. Use
-+ `--no-graph-indent` to disable or set `graph.indent` to set a deafault
-+ preference.
++ `--no-graph-indent` to disable or set `log.graphIndent` to set a
++ default preference.
+
ifdef::git-rev-list[]
`--count`::
@@ revision.c: int setup_revisions(int argc, const char **argv, struct rev_info *re
if (revs->graph_max_lanes > 0 && !revs->graph)
die(_("the option '%s' requires '%s'"), "--graph-lane-limit", "--graph"); -+ if (revs->graph_indent_set > 0 && !revs->graph)
++ if (revs->graph_indent_set && !revs->graph)
+ die(_("the option '%s' requires '%s'"), "--[no-]graph-indent", "--graph");
+
if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
@@ t/t4218-log-graph-indentation.sh: test_expect_success 'visual root cascading get
+ EOF
+'
+
-+# graph.indent true and no --option is the default state.
++# log.graphIndent unset and no --option (which activates graph indentation) is
++# the default state.
+
test_done--- base-commit: f60db8d575adb79761d363e026fb49bddf330c73