[PATCH 4 of 5] graphlog: move functions into more logical order
Peter Arrenbrecht
peter.arrenbrecht at gmail.com
Thu Nov 6 09:26:22 CST 2008
# HG changeset patch
# User Peter Arrenbrecht <peter.arrenbrecht at gmail.com>
# Date 1225984485 -3600
graphlog: move functions into more logical order
Group function defs into blocks of main and helper functions.
diff --git a/hgext/graphlog.py b/hgext/graphlog.py
--- a/hgext/graphlog.py
+++ b/hgext/graphlog.py
@@ -15,6 +15,167 @@
from mercurial.util import Abort, canonpath
from mercurial import util
+def fix_long_right_edges(edges):
+ for (i, (start, end)) in enumerate(edges):
+ if end > start:
+ edges[i] = (start, end + 1)
+
+def draw_edges(edges, nodeline, interline):
+ for (start, end) in edges:
+ if start == end + 1:
+ interline[2 * end + 1] = "/"
+ elif start == end - 1:
+ interline[2 * start + 1] = "\\"
+ elif start == end:
+ interline[2 * start] = "|"
+ else:
+ nodeline[2 * end] = "+"
+ if start > end:
+ (start, end) = (end,start)
+ for i in range(2 * start + 1, 2 * end):
+ if nodeline[i] != "+":
+ nodeline[i] = "-"
+
+def format_line(line, level, logstr):
+ text = "%-*s %s" % (2 * level, "".join(line), logstr)
+ return "%s\n" % text.rstrip()
+
+def get_nodeline_edges_tail(
+ node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
+ if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
+ # Still going in the same non-vertical direction.
+ if n_columns_diff == -1:
+ start = max(node_index + 1, p_node_index)
+ tail = ["|", " "] * (start - node_index - 1)
+ tail.extend(["/", " "] * (n_columns - start))
+ return tail
+ else:
+ return ["\\", " "] * (n_columns - node_index - 1)
+ else:
+ return ["|", " "] * (n_columns - node_index - 1)
+
+def get_padding_line(ni, n_columns, edges):
+ line = []
+ line.extend(["|", " "] * ni)
+ if (ni, ni - 1) in edges or (ni, ni) in edges:
+ # (ni, ni - 1) (ni, ni)
+ # | | | | | | | |
+ # +---o | | o---+
+ # | | c | | c | |
+ # | |/ / | |/ /
+ # | | | | | |
+ c = "|"
+ else:
+ c = " "
+ line.extend([c, " "])
+ line.extend(["|", " "] * (n_columns - ni - 1))
+ return line
+
+def asciigraph(ui, grapher):
+ """prints an ASCII graph of the DAG returned by the grapher
+
+ grapher is a generator that emits tuples with the following elements:
+
+ - Character to use as node's symbol.
+ - List of lines to display as the node's text.
+ - Column of the current node in the set of ongoing edges.
+ - Edges; a list of (col, next_col) indicating the edges between
+ the current node and its parents.
+ - Number of columns (ongoing edges) in the current revision.
+ - The difference between the number of columns (ongoing edges)
+ in the next revision and the number of columns (ongoing edges)
+ in the current revision. That is: -1 means one column removed;
+ 0 means no columns added or removed; 1 means one column added.
+ """
+ prev_n_columns_diff = 0
+ prev_node_index = 0
+ for (node_ch, node_lines, node_index, edges, n_columns, n_columns_diff) in grapher:
+ # node_lines is the list of all text lines to draw alongside the graph
+
+ if n_columns_diff == -1:
+ # Transform
+ #
+ # | | | | | |
+ # o | | into o---+
+ # |X / |/ /
+ # | | | |
+ fix_long_right_edges(edges)
+
+ # add_padding_line says whether to rewrite
+ #
+ # | | | | | | | |
+ # | o---+ into | o---+
+ # | / / | | | # <--- padding line
+ # o | | | / /
+ # o | |
+ add_padding_line = (len(node_lines) > 2 and
+ n_columns_diff == -1 and
+ [x for (x, y) in edges if x + 1 < y])
+
+ # fix_nodeline_tail says whether to rewrite
+ #
+ # | | o | | | | o | |
+ # | | |/ / | | |/ /
+ # | o | | into | o / / # <--- fixed nodeline tail
+ # | |/ / | |/ /
+ # o | | o | |
+ fix_nodeline_tail = len(node_lines) <= 2 and not add_padding_line
+
+ # nodeline is the line containing the node character (typically o)
+ nodeline = ["|", " "] * node_index
+ nodeline.extend([node_ch, " "])
+
+ nodeline.extend(
+ get_nodeline_edges_tail(
+ node_index, prev_node_index, n_columns, n_columns_diff,
+ prev_n_columns_diff, fix_nodeline_tail))
+
+ # shift_interline is the line containing the non-vertical
+ # edges between this entry and the next
+ shift_interline = ["|", " "] * node_index
+ if n_columns_diff == -1:
+ n_spaces = 1
+ edge_ch = "/"
+ elif n_columns_diff == 0:
+ n_spaces = 2
+ edge_ch = "|"
+ else:
+ n_spaces = 3
+ edge_ch = "\\"
+ shift_interline.extend(n_spaces * [" "])
+ shift_interline.extend([edge_ch, " "] * (n_columns - node_index - 1))
+
+ # draw edges from the current node to its parents
+ draw_edges(edges, nodeline, shift_interline)
+
+ # lines is the list of all graph lines to print
+ lines = [nodeline]
+ if add_padding_line:
+ lines.append(get_padding_line(node_index, n_columns, edges))
+ lines.append(shift_interline)
+
+ # make sure that there are as many graph lines as there are
+ # log strings
+ while len(node_lines) < len(lines):
+ node_lines.append("")
+ if len(lines) < len(node_lines):
+ extra_interline = ["|", " "] * (n_columns + n_columns_diff)
+ while len(lines) < len(node_lines):
+ lines.append(extra_interline)
+
+ # print lines
+ indentation_level = max(n_columns, n_columns + n_columns_diff)
+ for (line, logstr) in zip(lines, node_lines):
+ ui.write(format_line(line, indentation_level, logstr))
+
+ # ...and start over
+ prev_node_index = node_index
+ prev_n_columns_diff = n_columns_diff
+
+
+def get_rev_parents(repo, rev):
+ return [x for x in repo.changelog.parentrevs(rev) if x != nullrev]
+
def revision_grapher(repo, start_rev, stop_rev):
"""incremental revision grapher
@@ -120,64 +281,6 @@
revs = next_revs
filerev -= 1
-def get_rev_parents(repo, rev):
- return [x for x in repo.changelog.parentrevs(rev) if x != nullrev]
-
-def fix_long_right_edges(edges):
- for (i, (start, end)) in enumerate(edges):
- if end > start:
- edges[i] = (start, end + 1)
-
-def draw_edges(edges, nodeline, interline):
- for (start, end) in edges:
- if start == end + 1:
- interline[2 * end + 1] = "/"
- elif start == end - 1:
- interline[2 * start + 1] = "\\"
- elif start == end:
- interline[2 * start] = "|"
- else:
- nodeline[2 * end] = "+"
- if start > end:
- (start, end) = (end,start)
- for i in range(2 * start + 1, 2 * end):
- if nodeline[i] != "+":
- nodeline[i] = "-"
-
-def format_line(line, level, logstr):
- text = "%-*s %s" % (2 * level, "".join(line), logstr)
- return "%s\n" % text.rstrip()
-
-def get_nodeline_edges_tail(
- node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
- if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
- # Still going in the same non-vertical direction.
- if n_columns_diff == -1:
- start = max(node_index + 1, p_node_index)
- tail = ["|", " "] * (start - node_index - 1)
- tail.extend(["/", " "] * (n_columns - start))
- return tail
- else:
- return ["\\", " "] * (n_columns - node_index - 1)
- else:
- return ["|", " "] * (n_columns - node_index - 1)
-
-def get_padding_line(ni, n_columns, edges):
- line = []
- line.extend(["|", " "] * ni)
- if (ni, ni - 1) in edges or (ni, ni) in edges:
- # (ni, ni - 1) (ni, ni)
- # | | | | | | | |
- # +---o | | o---+
- # | | c | | c | |
- # | |/ / | |/ /
- # | | | | | |
- c = "|"
- else:
- c = " "
- line.extend([c, " "])
- line.extend(["|", " "] * (n_columns - ni - 1))
- return line
def get_limit(limit_opt):
if limit_opt:
@@ -198,107 +301,6 @@
else:
return (len(repo) - 1, 0)
-def asciigraph(ui, grapher):
- """prints an ASCII graph of the DAG returned by the grapher
-
- grapher is a generator that emits tuples with the following elements:
-
- - Character to use as node's symbol.
- - List of lines to display as the node's text.
- - Column of the current node in the set of ongoing edges.
- - Edges; a list of (col, next_col) indicating the edges between
- the current node and its parents.
- - Number of columns (ongoing edges) in the current revision.
- - The difference between the number of columns (ongoing edges)
- in the next revision and the number of columns (ongoing edges)
- in the current revision. That is: -1 means one column removed;
- 0 means no columns added or removed; 1 means one column added.
- """
- prev_n_columns_diff = 0
- prev_node_index = 0
- for (node_ch, node_lines, node_index, edges, n_columns, n_columns_diff) in grapher:
- # node_lines is the list of all text lines to draw alongside the graph
-
- if n_columns_diff == -1:
- # Transform
- #
- # | | | | | |
- # o | | into o---+
- # |X / |/ /
- # | | | |
- fix_long_right_edges(edges)
-
- # add_padding_line says whether to rewrite
- #
- # | | | | | | | |
- # | o---+ into | o---+
- # | / / | | | # <--- padding line
- # o | | | / /
- # o | |
- add_padding_line = (len(node_lines) > 2 and
- n_columns_diff == -1 and
- [x for (x, y) in edges if x + 1 < y])
-
- # fix_nodeline_tail says whether to rewrite
- #
- # | | o | | | | o | |
- # | | |/ / | | |/ /
- # | o | | into | o / / # <--- fixed nodeline tail
- # | |/ / | |/ /
- # o | | o | |
- fix_nodeline_tail = len(node_lines) <= 2 and not add_padding_line
-
- # nodeline is the line containing the node character (typically o)
- nodeline = ["|", " "] * node_index
- nodeline.extend([node_ch, " "])
-
- nodeline.extend(
- get_nodeline_edges_tail(
- node_index, prev_node_index, n_columns, n_columns_diff,
- prev_n_columns_diff, fix_nodeline_tail))
-
- # shift_interline is the line containing the non-vertical
- # edges between this entry and the next
- shift_interline = ["|", " "] * node_index
- if n_columns_diff == -1:
- n_spaces = 1
- edge_ch = "/"
- elif n_columns_diff == 0:
- n_spaces = 2
- edge_ch = "|"
- else:
- n_spaces = 3
- edge_ch = "\\"
- shift_interline.extend(n_spaces * [" "])
- shift_interline.extend([edge_ch, " "] * (n_columns - node_index - 1))
-
- # draw edges from the current node to its parents
- draw_edges(edges, nodeline, shift_interline)
-
- # lines is the list of all graph lines to print
- lines = [nodeline]
- if add_padding_line:
- lines.append(get_padding_line(node_index, n_columns, edges))
- lines.append(shift_interline)
-
- # make sure that there are as many graph lines as there are
- # log strings
- while len(node_lines) < len(lines):
- node_lines.append("")
- if len(lines) < len(node_lines):
- extra_interline = ["|", " "] * (n_columns + n_columns_diff)
- while len(lines) < len(node_lines):
- lines.append(extra_interline)
-
- # print lines
- indentation_level = max(n_columns, n_columns + n_columns_diff)
- for (line, logstr) in zip(lines, node_lines):
- ui.write(format_line(line, indentation_level, logstr))
-
- # ...and start over
- prev_node_index = node_index
- prev_n_columns_diff = n_columns_diff
-
def graphlog(ui, repo, path=None, **opts):
"""show revision history alongside an ASCII revision graph
More information about the Mercurial-devel
mailing list