[PATCH 3 of 7 V2] namespaces: add nodemap property
Sean Farley
sean.michael.farley at gmail.com
Thu Dec 18 15:10:47 CST 2014
# HG changeset patch
# User Sean Farley <sean.michael.farley at gmail.com>
# Date 1418631863 28800
# Mon Dec 15 00:24:23 2014 -0800
# Node ID 430e5b84bcf084090939993ab9a05f342bbb85ed
# Parent 873ba6dc401458b59c14cec91b9729d36064b8e3
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.
diff --git a/mercurial/namespaces.py b/mercurial/namespaces.py
--- a/mercurial/namespaces.py
+++ b/mercurial/namespaces.py
@@ -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:
'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
def __init__(self):
@@ -39,30 +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, 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:
self._names[namespace] = val
More information about the Mercurial-devel
mailing list