changeset 23607:0fd778ef0f61

namespaces: add nodemap property This patch adds a node-to-name map property to the namespace. This is necessary because we cannot simply invert the name-to-node map because we do not assume the name-to-node map to be unique (for example, consider named branches: many nodes have one branch name). The node-to-name is helpful in log commands where we are already iterating over a set of nodes and want to display some kind of naming information to the user.
author Sean Farley <sean.michael.farley@gmail.com>
date Mon, 15 Dec 2014 00:24:23 -0800
parents 80e3cbe227d1
children 807ee1a02bb0
files mercurial/namespaces.py
diffstat 1 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/namespaces.py	Sun Dec 14 19:12:27 2014 -0800
+++ b/mercurial/namespaces.py	Mon Dec 15 00:24:23 2014 -0800
@@ -17,8 +17,9 @@
     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
@@ -29,6 +30,7 @@
       'templatename': name to use for templating (usually the singular form
                       of the plural namespace name)
       '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
@@ -41,26 +43,32 @@
         # 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, templatename, namemap, order=None):
+    def addnamespace(self, namespace, templatename, namemap, nodemap,
+                     order=None):
         """
         register a namespace
 
         namespace: the name to be registered (in plural form)
         templatename: the name to use for templating
         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 = {'templatename': templatename,
-               'namemap': namemap}
+               'namemap': namemap,
+               'nodemap': nodemap}
         if order is not None:
             self._names.insert(order, namespace, val)
         else: