##// END OF EJS Templates
protocol: move basic ssh client commands to wirerepository
Matt Mackall -
r11586:ddaaaa23 default
parent child Browse files
Show More
@@ -7,7 +7,7 b''
7
7
8 from node import bin, hex
8 from node import bin, hex
9 from i18n import _
9 from i18n import _
10 import repo, util, error, encoding
10 import repo, util, error, encoding, wireproto
11 import re, urllib
11 import re, urllib
12
12
13 class remotelock(object):
13 class remotelock(object):
@@ -20,7 +20,7 b' class remotelock(object):'
20 if self.repo:
20 if self.repo:
21 self.release()
21 self.release()
22
22
23 class sshrepository(repo.repository):
23 class sshrepository(wireproto.wirerepository):
24 def __init__(self, ui, path, create=0):
24 def __init__(self, ui, path, create=0):
25 self._url = path
25 self._url = path
26 self.ui = ui
26 self.ui = ui
@@ -101,6 +101,10 b' class sshrepository(repo.repository):'
101 self.cleanup()
101 self.cleanup()
102 raise exception
102 raise exception
103
103
104 def _abort(self, exception):
105 self.cleanup()
106 raise exception
107
104 def cleanup(self):
108 def cleanup(self):
105 try:
109 try:
106 self.pipeo.close()
110 self.pipeo.close()
@@ -128,6 +132,10 b' class sshrepository(repo.repository):'
128 self.do_cmd(cmd, **args)
132 self.do_cmd(cmd, **args)
129 return self._recv()
133 return self._recv()
130
134
135 def _call(self, cmd, **args):
136 self.do_cmd(cmd, **args)
137 return self._recv()
138
131 def _recv(self):
139 def _recv(self):
132 l = self.pipei.readline()
140 l = self.pipei.readline()
133 self.readerr()
141 self.readerr()
@@ -152,60 +160,6 b' class sshrepository(repo.repository):'
152 def unlock(self):
160 def unlock(self):
153 self.call("unlock")
161 self.call("unlock")
154
162
155 def lookup(self, key):
156 self.requirecap('lookup', _('look up remote revision'))
157 d = self.call("lookup", key=key)
158 success, data = d[:-1].split(" ", 1)
159 if int(success):
160 return bin(data)
161 else:
162 self.abort(error.RepoError(data))
163
164 def heads(self):
165 d = self.call("heads")
166 try:
167 return map(bin, d[:-1].split(" "))
168 except:
169 self.abort(error.ResponseError(_("unexpected response:"), d))
170
171 def branchmap(self):
172 d = self.call("branchmap")
173 try:
174 branchmap = {}
175 for branchpart in d.splitlines():
176 branchheads = branchpart.split(' ')
177 branchname = urllib.unquote(branchheads[0])
178 # Earlier servers (1.3.x) send branch names in (their) local
179 # charset. The best we can do is assume it's identical to our
180 # own local charset, in case it's not utf-8.
181 try:
182 branchname.decode('utf-8')
183 except UnicodeDecodeError:
184 branchname = encoding.fromlocal(branchname)
185 branchheads = [bin(x) for x in branchheads[1:]]
186 branchmap[branchname] = branchheads
187 return branchmap
188 except:
189 raise error.ResponseError(_("unexpected response:"), d)
190
191 def branches(self, nodes):
192 n = " ".join(map(hex, nodes))
193 d = self.call("branches", nodes=n)
194 try:
195 br = [tuple(map(bin, b.split(" "))) for b in d.splitlines()]
196 return br
197 except:
198 self.abort(error.ResponseError(_("unexpected response:"), d))
199
200 def between(self, pairs):
201 n = " ".join(["-".join(map(hex, p)) for p in pairs])
202 d = self.call("between", pairs=n)
203 try:
204 p = [l and map(bin, l.split(" ")) or [] for l in d.splitlines()]
205 return p
206 except:
207 self.abort(error.ResponseError(_("unexpected response:"), d))
208
209 def changegroup(self, nodes, kind):
163 def changegroup(self, nodes, kind):
210 n = " ".join(map(hex, nodes))
164 n = " ".join(map(hex, nodes))
211 return self.do_cmd("changegroup", roots=n)
165 return self.do_cmd("changegroup", roots=n)
@@ -273,21 +227,4 b' class sshrepository(repo.repository):'
273 def stream_out(self):
227 def stream_out(self):
274 return self.do_cmd('stream_out')
228 return self.do_cmd('stream_out')
275
229
276 def pushkey(self, namespace, key, old, new):
277 if not self.capable('pushkey'):
278 return False
279 d = self.call("pushkey",
280 namespace=namespace, key=key, old=old, new=new)
281 return bool(int(d))
282
283 def listkeys(self, namespace):
284 if not self.capable('pushkey'):
285 return {}
286 d = self.call("listkeys", namespace=namespace)
287 r = {}
288 for l in d.splitlines():
289 k, v = l.split('\t')
290 r[k.decode('string-escape')] = v.decode('string-escape')
291 return r
292
293 instance = sshrepository
230 instance = sshrepository
@@ -7,9 +7,85 b''
7
7
8 from i18n import _
8 from i18n import _
9 from node import bin, hex
9 from node import bin, hex
10 import urllib, streamclone
10 import urllib
11 import streamclone, repo, error, encoding
11 import pushkey as pushkey_
12 import pushkey as pushkey_
12
13
14 # client side
15
16 class wirerepository(repo.repository):
17 def lookup(self, key):
18 self.requirecap('lookup', _('look up remote revision'))
19 d = self._call("lookup", key=key)
20 success, data = d[:-1].split(" ", 1)
21 if int(success):
22 return bin(data)
23 self._abort(error.RepoError(data))
24
25 def heads(self):
26 d = self._call("heads")
27 try:
28 return map(bin, d[:-1].split(" "))
29 except:
30 self.abort(error.ResponseError(_("unexpected response:"), d))
31
32 def branchmap(self):
33 d = self._call("branchmap")
34 try:
35 branchmap = {}
36 for branchpart in d.splitlines():
37 branchheads = branchpart.split(' ')
38 branchname = urllib.unquote(branchheads[0])
39 # Earlier servers (1.3.x) send branch names in (their) local
40 # charset. The best we can do is assume it's identical to our
41 # own local charset, in case it's not utf-8.
42 try:
43 branchname.decode('utf-8')
44 except UnicodeDecodeError:
45 branchname = encoding.fromlocal(branchname)
46 branchheads = [bin(x) for x in branchheads[1:]]
47 branchmap[branchname] = branchheads
48 return branchmap
49 except TypeError:
50 self._abort(error.ResponseError(_("unexpected response:"), d))
51
52 def branches(self, nodes):
53 n = " ".join(map(hex, nodes))
54 d = self._call("branches", nodes=n)
55 try:
56 br = [tuple(map(bin, b.split(" "))) for b in d.splitlines()]
57 return br
58 except:
59 self._abort(error.ResponseError(_("unexpected response:"), d))
60
61 def between(self, pairs):
62 n = " ".join(["-".join(map(hex, p)) for p in pairs])
63 d = self._call("between", pairs=n)
64 try:
65 p = [l and map(bin, l.split(" ")) or [] for l in d.splitlines()]
66 return p
67 except:
68 self._abort(error.ResponseError(_("unexpected response:"), d))
69
70 def pushkey(self, namespace, key, old, new):
71 if not self.capable('pushkey'):
72 return False
73 d = self._call("pushkey",
74 namespace=namespace, key=key, old=old, new=new)
75 return bool(int(d))
76
77 def listkeys(self, namespace):
78 if not self.capable('pushkey'):
79 return {}
80 d = self._call("listkeys", namespace=namespace)
81 r = {}
82 for l in d.splitlines():
83 k, v = l.split('\t')
84 r[k.decode('string-escape')] = v.decode('string-escape')
85 return r
86
87 # server side
88
13 def dispatch(repo, proto, command):
89 def dispatch(repo, proto, command):
14 if command not in commands:
90 if command not in commands:
15 return False
91 return False
General Comments 0
You need to be logged in to leave comments. Login now