annotate hgext/simple4server.py @ 872:2a2db401a55b

simple4server: fix a missing import
author Pierre-Yves David <pierre-yves.david@fb.com>
date Mon, 10 Mar 2014 16:52:46 -0700
parents e9eeef0d07ec
children c758717ff3c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
872
2a2db401a55b simple4server: fix a missing import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
15 from mercurial import util
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
16 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
17 from mercurial import extensions
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
18 from mercurial import obsolete
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
19 from cStringIO import StringIO
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
20 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
21 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
22 _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
23
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
24 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
25 """wireprotocol command"""
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
26 fp = StringIO()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
27 proto.redirect()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
28 proto.getfile(fp)
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
29 data = fp.getvalue()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
30 fp.close()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
31 lock = repo.lock()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
32 try:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
33 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
34 try:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
35 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
36 tr.close()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
37 finally:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
38 tr.release()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
39 finally:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
40 lock.release()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
41 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
42
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
43 def _encodemarkersstream(fp, markers):
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
44 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
45 for mark in markers:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
46 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
47
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
48 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
49 revset = ''
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
50 args = []
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
51 repo = repo.unfiltered()
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
52 if heads is None:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
53 revset = 'all()'
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
54 elif heads:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
55 revset += "(::%ln)"
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
56 args.append(heads)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
57 else:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
58 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
59 if common:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
60 revset += ' - (::%ln)'
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
61 args.append(common)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
62 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
63 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
64 obsdata = StringIO()
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
65 _encodemarkersstream(obsdata, markers)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
66 obsdata.seek(0)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
67 return obsdata
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
68
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
69 class pruneobsstore(obsolete.obsstore):
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
70
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
71 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
72 self.prunedchildren = {}
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
73 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
74
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
75 def _load(self, markers):
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
76 markers = self._prunedetectingmarkers(markers)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
77 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
78
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
79
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
80 def _prunedetectingmarkers(self, markers):
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
81 for m in markers:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
82 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
83 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
84 if 'p1' in meta:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
85 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
86 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
87 if 'p2' in meta:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
88 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
89 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
90 yield m
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
91
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
92 def relevantmarkers(self, nodes):
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
93 """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
94
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
95 "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
96
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
97 - 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
98 - 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
99 - 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
100
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
101 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
102 seennodes = set(nodes)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
103 seenmarkers = set()
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
104 pendingnodes = set(nodes)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
105 precursorsmarkers = self.precursors
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
106 prunedchildren = self.prunedchildren
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
107 while pendingnodes:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
108 direct = set()
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
109 for current in pendingnodes:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
110 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
111 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
112 direct -= seenmarkers
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
113 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
114 seenmarkers |= direct
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
115 pendingnodes -= seennodes
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
116 seennodes |= pendingnodes
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
117 return seenmarkers
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
118
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
119 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
120 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
121 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
122 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
123 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
124 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
125 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
126 def data():
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
127 yield length
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
128 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
129 yield c
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
130 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
131
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
132
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
133 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
134 cache = []
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
135 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
136 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
137 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
138 entry = 0
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
139 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
140 # 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
141 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
142 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
143 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
144 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
145 else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
146 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
147 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
148 entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
149 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
150 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
151 if 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 = [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
153 bmarkers.sort()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
154 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
155 entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
156 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
157 if entry:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
158 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
159 else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
160 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
161 return cache
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
162
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
163 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
164 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
165 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
166 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
167
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
168 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
169 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
170
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
171 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
172 """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
173 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
174 if obsolete._enabled:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
175 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
176 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
177 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
178 return caps
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
179
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
180 def extsetup(ui):
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
181 obsolete.obsstore = pruneobsstore
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
182 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
183 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
184 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
185 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
186 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
187 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
188 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
189 wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')