D5102: beautifygraph: add configs for customizing the characters
hooper (Danny Hooper)
phabricator at mercurial-scm.org
Sun Oct 14 12:22:22 UTC 2018
hooper created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
I figure we should keep this out of graphmod.py and templatekw.py for now.
Moving the extension functionality out of hgext is a separate issue.
Calling ui.config() inside getgraphnode seems like it might slow things down,
but it needs to happen there because of the template keyword. We probably want
to honor config overrides, so we can't cache glyphs at this level.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D5102
AFFECTED FILES
hgext/beautifygraph.py
tests/test-glog-beautifygraph.t
CHANGE DETAILS
diff --git a/tests/test-glog-beautifygraph.t b/tests/test-glog-beautifygraph.t
--- a/tests/test-glog-beautifygraph.t
+++ b/tests/test-glog-beautifygraph.t
@@ -1,3 +1,29 @@
+ $ hg help beautifygraph
+ beautifygraph extension - beautify log -G output by using Unicode characters
+ (EXPERIMENTAL)
+
+ A terminal with UTF-8 support and monospace narrow text are required.
+
+ The character substitutions used in the graph can be customized with
+ variables in the [beautifygraph] section:
+
+ / ``beautifygraph.edge.diagonal1``
+ \ ``beautifygraph.edge.diagonal2``
+ - ``beautifygraph.edge.horizontal``
+ | ``beautifygraph.edge.vertical``
+ : ``beautifygraph.edge.verticaldotted``
+ -+- ``beautifygraph.edge.cross``
+ -+ ``beautifygraph.edge.verticalleft``
+ +- ``beautifygraph.edge.verticalright``
+ ~ ``beautifygraph.edge.verticalstop``
+ _ ``beautifygraph.node.closesbranch``
+ @ ``beautifygraph.node.current``
+ x ``beautifygraph.node.obsolete``
+ o ``beautifygraph.node.other``
+ * ``beautifygraph.node.unstable``
+
+ (use 'hg help extensions' for information on enabling extensions)
+
@ (34) head
|
| o (33) head
@@ -3112,3 +3138,84 @@
$ cd ..
+
+Construct a magical repo whose ascii graph log contains all the possible symbols.
+
+ $ hg init configuration
+ $ cd configuration
+
+ $ touch file0
+ $ hg commit -Aqm revision0
+ $ touch file1
+ $ hg commit -Aqm revision1
+ $ touch file2
+ $ hg commit -Aqm revision2
+ $ touch file3
+ $ hg commit -Aqm revision3
+ $ hg update -q null
+ $ touch file4
+ $ hg commit -Aqm revision4
+ $ hg update -q 3
+ $ hg merge -q 4
+ $ touch file5
+ $ hg commit -Aqm revision5
+ $ hg update -q null
+ $ touch file6
+ $ hg branch -q foo
+ $ hg commit -Aqm revision6
+ $ hg merge -q 3
+ $ touch file7
+ $ hg commit -Aqm revision7 --close-branch
+ $ hg update -q 4
+ $ hg merge -q 3
+ $ touch file8
+ $ hg commit -Aqm revision8
+ $ hg update -q 6
+ $ hg merge -q 5
+ $ touch file9
+ $ hg commit -Aqm revision9
+ $ touch file10
+ $ hg commit -Aqm revision10
+ $ hg debugobsolete $(hg log -r 9 -T '{node}')
+ obsoleted 1 changesets
+ 1 new orphan changesets
+ $ hg update -q 8
+
+All symbols should be configurable.
+
+ $ hg log -G -q -r '(1:)-2' \
+ > --config beautifygraph.edge.diagonal1=a \
+ > --config beautifygraph.edge.diagonal2=b \
+ > --config beautifygraph.edge.cross=c \
+ > --config beautifygraph.edge.horizontal=d \
+ > --config beautifygraph.edge.vertical=e \
+ > --config beautifygraph.edge.verticaldotted=f \
+ > --config beautifygraph.edge.verticalleft=g \
+ > --config beautifygraph.edge.verticalright=h \
+ > --config beautifygraph.edge.verticalstop=i \
+ > --config beautifygraph.node.closesbranch=j \
+ > --config beautifygraph.node.current=ð \
+ > --config beautifygraph.node.obsolete=l \
+ > --config beautifygraph.node.other=m \
+ > --config beautifygraph.node.unstable=n
+ n 10:3bf4adf1e513
+ e
+ l 9:a4d281932d8a
+ eb
+ e e ð 8:b9029cea3597 (esc)
+ e e eb
+ e hdcdddj 7:12cd82bb4409
+ e e e e
+ e m e e 6:11bb041c7deb
+ e a a
+ mdddg 5:0b61ae539b30
+ ea a
+ e m 4:f2e786cf2f3d
+ e
+ m 3:561d8244024e
+ f
+ m 1:388ecb15405b
+ e
+ i
+
+ $ cd ..
diff --git a/hgext/beautifygraph.py b/hgext/beautifygraph.py
--- a/hgext/beautifygraph.py
+++ b/hgext/beautifygraph.py
@@ -9,6 +9,24 @@
'''beautify log -G output by using Unicode characters (EXPERIMENTAL)
A terminal with UTF-8 support and monospace narrow text are required.
+
+ The character substitutions used in the graph can be customized with
+ variables in the [beautifygraph] section::
+
+ / ``beautifygraph.edge.diagonal1``
+ \ ``beautifygraph.edge.diagonal2``
+ - ``beautifygraph.edge.horizontal``
+ | ``beautifygraph.edge.vertical``
+ : ``beautifygraph.edge.verticaldotted``
+ -+- ``beautifygraph.edge.cross``
+ -+ ``beautifygraph.edge.verticalleft``
+ +- ``beautifygraph.edge.verticalright``
+ ~ ``beautifygraph.edge.verticalstop``
+ _ ``beautifygraph.node.closesbranch``
+ @ ``beautifygraph.node.current``
+ x ``beautifygraph.node.obsolete``
+ o ``beautifygraph.node.other``
+ * ``beautifygraph.node.unstable``
'''
from __future__ import absolute_import
@@ -19,6 +37,7 @@
extensions,
graphmod,
pycompat,
+ registrar,
templatekw,
)
@@ -28,53 +47,69 @@
# leave the attribute unspecified.
testedwith = 'ships-with-hg-core'
-def prettyedge(before, edge, after):
- if edge == '~':
- return '\xE2\x95\xA7' # U+2567 â§
- if edge == '/':
- return '\xE2\x95\xB1' # U+2571 â±
- if edge == '-':
- return '\xE2\x94\x80' # U+2500 â
- if edge == '|':
- return '\xE2\x94\x82' # U+2502 â
- if edge == ':':
- return '\xE2\x94\x86' # U+2506 â
- if edge == '\\':
- return '\xE2\x95\xB2' # U+2572 â²
+configtable = {}
+configitem = registrar.configitem(configtable)
+
+configitem('beautifygraph', 'edge.verticalstop', '\xE2\x95\xA7') # U+2567 â§
+configitem('beautifygraph', 'edge.diagonalcross', '\xE2\x95\xB3') # U+2573 â³
+configitem('beautifygraph', 'edge.diagonal1', '\xE2\x95\xB1') # U+2571 â±
+configitem('beautifygraph', 'edge.horizontal', '\xE2\x94\x80') # U+2500 â
+configitem('beautifygraph', 'edge.vertical', '\xE2\x94\x82') # U+2502 â
+configitem('beautifygraph', 'edge.verticaldotted', '\xE2\x94\x86') # U+2506 â
+configitem('beautifygraph', 'edge.diagonal2', '\xE2\x95\xB2') # U+2572 â²
+configitem('beautifygraph', 'edge.verticalright', '\xE2\x94\x9C') # U+251C â
+configitem('beautifygraph', 'edge.verticalleft', '\xE2\x94\xA4') # U+2524 â¤
+configitem('beautifygraph', 'edge.cross', '\xE2\x94\xBC') # U+253C â¼
+configitem('beautifygraph', 'node.other', '\xE2\x97\x8B') # U+25CB â
+configitem('beautifygraph', 'node.current', '\xE2\x97\x8D') # U+25CD â
+configitem('beautifygraph', 'node.unstable', '\xE2\x88\x97') # U+2217 â
+configitem('beautifygraph', 'node.obsolete', '\xE2\x97\x8C') # U+25CC â
+configitem('beautifygraph', 'node.closesbranch', '\xE2\x95\xA4') # U+2564 â¤
+
+def getsubstitutions(ui):
+ return {
+ '~': ui.config('beautifygraph', 'edge.verticalstop'),
+ '/': ui.config('beautifygraph', 'edge.diagonal1'),
+ '-': ui.config('beautifygraph', 'edge.horizontal'),
+ '|': ui.config('beautifygraph', 'edge.vertical'),
+ ':': ui.config('beautifygraph', 'edge.verticaldotted'),
+ '\\': ui.config('beautifygraph', 'edge.diagonal2'),
+ '+-': ui.config('beautifygraph', 'edge.verticalright'),
+ '-+': ui.config('beautifygraph', 'edge.verticalleft'),
+ '+': ui.config('beautifygraph', 'edge.cross'),
+ 'o': ui.config('beautifygraph', 'node.other'),
+ '@': ui.config('beautifygraph', 'node.current'),
+ '*': ui.config('beautifygraph', 'node.unstable'),
+ 'x': ui.config('beautifygraph', 'node.obsolete'),
+ '_': ui.config('beautifygraph', 'node.closesbranch'),
+ }
+
+def prettyedge(substitutions, before, edge, after):
if edge == '+':
if before == ' ' and not after == ' ':
- return '\xE2\x94\x9C' # U+251C â
+ return substitutions.get('+-', edge)
if after == ' ' and not before == ' ':
- return '\xE2\x94\xA4' # U+2524 â¤
- return '\xE2\x94\xBC' # U+253C â¼
- return edge
+ return substitutions.get('-+', edge)
+ return substitutions.get(edge, edge)
-def convertedges(line):
+def convertedges(substitutions, line):
line = ' %s ' % line
pretty = []
for idx in pycompat.xrange(len(line) - 2):
- pretty.append(prettyedge(line[idx:idx + 1],
+ pretty.append(prettyedge(substitutions,
+ line[idx:idx + 1],
line[idx + 1:idx + 2],
line[idx + 2:idx + 3]))
return ''.join(pretty)
-def getprettygraphnode(orig, *args, **kwargs):
- node = orig(*args, **kwargs)
- if node == 'o':
- return '\xE2\x97\x8B' # U+25CB â
- if node == '@':
- return '\xE2\x97\x8D' # U+25CD â
- if node == '*':
- return '\xE2\x88\x97' # U+2217 â
- if node == 'x':
- return '\xE2\x97\x8C' # U+25CC â
- if node == '_':
- return '\xE2\x95\xA4' # U+2564 â¤
- return node
+def getprettygraphnode(orig, repo, *args, **kwargs):
+ node = orig(repo, *args, **kwargs)
+ return getsubstitutions(repo.ui).get(node, node)
def outputprettygraph(orig, ui, graph, *args, **kwargs):
+ substitutions = getsubstitutions(ui)
(edges, text) = zip(*graph)
- graph = zip([convertedges(e) for e in edges], text)
+ graph = zip([convertedges(substitutions, e) for e in edges], text)
return orig(ui, graph, *args, **kwargs)
def extsetup(ui):
To: hooper, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list