Mercurial > evolve
annotate hgext3rd/serverminitopic.py @ 3324:6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Instead of doing a full iteration over the exclusive set, we compare the jump
information instead. This perform the same kind of logic than before but will
allow for much faster iteration once all the caches are in place.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 20 Dec 2017 15:51:05 +0100 |
parents | 35c79686a635 |
children | 768f752b5364 |
rev | line source |
---|---|
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) |