# HG changeset patch # User Gregory Szorc # Date 1498341135 25200 # Node ID 46fa46608ca599607006361af52087b297da1144 # Parent de8e3681c402c1dab7d81eb4607e23e0df2b8148 namespaces: record and expose whether namespace is built-in Currently, the templating layer tends to treat each namespace as a one-off, with explicit usage of {bookmarks}, {tags}, {branch}, etc instead of using {namespaces}. It would be really useful if we could iterate over namespaces and operate on them generically. However, some consumers may wish to differentiate namespaces by whether they are built-in to core Mercurial or provided by extensions. Expected use cases include ignoring non-built-in namespaces or emitting a generic label for non-built-in namespaces. This commit introduces an attribute on namespace instances that says whether the namespace is "built-in" and then exposes this to the templating layer. As part of this, we implement a reusable extension for defining custom names on each changeset for testing. A second consumer will be introduced in a subsequent commit. diff -r de8e3681c402 -r 46fa46608ca5 mercurial/namespaces.py --- a/mercurial/namespaces.py Sat Jun 24 13:39:20 2017 -0700 +++ b/mercurial/namespaces.py Sat Jun 24 14:52:15 2017 -0700 @@ -35,7 +35,8 @@ # i18n: column positioning for "hg log" logfmt=_("bookmark: %s\n"), listnames=bmknames, - namemap=bmknamemap, nodemap=bmknodemap) + namemap=bmknamemap, nodemap=bmknodemap, + builtin=True) self.addnamespace(n) tagnames = lambda repo: [t for t, n in repo.tagslist()] @@ -46,7 +47,8 @@ logfmt=_("tag: %s\n"), listnames=tagnames, namemap=tagnamemap, nodemap=tagnodemap, - deprecated={'tip'}) + deprecated={'tip'}, + builtin=True) self.addnamespace(n) bnames = lambda repo: repo.branchmap().keys() @@ -56,7 +58,8 @@ # i18n: column positioning for "hg log" logfmt=_("branch: %s\n"), listnames=bnames, - namemap=bnamemap, nodemap=bnodemap) + namemap=bnamemap, nodemap=bnodemap, + builtin=True) self.addnamespace(n) def __getitem__(self, namespace): @@ -134,12 +137,13 @@ 'namemap': function that takes a name and returns a list of nodes 'nodemap': function that takes a node and returns a list of names 'deprecated': set of names to be masked for ordinary use - + 'builtin': bool indicating if this namespace is supported by core + Mercurial. """ def __init__(self, name, templatename=None, logname=None, colorname=None, logfmt=None, listnames=None, namemap=None, nodemap=None, - deprecated=None): + deprecated=None, builtin=False): """create a namespace name: the namespace to be registered (in plural form) @@ -154,7 +158,7 @@ namemap: function that inputs a name, output node(s) nodemap: function that inputs a node, output name(s) deprecated: set of names to be masked for ordinary use - + builtin: whether namespace is implemented by core Mercurial """ self.name = name self.templatename = templatename @@ -183,6 +187,8 @@ else: self.deprecated = deprecated + self.builtin = builtin + def names(self, repo, node): """method that returns a (sorted) list of names in a namespace that match a given node""" diff -r de8e3681c402 -r 46fa46608ca5 mercurial/templatekw.py --- a/mercurial/templatekw.py Sat Jun 24 13:39:20 2017 -0700 +++ b/mercurial/templatekw.py Sat Jun 24 14:52:15 2017 -0700 @@ -557,10 +557,12 @@ namespaces = util.sortdict() colornames = {} + builtins = {} for k, ns in repo.names.iteritems(): namespaces[k] = showlist('name', ns.names(repo, ctx.node()), args) colornames[k] = ns.colorname + builtins[k] = ns.builtin f = _showlist('namespace', list(namespaces), args) @@ -568,6 +570,7 @@ return { 'namespace': ns, 'names': namespaces[ns], + 'builtin': builtins[ns], 'colorname': colornames[ns], } diff -r de8e3681c402 -r 46fa46608ca5 tests/revnamesext.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/revnamesext.py Sat Jun 24 14:52:15 2017 -0700 @@ -0,0 +1,18 @@ +# Dummy extension to define a namespace containing revision names + +from __future__ import absolute_import + +from mercurial import ( + namespaces, +) + +def reposetup(ui, repo): + names = {'r%d' % rev: repo[rev].node() for rev in repo} + namemap = lambda r, name: names.get(name) + nodemap = lambda r, node: ['r%d' % repo[node].rev()] + + ns = namespaces.namespace('revnames', templatename='revname', + logname='revname', + listnames=lambda r: names.keys(), + namemap=namemap, nodemap=nodemap) + repo.names.addnamespace(ns) diff -r de8e3681c402 -r 46fa46608ca5 tests/test-command-template.t --- a/tests/test-command-template.t Sat Jun 24 13:39:20 2017 -0700 +++ b/tests/test-command-template.t Sat Jun 24 14:52:15 2017 -0700 @@ -3894,30 +3894,36 @@ Test namespaces dict - $ hg log -T '{rev}\n{namespaces % " {namespace} color={colorname}\n {join(names, ",")}\n"}\n' + $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n {join(names, ",")}\n"}\n' 2 - bookmarks color=bookmark + bookmarks color=bookmark builtin=True bar,foo - tags color=tag + tags color=tag builtin=True tip - branches color=branch + branches color=branch builtin=True text.{rev} + revnames color=revname builtin=False + r2 1 - bookmarks color=bookmark + bookmarks color=bookmark builtin=True baz - tags color=tag + tags color=tag builtin=True - branches color=branch + branches color=branch builtin=True text.{rev} + revnames color=revname builtin=False + r1 0 - bookmarks color=bookmark + bookmarks color=bookmark builtin=True + + tags color=tag builtin=True - tags color=tag - - branches color=branch + branches color=branch builtin=True default + revnames color=revname builtin=False + r0 $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}' bookmarks: bar foo