annotate mercurial/namespaces.py @ 52075:ff4562ed9ed7

localrepo: drop the CamelCase name for `localrepo.localcommandexecutor` See 61557734c0ae for the reasoning.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 23 Oct 2024 16:51:18 -0400
parents f4733654f144
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
1 from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
2
25961
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
3 from .i18n import _
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
4 from . import (
36592
b0054f3c055a namespace: use registrar to add template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 35212
diff changeset
5 registrar,
25961
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
6 templatekw,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
7 util,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
8 )
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
9
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
10
23555
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
11 def tolist(val):
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
12 """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
13 a convenience method to return an empty list instead of None
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
14 """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
15 if val is None:
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
16 return []
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
17 else:
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
18 return [val]
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
19
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
20
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
21 class namespaces:
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
22 """provides an interface to register and operate on multiple namespaces. See
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
23 the namespace class below for details on the namespace object.
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
24
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
25 """
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
26
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
27 _names_version = 0
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
28
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
29 def __init__(self):
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
30 self._names = util.sortdict()
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 33048
diff changeset
31 columns = templatekw.getlogcolumns()
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
32
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
33 # we need current mercurial named objects (bookmarks, tags, and
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
34 # branches) to be initialized somewhere, so that place is here
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
35 bmknames = lambda repo: repo._bookmarks.keys()
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
36 bmknamemap = lambda repo, name: tolist(repo._bookmarks.get(name))
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
37 bmknodemap = lambda repo, node: repo.nodebookmarks(node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
38 n = namespace(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
39 b"bookmarks",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
40 templatename=b"bookmark",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
41 logfmt=columns[b'bookmark'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
42 listnames=bmknames,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
43 namemap=bmknamemap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
44 nodemap=bmknodemap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
45 builtin=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
46 )
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
47 self.addnamespace(n)
23562
59e703aecaf6 namespaces: add tags
Sean Farley <sean.michael.farley@gmail.com>
parents: 23561
diff changeset
48
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
49 tagnames = lambda repo: [t for t, n in repo.tagslist()]
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
50 tagnamemap = lambda repo, name: tolist(repo._tagscache.tags.get(name))
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
51 tagnodemap = lambda repo, node: repo.nodetags(node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
52 n = namespace(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
53 b"tags",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
54 templatename=b"tag",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
55 logfmt=columns[b'tag'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
56 listnames=tagnames,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
57 namemap=tagnamemap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
58 nodemap=tagnodemap,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
59 deprecated={b'tip'},
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
60 builtin=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
61 )
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
62 self.addnamespace(n)
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
63
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
64 bnames = lambda repo: repo.branchmap().keys()
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
65 bnamemap = lambda repo, name: tolist(repo.branchtip(name, True))
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
66 bnodemap = lambda repo, node: [repo[node].branch()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
67 n = namespace(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
68 b"branches",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
69 templatename=b"branch",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
70 logfmt=columns[b'branch'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
71 listnames=bnames,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
72 namemap=bnamemap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
73 nodemap=bnodemap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
74 builtin=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
75 )
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
76 self.addnamespace(n)
23563
114992041625 namespaces: add branches
Sean Farley <sean.michael.farley@gmail.com>
parents: 23562
diff changeset
77
23736
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
78 def __getitem__(self, namespace):
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
79 """returns the namespace object"""
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
80 return self._names[namespace]
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
81
23761
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
82 def __iter__(self):
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
83 return self._names.__iter__()
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
84
44728
59ad165f6cdb templatekw: fix shownames() to check if namespace exists in repo (issue6301)
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
85 def get(self, namespace, default=None):
59ad165f6cdb templatekw: fix shownames() to check if namespace exists in repo (issue6301)
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
86 return self._names.get(namespace, default)
59ad165f6cdb templatekw: fix shownames() to check if namespace exists in repo (issue6301)
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
87
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
88 def items(self):
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
89 return self._names.items()
23761
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
90
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
91 iteritems = items
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
92
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
93 def addnamespace(self, namespace, order=None):
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
94 """register a namespace
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
95
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
96 namespace: the name to be registered (in plural form)
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
97 order: optional argument to specify the order of namespaces
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
98 (e.g. 'branches' should be listed before 'bookmarks')
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
99
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
100 """
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
101 if order is not None:
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
102 self._names.insert(order, namespace.name, namespace)
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
103 else:
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
104 self._names[namespace.name] = namespace
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
105
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
106 # we only generate a template keyword if one does not already exist
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
107 if namespace.name not in templatekw.keywords:
36592
b0054f3c055a namespace: use registrar to add template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 35212
diff changeset
108 templatekeyword = registrar.templatekeyword(templatekw.keywords)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
109
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 @templatekeyword(namespace.name, requires={b'repo', b'ctx'})
36593
900e5ee44307 templatekw: switch namespace template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36592
diff changeset
111 def generatekw(context, mapping):
900e5ee44307 templatekw: switch namespace template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36592
diff changeset
112 return templatekw.shownames(context, mapping, namespace.name)
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
113
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
114 def singlenode(self, repo, name):
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
115 """
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
116 Return the 'best' node for the given name. What's best is defined
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
117 by the namespace's singlenode() function. The first match returned by
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
118 a namespace in the defined precedence order is used.
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
119
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
120 Raises a KeyError if there is no such node.
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
121 """
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
122 for ns, v in self._names.items():
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
123 n = v.singlenode(repo, name)
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
124 if n:
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
125 return n
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
126 raise KeyError(_(b'no such name: %s') % name)
23606
80e3cbe227d1 namespaces: add method to get template name of namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23605
diff changeset
127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
128
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
129 class namespace:
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
130 """provides an interface to a namespace
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
131
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
132 Namespaces are basically generic many-to-many mapping between some
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
133 (namespaced) names and nodes. The goal here is to control the pollution of
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
134 jamming things into tags or bookmarks (in extension-land) and to simplify
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
135 internal bits of mercurial: log output, tab completion, etc.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
136
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
137 More precisely, we define a mapping of names to nodes, and a mapping from
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
138 nodes to names. Each mapping returns a list.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
139
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
140 Furthermore, each name mapping will be passed a name to lookup which might
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
141 not be in its domain. In this case, each method should return an empty list
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
142 and not raise an error.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
143
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
144 This namespace object will define the properties we need:
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
145 'name': the namespace (plural form)
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
146 'templatename': name to use for templating (usually the singular form
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
147 of the plural namespace name)
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
148 'listnames': list of all names in the namespace (usually the keys of a
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
149 dictionary)
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
150 'namemap': function that takes a name and returns a list of nodes
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
151 'nodemap': function that takes a node and returns a list of names
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
152 'deprecated': set of names to be masked for ordinary use
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
153 'builtin': bool indicating if this namespace is supported by core
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
154 Mercurial.
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
155 """
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
156
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
157 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
158 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
159 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
160 templatename=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
161 logname=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
162 colorname=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
163 logfmt=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
164 listnames=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
165 namemap=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
166 nodemap=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
167 deprecated=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
168 builtin=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
169 singlenode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38486
diff changeset
170 ):
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
171 """create a namespace
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
172
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
173 name: the namespace to be registered (in plural form)
23872
9f48242929a9 namespaces: make the constructor into named args
Sean Farley <sean.michael.farley@gmail.com>
parents: 23775
diff changeset
174 templatename: the name to use for templating
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
175 logname: the name to use for log output; if not specified templatename
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
176 is used
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
177 colorname: the name to use for colored log output; if not specified
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
178 logname is used
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24151
diff changeset
179 logfmt: the format to use for (i18n-ed) log output; if not specified
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
180 it is composed from logname
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
181 listnames: function to list all names
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
182 namemap: function that inputs a name, output node(s)
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
183 nodemap: function that inputs a node, output name(s)
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
184 deprecated: set of names to be masked for ordinary use
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
185 builtin: whether namespace is implemented by core Mercurial
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
186 singlenode: function that inputs a name, output best node (or None)
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
187 """
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
188 self.name = name
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
189 self.templatename = templatename
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
190 self.logname = logname
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
191 self.colorname = colorname
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
192 self.logfmt = logfmt
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
193 self.listnames = listnames
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
194 self.namemap = namemap
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
195 self.nodemap = nodemap
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
196 if singlenode:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
197 self.singlenode = singlenode
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
198
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
199 # if logname is not specified, use the template name as backup
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
200 if self.logname is None:
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
201 self.logname = self.templatename
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
202
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
203 # if colorname is not specified, just use the logname as a backup
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
204 if self.colorname is None:
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
205 self.colorname = self.logname
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
206
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
207 # if logfmt is not specified, compose it from logname as backup
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
208 if self.logfmt is None:
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
209 # i18n: column positioning for "hg log"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
210 self.logfmt = (b"%s:" % self.logname).ljust(13) + b"%s\n"
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
211
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
212 if deprecated is None:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
213 self.deprecated = set()
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
214 else:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
215 self.deprecated = deprecated
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
216
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
217 self.builtin = builtin
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
218
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
219 def names(self, repo, node):
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
220 """method that returns a (sorted) list of names in a namespace that
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
221 match a given node"""
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
222 return sorted(self.nodemap(repo, node))
23774
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
223
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
224 def nodes(self, repo, name):
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
225 """method that returns a list of nodes in a namespace that
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
226 match a given name.
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
227
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
228 """
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
229 return sorted(self.namemap(repo, name))
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
230
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
231 def singlenode(self, repo, name):
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
232 """returns the best node for the given name
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
233
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
234 By default, the best node is the node from nodes() with the highest
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
235 revision number. It can be overriden by the namespace."""
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
236 n = self.namemap(repo, name)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
237 if n:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
238 # return max revision number
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
239 if len(n) > 1:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
240 cl = repo.changelog
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
241 maxrev = max(cl.rev(node) for node in n)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
242 return cl.node(maxrev)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
243 return n[0]
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
244 return None