[PATCH v11 0/7] graph: indent visual roots in graph
From: Pablo Sabater <hidden>
Date: 2026-07-13 16:44:09
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: - Cleanup to bring a common function from t4215 and t6016 that will be used in t4218. - Logic extraction of the chose of from where the commit source comes from. - Add a buffer for lookahead purposes. - Principal commit. Implement the logic to get the visual roots indented. - Make visual root cascading wrap after 4 columns - Add --[no-]graph-indent and log.graphIndent options. GitHub CI: https://github.com/pabloosabaterr/git/actions/runs/29266560903 [1]: https://lore.kernel.org/git/xmqqwnwajbuj.fsf@gitster.c.googlers.com/ (local) V9 DIFF: - Changed boolean variables to be bit fields. Signed-off-by: Pablo Sabater <redacted> --- 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.graphIndent Documentation/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 | 595 +++++++++++++++++++++++++++++ t/t6016-rev-list-graph-simplify-history.sh | 25 +- 11 files changed, 1031 insertions(+), 48 deletions(-) Range-diff versus v10: 1: 9541b410b7 = 1: dd0bb0d215 lib-log-graph: move check_graph function 2: 4f8fb2cc1d = 2: 07e239533d revision: add next_commit_to_show() 3: b50574bbe1 = 3: 4d71f674a1 graph: add a 2 commit buffer for lookahead 4: fc3a8253fd = 4: 48ad2562f0 graph: indent visual root in graph 5: 204aae5061 = 5: 45be69d11b graph: wrap cascading commits after 4 columns 6: 1b42ed86a1 = 6: 8ce53ae21b graph: move config reading into graph_read_config() 7: 737331b68d ! 7: c1fa81022e graph: add --[no-]graph-indent and log.graphIndent @@ revision.h: struct rev_info { /* Display history graph */ struct git_graph *graph; int graph_max_lanes; -+ int no_graph_indent; -+ unsigned int graph_indent_set; ++ unsigned int no_graph_indent:1; ++ unsigned int graph_indent_set:1; /* special limits */ int skip_count; --- base-commit: f60db8d575adb79761d363e026fb49bddf330c73