author | Pulkit Goyal <7895pulkit@gmail.com> |
Mon, 22 Jan 2018 17:54:27 +0530 | |
changeset 3479 | 4b9fc8c85ee4 |
parent 3207 | 35c79686a635 |
child 3511 | 768f752b5364 |
permissions | -rw-r--r-- |
3206
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 |
"""enable a minimal verison of topic for server |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 |
Non publishing repository will see topic as "branch:topic" in the branch field. |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 |
In addition to adding the extensions, the feature must be manually enabled in the config: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 |
[experimental] |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 |
server-mini-topic = yes |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
9 |
""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
import hashlib |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 |
import contextlib |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 |
from mercurial import ( |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
branchmap, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
15 |
context, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 |
encoding, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 |
extensions, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 |
node, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
registrar, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 |
util, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 |
wireproto, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
23 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 |
if util.safehasattr(registrar, 'configitem'): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
26 |
configtable = {} |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 |
configitem = registrar.configitem(configtable) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 |
configitem('experimental', 'server-mini-topic', |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 |
default=False, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 |
) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
31 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
32 |
def hasminitopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
33 |
"""true if minitopic is enabled on the repository |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
34 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
35 |
(The value is cached on the repository) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
36 |
""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
37 |
enabled = getattr(repo, '_hasminitopic', None) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
38 |
if enabled is None: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
39 |
enabled = (repo.ui.configbool('experimental', 'server-mini-topic') |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
40 |
and not repo.publishing()) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
41 |
repo._hasminitopic = enabled |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
42 |
return enabled |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
43 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 |
### make topic visible though "ctx.branch()" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
45 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
46 |
class topicchangectx(context.changectx): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
47 |
"""a sunclass of changectx that add topic to the branch name""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
48 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
49 |
def branch(self): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
50 |
branch = super(topicchangectx, self).branch() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
51 |
if hasminitopic(self._repo) and self.phase(): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
52 |
topic = self._changeset.extra.get('topic') |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
53 |
if topic is not None: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
54 |
topic = encoding.tolocal(topic) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
55 |
branch = '%s:%s' % (branch, topic) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
56 |
return branch |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
57 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
58 |
### avoid caching topic data in rev-branch-cache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
59 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
60 |
class revbranchcacheoverlay(object): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
61 |
"""revbranch mixin that don't use the cache for non public changeset""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
62 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
63 |
def _init__(self, *args, **kwargs): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
64 |
super(revbranchcacheoverlay, self).__init__(*args, **kwargs) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 |
if 'branchinfo' in vars(self): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
66 |
del self.branchinfo |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
67 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
68 |
def branchinfo(self, rev): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
69 |
"""return branch name and close flag for rev, using and updating |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
70 |
persistent cache.""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
71 |
phase = self._repo._phasecache.phase(self, rev) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
72 |
if phase: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
73 |
ctx = self._repo[rev] |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
74 |
return ctx.branch(), ctx.closesbranch() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
75 |
return super(revbranchcacheoverlay, self).branchinfo(rev) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
76 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
77 |
def reposetup(ui, repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
78 |
"""install a repo class with a special revbranchcache""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
79 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
80 |
if hasminitopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
81 |
repo = repo.unfiltered() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
82 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
83 |
class minitopicrepo(repo.__class__): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
84 |
"""repository subclass that install the modified cache""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
85 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
86 |
def revbranchcache(self): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
87 |
if self._revbranchcache is None: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
88 |
cache = super(minitopicrepo, self).revbranchcache() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
89 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
90 |
class topicawarerbc(revbranchcacheoverlay, cache.__class__): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
91 |
pass |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
92 |
cache.__class__ = topicawarerbc |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
93 |
if 'branchinfo' in vars(cache): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
94 |
del cache.branchinfo |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
95 |
self._revbranchcache = cache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
96 |
return self._revbranchcache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
97 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
98 |
repo.__class__ = minitopicrepo |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
99 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
100 |
### topic aware branch head cache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
101 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
102 |
def _phaseshash(repo, maxrev): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
103 |
"""uniq ID for a phase matching a set of rev""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
104 |
revs = set() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
105 |
cl = repo.changelog |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
106 |
fr = cl.filteredrevs |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
107 |
nm = cl.nodemap |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
108 |
for roots in repo._phasecache.phaseroots[1:]: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
109 |
for n in roots: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
110 |
r = nm.get(n) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
111 |
if r not in fr and r < maxrev: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
112 |
revs.add(r) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
113 |
key = node.nullid |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
114 |
revs = sorted(revs) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
115 |
if revs: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
116 |
s = hashlib.sha1() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
117 |
for rev in revs: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
118 |
s.update('%s;' % rev) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
119 |
key = s.digest() |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
120 |
return key |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
121 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
122 |
# needed to prevent reference used for 'super()' call using in branchmap.py to |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
123 |
# no go into cycle. (yes, URG) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
124 |
_oldbranchmap = branchmap.branchcache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
125 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
126 |
@contextlib.contextmanager |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
127 |
def oldbranchmap(): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
128 |
previous = branchmap.branchcache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
129 |
try: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
130 |
branchmap.branchcache = _oldbranchmap |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
131 |
yield |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
132 |
finally: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
133 |
branchmap.branchcache = previous |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
134 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
135 |
_publiconly = set([ |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
136 |
'base', |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
137 |
'immutable', |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
138 |
]) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
139 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
140 |
def mighttopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
141 |
return hasminitopic(repo) and repo.filtername not in _publiconly |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
142 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
143 |
class _topiccache(branchmap.branchcache): # combine me with branchmap.branchcache |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
144 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
145 |
def __init__(self, *args, **kwargs): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
146 |
# super() call may fail otherwise |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
147 |
with oldbranchmap(): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
148 |
super(_topiccache, self).__init__(*args, **kwargs) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
149 |
self.phaseshash = None |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
150 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
151 |
def copy(self): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
152 |
"""return an deep copy of the branchcache object""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
153 |
new = self.__class__(self, self.tipnode, self.tiprev, self.filteredhash, |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
154 |
self._closednodes) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
155 |
new.phaseshash = self.phaseshash |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
156 |
return new |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
157 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
158 |
def validfor(self, repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
159 |
"""Is the cache content valid regarding a repo |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
160 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
161 |
- False when cached tipnode is unknown or if we detect a strip. |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
162 |
- True when cache is up to date or a subset of current repo.""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
163 |
valid = super(_topiccache, self).validfor(repo) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
164 |
if not valid: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
165 |
return False |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
166 |
elif not mighttopic(repo) and self.phaseshash is None: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
167 |
# phasehash at None means this is a branchmap |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
168 |
# coming from a public only set |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
169 |
return True |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
170 |
else: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
171 |
try: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
172 |
valid = self.phaseshash == _phaseshash(repo, self.tiprev) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
173 |
return valid |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
174 |
except IndexError: |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
175 |
return False |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
176 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
177 |
def write(self, repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
178 |
# we expect (hope) mutable set to be small enough to be that computing |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
179 |
# it all the time will be fast enough |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
180 |
if not mighttopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
181 |
super(_topiccache, self).write(repo) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
182 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
183 |
def update(self, repo, revgen): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
184 |
"""Given a branchhead cache, self, that may have extra nodes or be |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
185 |
missing heads, and a generator of nodes that are strictly a superset of |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
186 |
heads missing, this function updates self to be correct. |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
187 |
""" |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
188 |
super(_topiccache, self).update(repo, revgen) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
189 |
if mighttopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
190 |
self.phaseshash = _phaseshash(repo, self.tiprev) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
191 |
|
3207
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
192 |
def wrapread(orig, repo): |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
193 |
# Avoiding to write cache for filter where topic applies is a good step, |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
194 |
# but we need to also avoid reading it. Existing branchmap cache might |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
195 |
# exists before the turned the feature on. |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
196 |
if mighttopic(repo): |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
197 |
return None |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
198 |
return orig(repo) |
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
199 |
|
3206
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
200 |
# advertise topic capabilities |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
201 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
202 |
def wireprotocaps(orig, repo, proto): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
203 |
caps = orig(repo, proto) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
204 |
if hasminitopic(repo): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
205 |
caps.append('topics') |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
206 |
return caps |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
207 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
208 |
# wrap the necessary bit |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
209 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
210 |
def wrapclass(container, oldname, new): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
211 |
old = getattr(container, oldname) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
212 |
if not issubclass(old, new): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
213 |
targetclass = new |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
214 |
# check if someone else already wrapped the class and handle that |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
215 |
if not issubclass(new, old): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
216 |
class targetclass(new, old): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
217 |
pass |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
218 |
setattr(container, oldname, targetclass) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
219 |
current = getattr(container, oldname) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
220 |
assert issubclass(current, new), (current, new, targetclass) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
221 |
|
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
222 |
def uisetup(ui): |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
223 |
wrapclass(context, 'changectx', topicchangectx) |
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
224 |
wrapclass(branchmap, 'branchcache', _topiccache) |
3207
35c79686a635
serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3206
diff
changeset
|
225 |
extensions.wrapfunction(branchmap, 'read', wrapread) |
3206
3ccde4699cf0
topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
226 |
extensions.wrapfunction(wireproto, '_capabilities', wireprotocaps) |