Mercurial > evolve
comparison hgext3rd/topic/discovery.py @ 1901:85390446f8c1
packaging: fix setup.py and install as hgext3rd.topic
This changeset is doing two things (gasp):
- It fixes various errors in the setup.py
- It move the topic source and install into hgext3rd.topic.
This last part (code source move) use hgext3rd as namespace package to prevent
installation nightmare. This won't be officially supported until Mercurial 3.8,
but in the meantime, 3.7 user can enable it using the full package name:
[extensions]
hgext3rd.topic=
Thanks goes to Julien Cristau <julien.cristau@logilab.fr> for the initial
version of this.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 17 Mar 2016 09:12:18 -0700 |
parents | src/topic/discovery.py@b65f39791f92 |
children | 58cdf061d49a |
comparison
equal
deleted
inserted
replaced
1899:b65f39791f92 | 1901:85390446f8c1 |
---|---|
1 import weakref | |
2 from mercurial import branchmap | |
3 from mercurial import error | |
4 from mercurial import exchange | |
5 from mercurial.i18n import _ | |
6 from . import topicmap | |
7 | |
8 def _headssummary(orig, repo, remote, outgoing): | |
9 publishing = ('phases' not in remote.listkeys('namespaces') | |
10 or bool(remote.listkeys('phases').get('publishing', False))) | |
11 if publishing: | |
12 return orig(repo, remote, outgoing) | |
13 oldgetitem = repo.__getitem__ | |
14 oldrepo = repo.__class__ | |
15 oldbranchcache = branchmap.branchcache | |
16 oldfilename = branchmap._filename | |
17 try: | |
18 class repocls(repo.__class__): | |
19 def __getitem__(self, key): | |
20 ctx = super(repocls, self).__getitem__(key) | |
21 oldbranch = ctx.branch | |
22 def branch(): | |
23 branch = oldbranch() | |
24 topic = ctx.topic() | |
25 if topic: | |
26 branch = "%s:%s" % (branch, topic) | |
27 return branch | |
28 ctx.branch = branch | |
29 return ctx | |
30 repo.__class__ = repocls | |
31 branchmap.branchcache = topicmap.topiccache | |
32 branchmap._filename = topicmap._filename | |
33 summary = orig(repo, remote, outgoing) | |
34 for key, value in summary.iteritems(): | |
35 if ':' in key: # This is a topic | |
36 if value[0] is None and value[1]: | |
37 summary[key] = ([value[1].pop(0)], ) + value[1:] | |
38 return summary | |
39 finally: | |
40 repo.__class__ = oldrepo | |
41 branchmap.branchcache = oldbranchcache | |
42 branchmap._filename = oldfilename | |
43 | |
44 def wireprotobranchmap(orig, repo, proto): | |
45 oldrepo = repo.__class__ | |
46 try: | |
47 class repocls(repo.__class__): | |
48 def branchmap(self): | |
49 usetopic = not self.publishing() | |
50 return super(repocls, self).branchmap(topic=usetopic) | |
51 repo.__class__ = repocls | |
52 return orig(repo, proto) | |
53 finally: | |
54 repo.__class__ = oldrepo | |
55 | |
56 | |
57 # Discovery have deficiency around phases, branch can get new heads with pure | |
58 # phases change. This happened with a changeset was allowed to be pushed | |
59 # because it had a topic, but it later become public and create a new branch | |
60 # head. | |
61 # | |
62 # Handle this by doing an extra check for new head creation server side | |
63 def _nbheads(repo): | |
64 data = {} | |
65 for b in repo.branchmap().iterbranches(): | |
66 if ':' in b[0]: | |
67 continue | |
68 data[b[0]] = len(b[1]) | |
69 return data | |
70 | |
71 def handlecheckheads(orig, op, inpart): | |
72 orig(op, inpart) | |
73 if op.repo.publishing(): | |
74 return | |
75 tr = op.gettransaction() | |
76 if tr.hookargs['source'] not in ('push', 'serve'): # not a push | |
77 return | |
78 tr._prepushheads = _nbheads(op.repo) | |
79 reporef = weakref.ref(op.repo) | |
80 oldvalidator = tr.validator | |
81 def validator(tr): | |
82 repo = reporef() | |
83 if repo is not None: | |
84 repo.invalidatecaches() | |
85 finalheads = _nbheads(repo) | |
86 for branch, oldnb in tr._prepushheads.iteritems(): | |
87 newnb = finalheads.pop(branch, 0) | |
88 if oldnb < newnb: | |
89 msg = _('push create a new head on branch "%s"' % branch) | |
90 raise error.Abort(msg) | |
91 for branch, newnb in finalheads.iteritems(): | |
92 if 1 < newnb: | |
93 msg = _('push create more than 1 head on new branch "%s"' % branch) | |
94 raise error.Abort(msg) | |
95 return oldvalidator(tr) | |
96 tr.validator = validator | |
97 handlecheckheads.params = frozenset() | |
98 | |
99 def _pushb2phases(orig, pushop, bundler): | |
100 hascheck = any(p.type == 'check:heads' for p in bundler._parts) | |
101 if pushop.outdatedphases and not hascheck: | |
102 exchange._pushb2ctxcheckheads(pushop, bundler) | |
103 return orig(pushop, bundler) | |
104 | |
105 | |
106 |