Mercurial > evolve
annotate hgext/simple4server.py @ 869:e9eeef0d07ec
exchange: enforce permission on new wireprotocol command
hgweb needs an explicit declaration of the permission level of each commands.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 06 Mar 2014 12:15:04 -0800 |
parents | c6dc5822e640 |
children | 2a2db401a55b |
rev | line source |
---|---|
660
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
1 '''enable experimental obsolescence feature of Mercurial |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
2 |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
3 OBSOLESCENCE IS AN EXPERIMENTAL FEATURE MAKE SURE YOU UNDERSTOOD THE INVOLVED |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 CONCEPT BEFORE USING IT. |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
5 |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
6 /!\ THIS EXTENSION IS INTENDED FOR SERVER SIDE ONLY USAGE /!\ |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 For client side usages it is recommended to use the evolve extension for |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 improved user interface.''' |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
11 import mercurial.obsolete |
e6e47c432ffd
hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
12 mercurial.obsolete._enabled = True |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
13 |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
14 import struct |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
15 from mercurial import wireproto |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
16 from mercurial import extensions |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
17 from mercurial import obsolete |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
18 from cStringIO import StringIO |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
19 from mercurial import node |
869
e9eeef0d07ec
exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
866
diff
changeset
|
20 from mercurial.hgweb import hgweb_mod |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
21 _pack = struct.pack |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
22 |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
23 def srv_pushobsmarkers(repo, proto): |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
24 """wireprotocol command""" |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
25 fp = StringIO() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
26 proto.redirect() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
27 proto.getfile(fp) |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
28 data = fp.getvalue() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
29 fp.close() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
30 lock = repo.lock() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
31 try: |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
32 tr = repo.transaction('pushkey: obsolete markers') |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
33 try: |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
34 repo.obsstore.mergemarkers(tr, data) |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
35 tr.close() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
36 finally: |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
37 tr.release() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
38 finally: |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
39 lock.release() |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
40 return wireproto.pushres(0) |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
41 |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
42 def _encodemarkersstream(fp, markers): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
43 fp.write(_pack('>B', 0)) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
44 for mark in markers: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
45 fp.write(obsolete._encodeonemarker(mark)) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
46 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
47 def _getobsmarkersstream(repo, heads=None, common=None): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
48 revset = '' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
49 args = [] |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
50 repo = repo.unfiltered() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
51 if heads is None: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
52 revset = 'all()' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
53 elif heads: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
54 revset += "(::%ln)" |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
55 args.append(heads) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
56 else: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
57 assert False, 'pulling no heads?' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
58 if common: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
59 revset += ' - (::%ln)' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
60 args.append(common) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
61 nodes = [c.node() for c in repo.set(revset, *args)] |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
62 markers = repo.obsstore.relevantmarkers(nodes) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
63 obsdata = StringIO() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
64 _encodemarkersstream(obsdata, markers) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
65 obsdata.seek(0) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
66 return obsdata |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
67 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
68 class pruneobsstore(obsolete.obsstore): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
69 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
70 def __init__(self, *args, **kwargs): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
71 self.prunedchildren = {} |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
72 return super(pruneobsstore, self).__init__(*args, **kwargs) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
73 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
74 def _load(self, markers): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
75 markers = self._prunedetectingmarkers(markers) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
76 return super(pruneobsstore, self)._load(markers) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
77 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
78 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
79 def _prunedetectingmarkers(self, markers): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
80 for m in markers: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
81 if not m[1]: # no successors |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
82 meta = obsolete.decodemeta(m[3]) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
83 if 'p1' in meta: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
84 p1 = node.bin(meta['p1']) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
85 self.prunedchildren.setdefault(p1, set()).add(m) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
86 if 'p2' in meta: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
87 p2 = node.bin(meta['p2']) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
88 self.prunedchildren.setdefault(p2, set()).add(m) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
89 yield m |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
90 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
91 def relevantmarkers(self, nodes): |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
92 """return a set of all obsolescence marker relevant to a set of node. |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
93 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
94 "relevant" to a set of node mean: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
95 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
96 - marker that use this changeset as successors |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
97 - prune marker of direct children on this changeset. |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
98 - recursive application of the two rules on precursors of these markers |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
99 |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
100 It a set so you cannot rely on order""" |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
101 seennodes = set(nodes) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
102 seenmarkers = set() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
103 pendingnodes = set(nodes) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
104 precursorsmarkers = self.precursors |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
105 prunedchildren = self.prunedchildren |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
106 while pendingnodes: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
107 direct = set() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
108 for current in pendingnodes: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
109 direct.update(precursorsmarkers.get(current, ())) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
110 direct.update(prunedchildren.get(current, ())) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
111 direct -= seenmarkers |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
112 pendingnodes = set([m[0] for m in direct]) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
113 seenmarkers |= direct |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
114 pendingnodes -= seennodes |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
115 seennodes |= pendingnodes |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
116 return seenmarkers |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
117 |
826
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
118 def srv_pullobsmarkers(repo, proto, others): |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
119 opts = wireproto.options('', ['heads', 'common'], others) |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
120 for k, v in opts.iteritems(): |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
121 if k in ('heads', 'common'): |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
122 opts[k] = wireproto.decodelist(v) |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
123 obsdata = _getobsmarkersstream(repo, **opts) |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
124 length = '%20i' % len(obsdata.getvalue()) |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
125 def data(): |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
126 yield length |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
127 for c in proto.groupchunks(obsdata): |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
128 yield c |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
129 return wireproto.streamres(data()) |
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
130 |
866
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
131 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
132 def _obsrelsethashtree(repo): |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
133 cache = [] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
134 unfi = repo.unfiltered() |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
135 for i in unfi: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
136 ctx = unfi[i] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
137 entry = 0 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
138 sha = util.sha1() |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
139 # add data from p1 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
140 for p in ctx.parents(): |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
141 p = p.rev() |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
142 if p < 0: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
143 p = node.nullid |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
144 else: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
145 p = cache[p][1] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
146 if p != node.nullid: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
147 entry += 1 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
148 sha.update(p) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
149 tmarkers = repo.obsstore.relevantmarkers([ctx.node()]) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
150 if tmarkers: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
151 bmarkers = [obsolete._encodeonemarker(m) for m in tmarkers] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
152 bmarkers.sort() |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
153 for m in bmarkers: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
154 entry += 1 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
155 sha.update(m) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
156 if entry: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
157 cache.append((ctx.node(), sha.digest())) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
158 else: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
159 cache.append((ctx.node(), node.nullid)) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
160 return cache |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
161 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
162 def _obshash(repo, nodes): |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
163 hashs = _obsrelsethashtree(repo) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
164 nm = repo.changelog.nodemap |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
165 return [hashs[nm.get(n)][1] for n in nodes] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
166 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
167 def srv_obshash(repo, proto, nodes): |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
168 return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes))) |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
169 |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
170 def capabilities(orig, repo, proto): |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
171 """wrapper to advertise new capability""" |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
172 caps = orig(repo, proto) |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
173 if obsolete._enabled: |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
174 caps += ' _evoext_pushobsmarkers_0' |
826
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
175 caps += ' _evoext_pullobsmarkers_0' |
866
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
176 caps += ' _evoext_obshash_0' |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
177 return caps |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
178 |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
179 def extsetup(ui): |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
180 obsolete.obsstore = pruneobsstore |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
181 obsolete.obsstore.relevantmarkers = relevantmarkers |
869
e9eeef0d07ec
exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
866
diff
changeset
|
182 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push' |
e9eeef0d07ec
exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
866
diff
changeset
|
183 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull' |
e9eeef0d07ec
exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
866
diff
changeset
|
184 hgweb_mod.perms['evoext_obshash'] = 'pull' |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
185 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '') |
826
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
186 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*') |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
187 extensions.wrapfunction(wireproto, 'capabilities', capabilities) |
866
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
188 wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes') |