##// END OF EJS Templates
namespaces: remove names method on the namespaces object...
Sean Farley -
r23738:3436e45d default
parent child Browse files
Show More
@@ -1,138 +1,133 b''
1 1 from i18n import _
2 2 from mercurial import util
3 3 import templatekw
4 4
5 5 def tolist(val):
6 6 """
7 7 a convenience method to return an empty list instead of None
8 8 """
9 9 if val is None:
10 10 return []
11 11 else:
12 12 return [val]
13 13
14 14 class namespaces(object):
15 15 """provides an interface to register and operate on multiple namespaces. See
16 16 the namespace class below for details on the namespace object.
17 17
18 18 """
19 19
20 20 _names_version = 0
21 21
22 22 def __init__(self):
23 23 self._names = util.sortdict()
24 24
25 25 # shorten the class name for less indentation
26 26 ns = namespace
27 27
28 28 # we need current mercurial named objects (bookmarks, tags, and
29 29 # branches) to be initialized somewhere, so that place is here
30 30 n = ns("bookmarks", "bookmark",
31 31 lambda repo, name: tolist(repo._bookmarks.get(name)),
32 32 lambda repo, name: repo.nodebookmarks(name))
33 33 self.addnamespace(n)
34 34
35 35 n = ns("tags", "tag",
36 36 lambda repo, name: tolist(repo._tagscache.tags.get(name)),
37 37 lambda repo, name: repo.nodetags(name))
38 38 self.addnamespace(n)
39 39
40 40 n = ns("branches", "branch",
41 41 lambda repo, name: tolist(repo.branchtip(name)),
42 42 lambda repo, node: [repo[node].branch()])
43 43 self.addnamespace(n)
44 44
45 45 def __getitem__(self, namespace):
46 46 """returns the namespace object"""
47 47 return self._names[namespace]
48 48
49 49 def addnamespace(self, namespace, order=None):
50 50 """register a namespace
51 51
52 52 namespace: the name to be registered (in plural form)
53 53 order: optional argument to specify the order of namespaces
54 54 (e.g. 'branches' should be listed before 'bookmarks')
55 55
56 56 """
57 57 if order is not None:
58 58 self._names.insert(order, namespace.name, namespace)
59 59 else:
60 60 self._names[namespace.name] = namespace
61 61
62 62 # we only generate a template keyword if one does not already exist
63 63 if namespace.name not in templatekw.keywords:
64 64 def generatekw(**args):
65 65 return templatekw.shownames(namespace.name, **args)
66 66
67 67 templatekw.keywords[namespace.name] = generatekw
68 68
69 69 def singlenode(self, repo, name):
70 70 """
71 71 Return the 'best' node for the given name. Best means the first node
72 72 in the first nonempty list returned by a name-to-nodes mapping function
73 73 in the defined precedence order.
74 74
75 75 Raises a KeyError if there is no such node.
76 76 """
77 77 for ns, v in self._names.iteritems():
78 78 n = v.namemap(repo, name)
79 79 if n:
80 80 # return max revision number
81 81 if len(n) > 1:
82 82 cl = repo.changelog
83 83 maxrev = max(cl.rev(node) for node in n)
84 84 return cl.node(maxrev)
85 85 return n[0]
86 86 raise KeyError(_('no such name: %s') % name)
87 87
88 88 def templatename(self, namespace):
89 89 """method that returns the template name of a namespace"""
90 90 return self._names[namespace].templatename
91 91
92 def names(self, repo, namespace, node):
93 """method that returns a (sorted) list of names in a namespace that
94 match a given node"""
95 return sorted(self._names[namespace].nodemap(repo, node))
96
97 92 class namespace(object):
98 93 """provides an interface to a namespace
99 94
100 95 Namespaces are basically generic many-to-many mapping between some
101 96 (namespaced) names and nodes. The goal here is to control the pollution of
102 97 jamming things into tags or bookmarks (in extension-land) and to simplify
103 98 internal bits of mercurial: log output, tab completion, etc.
104 99
105 100 More precisely, we define a mapping of names to nodes, and a mapping from
106 101 nodes to names. Each mapping returns a list.
107 102
108 103 Furthermore, each name mapping will be passed a name to lookup which might
109 104 not be in its domain. In this case, each method should return an empty list
110 105 and not raise an error.
111 106
112 107 This namespace object will define the properties we need:
113 108 'name': the namespace (plural form)
114 109 'templatename': name to use for templating (usually the singular form
115 110 of the plural namespace name)
116 111 'namemap': function that takes a name and returns a list of nodes
117 112 'nodemap': function that takes a node and returns a list of names
118 113
119 114 """
120 115
121 116 def __init__(self, name, templatename, namemap, nodemap):
122 117 """create a namespace
123 118
124 119 name: the namespace to be registered (in plural form)
125 120 templatename: the name to use for templating
126 121 namemap: function that inputs a node, output name(s)
127 122 nodemap: function that inputs a name, output node(s)
128 123
129 124 """
130 125 self.name = name
131 126 self.templatename = templatename
132 127 self.namemap = namemap
133 128 self.nodemap = nodemap
134 129
135 130 def names(self, repo, node):
136 131 """method that returns a (sorted) list of names in a namespace that
137 132 match a given node"""
138 133 return sorted(self.nodemap(repo, node))
General Comments 0
You need to be logged in to leave comments. Login now