namespaces: introduce a generic way to map between names and nodes
This patch begins the work to provide a way to register a namespace to handle
'names'. Benefits of this would be,
- improved templating: This would provide {name} which could output any branch,
bookmark, tag, or any extension registered namespace all without having the
extension doing any extra work
- improved tab completion: Since this provides a single source of all 'names',
tab completion would not need to know of each namespace
- changeset lookup: Similar to before, a unified place to get all 'names' will
allow finding changesets without any extension code having to reimplement
this
Also,
d226fe36e362 has shown us that for internal code which expects a certain
type of method or behavior, we should provide an easy way for extensions to
check this behavior.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/namespaces.py Sun Dec 14 12:29:28 2014 -0800
@@ -0,0 +1,25 @@
+from mercurial import util
+
+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.
+
+ 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:
+ 'namemap': function that takes a name and returns a list of nodes
+ """
+
+ _names_version = 0
+
+ def __init__(self):
+ self._names = util.sortdict()