# HG changeset patch # User Yuya Nishihara # Date 1447489543 -32400 # Node ID 8117e2cd959e49f30a189208b807ad3d622ae312 # Parent 5b8da5643a8a4c6a74531851df3449cc277f362c 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')} diff -r 5b8da5643a8a -r 8117e2cd959e mercurial/cmdutil.py --- 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 = [] diff -r 5b8da5643a8a -r 8117e2cd959e mercurial/help/config.txt --- 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 diff -r 5b8da5643a8a -r 8117e2cd959e tests/test-glog.t --- 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 ..