graphlog: make node symbol templatable by ui.graphnodetemplate option
New ui.graphnodetemplate option allows us to colorize a node symbol by phase
or branch,
[ui]
graphnodetemplate = {label('graphnode.{phase}', graphnode)}
[color]
graphnode.draft = yellow bold
or use a variety of unicode emoji characters, and so on. (You'll need less-481
to display non-BMP unicode character.)
[ui]
graphnodetemplate = {ifeq(obsolete, 'stable', graphnode, '\xf0\x9f\x92\xa9')}
--- a/mercurial/cmdutil.py Sat Nov 14 17:02:57 2015 +0900
+++ b/mercurial/cmdutil.py Sat Nov 14 17:25:43 2015 +0900
@@ -2159,11 +2159,31 @@
return revs, expr, filematcher
+def _graphnodeformatter(ui, displayer):
+ spec = ui.config('ui', 'graphnodetemplate')
+ if not spec:
+ return templatekw.showgraphnode # fast path for "{graphnode}"
+
+ templ = formatter.gettemplater(ui, 'graphnode', spec)
+ cache = {}
+ if isinstance(displayer, changeset_templater):
+ cache = displayer.cache # reuse cache of slow templates
+ props = templatekw.keywords.copy()
+ props['templ'] = templ
+ props['cache'] = cache
+ def formatnode(repo, ctx):
+ props['ctx'] = ctx
+ props['repo'] = repo
+ props['revcache'] = {}
+ return templater.stringify(templ('graphnode', **props))
+ return formatnode
+
def displaygraph(ui, repo, dag, displayer, edgefn, getrenamed=None,
filematcher=None):
+ formatnode = _graphnodeformatter(ui, displayer)
seen, state = [], graphmod.asciistate()
for rev, type, ctx, parents in dag:
- char = templatekw.showgraphnode(repo, ctx)
+ char = formatnode(repo, ctx)
copies = None
if getrenamed and ctx.rev():
copies = []
--- a/mercurial/help/config.txt Sat Nov 14 17:02:57 2015 +0900
+++ b/mercurial/help/config.txt Sat Nov 14 17:25:43 2015 +0900
@@ -1454,6 +1454,10 @@
Encoding to try if it's not possible to decode the changelog using
UTF-8. (default: ISO-8859-1)
+``graphnodetemplate``
+ The template used to print changeset nodes in an ASCII revision graph.
+ (default: ``{graphnode}``)
+
``ignore``
A file to read per-user ignore patterns from. This file should be
in the same format as a repository-wide .hgignore file. Filenames
--- a/tests/test-glog.t Sat Nov 14 17:02:57 2015 +0900
+++ b/tests/test-glog.t Sat Nov 14 17:25:43 2015 +0900
@@ -2400,4 +2400,25 @@
@ 3:5918b8d165d1
|
+node template with changeset_printer:
+
+ $ hg log -Gqr 5:7 --config ui.graphnodetemplate='{rev}'
+ 7 7:02dbb8e276b8
+ |
+ 6 6:fc281d8ff18d
+ |\
+ 5 | 5:99b31f1c2782
+ | |
+
+node template with changeset_templater (shared cache variable):
+
+ $ hg log -Gr 5:7 -T '{latesttag % "{rev} {tag}+{distance}"}\n' \
+ > --config ui.graphnodetemplate='{ifeq(latesttagdistance, 0, "#", graphnode)}'
+ o 7 foo-bar+1
+ |
+ # 6 foo-bar+0
+ |\
+ o | 5 null+5
+ | |
+
$ cd ..