Patchwork [3,of,7] namespaces: add nodemap property

mail settings
Submitter Sean Farley
Date Dec. 17, 2014, 12:01 a.m.
Message ID <3edda131b6c2e4c40f4f.1418774517@laptop.local>
Download mbox | patch
Permalink /patch/7131/
State Superseded
Commit 0fd778ef0f610a8d68cdde365e0f2c6f0d0a0508
Headers show


Sean Farley - Dec. 17, 2014, 12:01 a.m.
# HG changeset patch
# User Sean Farley <>
# Date 1418631863 28800
#      Mon Dec 15 00:24:23 2014 -0800
# Node ID 3edda131b6c2e4c40f4f0d75391bccccdc3d2e62
# Parent  20d4ee5a54a247e6b5f8190276a665b96317bd51
namespaces: add nodemap property

Previously, we only had a name-to-node map.

This patch adds a node-to-name map which future patches will use to generate
template keywords.


diff --git a/mercurial/ b/mercurial/
--- a/mercurial/
+++ b/mercurial/
@@ -15,22 +15,24 @@  class namespaces(object):
     provides an interface to register a generic many-to-many mapping between
     some (namespaced) names and nodes. The goal here is to control the
     pollution of jamming things into tags or bookmarks (in extension-land) and
     to simplify internal bits of mercurial: log output, tab completion, etc.
-    More precisely, we define a list of names (the namespace) and  a mapping of
-    names to nodes. This name mapping returns a list of nodes.
+    More precisely, we define a list of names (the namespace), a mapping of
+    names to nodes, and a mapping from nodes to names. Each mapping
+    returns a list of nodes.
     Furthermore, each name mapping will be passed a name to lookup which might
     not be in its domain. In this case, each method should return an empty list
     and not raise an error.
     We'll have a dictionary '_names' where each key is a namespace and
     its value is a dictionary of functions:
       'singular': singular name of the namespace (e.g. "bookmark"
                   vs. "bookmarks")
       'namemap': function that takes a name and returns a list of nodes
+      'nodemap': function that takes a node and returns a list of names
     _names_version = 0
     def __init__(self):
@@ -39,31 +41,36 @@  class namespaces(object):
         addns = self.addnamespace
         # we need current mercurial named objects (bookmarks, tags, and
         # branches) to be initialized somewhere, so that place is here
         addns("bookmarks", "bookmark",
-              lambda repo, name: tolist(repo._bookmarks.get(name)))
+              lambda repo, name: tolist(repo._bookmarks.get(name)),
+              lambda repo, name: repo.nodebookmarks(name))
         addns("tags", "tag",
-              lambda repo, name: tolist(repo._tagscache.tags.get(name)))
+              lambda repo, name: tolist(repo._tagscache.tags.get(name)),
+              lambda repo, name: repo.nodetags(name))
         addns("branches", "branch",
-              lambda repo, name: tolist(repo.branchtip(name)))
+              lambda repo, name: tolist(repo.branchtip(name)),
+              lambda repo, node: [repo[node].branch()])
-    def addnamespace(self, namespace, singular, namemap, order=None):
+    def addnamespace(self, namespace, singular, namemap, nodemap, order=None):
         register a namespace
         namespace: the name to be registered (in plural form)
         singular: the singular naming of namespace (for output, e.g. log,
                   templating, etc.)
         namemap: function that inputs a node, output name(s)
+        nodemap: function that inputs a name, output node(s)
         order: optional argument to specify the order of namespaces
                (e.g. 'branches' should be listed before 'bookmarks')
         val = {'singular': singular,
-               'namemap': namemap}
+               'namemap': namemap,
+               'nodemap': nodemap}
         if order is not None:
             self._names.insert(order, namespace, val)
             self._names[namespace] = val