Mercurial > hg
annotate mercurial/namespaces.py @ 32009:c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
The previous logic had many shortcoming (eg: looking at the head only, not
handling prune, etc...), the new logic use a more robust approach:
For each head, we check if after the push all changesets exclusive to this heads
will be obsolete. If they are, the branch considered be "replaced".
To check if a changeset will be obsolete, we simply checks:
* the changeset phase
* the existence of a marker relevant to the "pushed set" that affects the
changesets..
This fixes two major issues of the previous algorithm:
* branch partially rewritten (eg: head but not root) are no longer detected as
replaced,
* Prune are now properly handled.
(This implementation was introduction in the evolve extension, version 6.0.0.)
This new algorithm has an extended number of tests, a basic one is provided
in this patch. The others will be introduced in their own changeset for clarity.
In addition, we stop trying to process heads unknown locally, we do not have
enough data to take an informed decision so we should stop pretending we do.
This reflect a test that is now update.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Sat, 15 Apr 2017 02:55:18 +0200 |
parents | ca52512ac709 |
children | bd872f64a8ba |
rev | line source |
---|---|
25961
c0c89b2d07be
namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24180
diff
changeset
|
1 from __future__ import absolute_import |
c0c89b2d07be
namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24180
diff
changeset
|
2 |
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 ( |
c0c89b2d07be
namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24180
diff
changeset
|
5 templatekw, |
c0c89b2d07be
namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24180
diff
changeset
|
6 util, |
c0c89b2d07be
namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24180
diff
changeset
|
7 ) |
23553
7cebb6a8c75f
namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff
changeset
|
8 |
23555
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
9 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
|
10 """ |
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
11 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
|
12 """ |
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
13 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
|
14 return [] |
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
15 else: |
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
16 return [val] |
f08f6a7d4d5f
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents:
23554
diff
changeset
|
17 |
23553
7cebb6a8c75f
namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff
changeset
|
18 class namespaces(object): |
23718
42908c3275c6
namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents:
23717
diff
changeset
|
19 """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
|
20 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
|
21 |
7cebb6a8c75f
namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff
changeset
|
22 """ |
7cebb6a8c75f
namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff
changeset
|
23 |
7cebb6a8c75f
namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff
changeset
|
24 _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
|
25 |
23561
3c2419e07df5
namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents:
23559
diff
changeset
|
26 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
|
27 self._names = util.sortdict() |
23554
75f9643cab1b
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents:
23553
diff
changeset
|
28 |
23558
3198aac7a95d
namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents:
23557
diff
changeset
|
29 # 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
|
30 # 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
|
31 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
|
32 bmknamemap = lambda repo, name: tolist(repo._bookmarks.get(name)) |
28567
ca52512ac709
namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents:
25961
diff
changeset
|
33 bmknodemap = lambda repo, node: repo.nodebookmarks(node) |
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
|
34 n = namespace("bookmarks", templatename="bookmark", |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
35 # i18n: column positioning for "hg log" |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
36 logfmt=_("bookmark: %s\n"), |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
37 listnames=bmknames, |
23873
9ef234021667
namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents:
23872
diff
changeset
|
38 namemap=bmknamemap, nodemap=bmknodemap) |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
39 self.addnamespace(n) |
23562
59e703aecaf6
namespaces: add tags
Sean Farley <sean.michael.farley@gmail.com>
parents:
23561
diff
changeset
|
40 |
23873
9ef234021667
namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents:
23872
diff
changeset
|
41 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
|
42 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
|
43 tagnodemap = lambda repo, node: repo.nodetags(node) |
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
|
44 n = namespace("tags", templatename="tag", |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
45 # i18n: column positioning for "hg log" |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
46 logfmt=_("tag: %s\n"), |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
47 listnames=tagnames, |
24151
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
48 namemap=tagnamemap, nodemap=tagnodemap, |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
49 deprecated=set(['tip'])) |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
50 self.addnamespace(n) |
23558
3198aac7a95d
namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents:
23557
diff
changeset
|
51 |
23873
9ef234021667
namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents:
23872
diff
changeset
|
52 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
|
53 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
|
54 bnodemap = lambda repo, node: [repo[node].branch()] |
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
|
55 n = namespace("branches", templatename="branch", |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
56 # i18n: column positioning for "hg log" |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
57 logfmt=_("branch: %s\n"), |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
58 listnames=bnames, |
23873
9ef234021667
namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents:
23872
diff
changeset
|
59 namemap=bnamemap, nodemap=bnodemap) |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
60 self.addnamespace(n) |
23563
114992041625
namespaces: add branches
Sean Farley <sean.michael.farley@gmail.com>
parents:
23562
diff
changeset
|
61 |
23736
d7324c242c3f
namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23718
diff
changeset
|
62 def __getitem__(self, namespace): |
d7324c242c3f
namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23718
diff
changeset
|
63 """returns the namespace object""" |
d7324c242c3f
namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23718
diff
changeset
|
64 return self._names[namespace] |
d7324c242c3f
namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23718
diff
changeset
|
65 |
23761
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
66 def __iter__(self): |
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
67 return self._names.__iter__() |
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
68 |
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
69 def iteritems(self): |
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
70 return self._names.iteritems() |
19d6271a70db
namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents:
23760
diff
changeset
|
71 |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
72 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
|
73 """register a namespace |
23554
75f9643cab1b
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents:
23553
diff
changeset
|
74 |
75f9643cab1b
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents:
23553
diff
changeset
|
75 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
|
76 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
|
77 (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
|
78 |
23554
75f9643cab1b
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents:
23553
diff
changeset
|
79 """ |
75f9643cab1b
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents:
23553
diff
changeset
|
80 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
|
81 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
|
82 else: |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
83 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
|
84 |
23610
9266d1dd6a6e
namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents:
23608
diff
changeset
|
85 # 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
|
86 if namespace.name not in templatekw.keywords: |
23610
9266d1dd6a6e
namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents:
23608
diff
changeset
|
87 def generatekw(**args): |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
88 return templatekw.shownames(namespace.name, **args) |
23610
9266d1dd6a6e
namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents:
23608
diff
changeset
|
89 |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
90 templatekw.keywords[namespace.name] = generatekw |
23610
9266d1dd6a6e
namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents:
23608
diff
changeset
|
91 |
23561
3c2419e07df5
namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents:
23559
diff
changeset
|
92 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
|
93 """ |
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
|
94 Return the 'best' node for the given name. Best means the first 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
|
95 in the first nonempty list returned by a name-to-nodes mapping function |
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
|
96 in the defined precedence order. |
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
|
97 |
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
|
98 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
|
99 """ |
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
|
100 for ns, v in self._names.iteritems(): |
23717
d8663e6153c1
namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents:
23716
diff
changeset
|
101 n = v.namemap(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
|
102 if n: |
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
|
103 # return max revision number |
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
|
104 if len(n) > 1: |
23561
3c2419e07df5
namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents:
23559
diff
changeset
|
105 cl = repo.changelog |
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
|
106 maxrev = max(cl.rev(node) for node in n) |
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
|
107 return cl.node(maxrev) |
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
|
108 return n[0] |
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
|
109 raise KeyError(_('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
|
110 |
23715
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
111 class namespace(object): |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
112 """provides an interface to a namespace |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
113 |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
114 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
|
115 (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
|
116 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
|
117 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
|
118 |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
119 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
|
120 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
|
121 |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
122 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
|
123 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
|
124 and not raise an error. |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
125 |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
126 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
|
127 'name': the namespace (plural form) |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
128 '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
|
129 of the plural namespace name) |
23760
50229b4c33be
namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23739
diff
changeset
|
130 '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
|
131 dictionary) |
23715
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
132 '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
|
133 '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
|
134 'deprecated': set of names to be masked for ordinary use |
23715
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
135 |
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 |
23875
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
138 def __init__(self, name, templatename=None, logname=None, colorname=None, |
24151
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
139 logfmt=None, listnames=None, namemap=None, nodemap=None, |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
140 deprecated=None): |
23715
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
141 """create a namespace |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
142 |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 is used |
23875
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
147 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
|
148 logname is used |
24180
d8e0c591781c
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
24151
diff
changeset
|
149 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
|
150 it is composed from logname |
23760
50229b4c33be
namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23739
diff
changeset
|
151 listnames: function to list all names |
28567
ca52512ac709
namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents:
25961
diff
changeset
|
152 namemap: function that inputs a name, output node(s) |
ca52512ac709
namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents:
25961
diff
changeset
|
153 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
|
154 deprecated: set of names to be masked for ordinary use |
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 """ |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
157 self.name = name |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
158 self.templatename = templatename |
23874
fef1146b8442
namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23873
diff
changeset
|
159 self.logname = logname |
23875
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
160 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
|
161 self.logfmt = logfmt |
23760
50229b4c33be
namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents:
23739
diff
changeset
|
162 self.listnames = listnames |
23715
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
163 self.namemap = namemap |
eee55c09010a
namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23610
diff
changeset
|
164 self.nodemap = nodemap |
23716
f4828a8f6ae9
namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23715
diff
changeset
|
165 |
23874
fef1146b8442
namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23873
diff
changeset
|
166 # 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
|
167 if self.logname is None: |
fef1146b8442
namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23873
diff
changeset
|
168 self.logname = self.templatename |
fef1146b8442
namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23873
diff
changeset
|
169 |
23875
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
170 # 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
|
171 if self.colorname is None: |
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
172 self.colorname = self.logname |
e573dd08aeaf
namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23874
diff
changeset
|
173 |
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
|
174 # 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
|
175 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
|
176 # i18n: column positioning for "hg log" |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
177 self.logfmt = ("%s:" % self.logname).ljust(13) + "%s\n" |
448bb32b8ee6
namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23875
diff
changeset
|
178 |
24151
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
179 if deprecated is None: |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
180 self.deprecated = set() |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
181 else: |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
182 self.deprecated = deprecated |
38824c53c2f1
revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23967
diff
changeset
|
183 |
23716
f4828a8f6ae9
namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23715
diff
changeset
|
184 def names(self, repo, node): |
f4828a8f6ae9
namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23715
diff
changeset
|
185 """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
|
186 match a given node""" |
f4828a8f6ae9
namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents:
23715
diff
changeset
|
187 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
|
188 |
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
|
189 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
|
190 """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
|
191 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
|
192 |
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
|
193 """ |
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
|
194 return sorted(self.namemap(repo, name)) |