comparison mercurial/sshrepo.py @ 5978:7939c71f3132

sshrepo: be more careful while reading data This should avoid some tracebacks when the server sends some garbage.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sun, 03 Feb 2008 21:03:46 -0200
parents 32ec518ee3cb
children 30d2fecaab76
comparison
equal deleted inserted replaced
5977:e82dd2dd6276 5978:7939c71f3132
113 self.pipeo.flush() 113 self.pipeo.flush()
114 114
115 return self.pipei 115 return self.pipei
116 116
117 def call(self, cmd, **args): 117 def call(self, cmd, **args):
118 r = self.do_cmd(cmd, **args) 118 self.do_cmd(cmd, **args)
119 l = r.readline() 119 return self._recv()
120
121 def _recv(self):
122 l = self.pipei.readline()
120 self.readerr() 123 self.readerr()
121 try: 124 try:
122 l = int(l) 125 l = int(l)
123 except: 126 except:
124 self.raise_(util.UnexpectedOutput(_("unexpected response:"), l)) 127 self.raise_(util.UnexpectedOutput(_("unexpected response:"), l))
125 return r.read(l) 128 return self.pipei.read(l)
129
130 def _send(self, data, flush=False):
131 self.pipeo.write("%d\n" % len(data))
132 if data:
133 self.pipeo.write(data)
134 if flush:
135 self.pipeo.flush()
136 self.readerr()
126 137
127 def lock(self): 138 def lock(self):
128 self.call("lock") 139 self.call("lock")
129 return remotelock(self) 140 return remotelock(self)
130 141
181 # remote may send "unsynced changes" 192 # remote may send "unsynced changes"
182 self.raise_(repo.RepoError(_("push refused: %s") % d)) 193 self.raise_(repo.RepoError(_("push refused: %s") % d))
183 194
184 while 1: 195 while 1:
185 d = cg.read(4096) 196 d = cg.read(4096)
186 if not d: break 197 if not d:
187 self.pipeo.write(str(len(d)) + '\n') 198 break
188 self.pipeo.write(d) 199 self._send(d)
189 self.readerr() 200
190 201 self._send("", flush=True)
191 self.pipeo.write('0\n') 202
192 self.pipeo.flush() 203 r = self._recv()
193
194 self.readerr()
195 l = int(self.pipei.readline())
196 r = self.pipei.read(l)
197 if r: 204 if r:
198 # remote may send "unsynced changes" 205 # remote may send "unsynced changes"
199 self.raise_(hg.RepoError(_("push failed: %s") % r)) 206 self.raise_(hg.RepoError(_("push failed: %s") % r))
200 207
201 self.readerr() 208 r = self._recv()
202 l = int(self.pipei.readline()) 209 try:
203 r = self.pipei.read(l) 210 return int(r)
204 return int(r) 211 except:
212 self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
205 213
206 def addchangegroup(self, cg, source, url): 214 def addchangegroup(self, cg, source, url):
207 d = self.call("addchangegroup") 215 d = self.call("addchangegroup")
208 if d: 216 if d:
209 self.raise_(repo.RepoError(_("push refused: %s") % d)) 217 self.raise_(repo.RepoError(_("push refused: %s") % d))
210 while 1: 218 while 1:
211 d = cg.read(4096) 219 d = cg.read(4096)
212 if not d: break 220 if not d:
221 break
213 self.pipeo.write(d) 222 self.pipeo.write(d)
214 self.readerr() 223 self.readerr()
215 224
216 self.pipeo.flush() 225 self.pipeo.flush()
217 226
218 self.readerr() 227 self.readerr()
219 l = int(self.pipei.readline()) 228 r = self._recv()
220 r = self.pipei.read(l)
221 if not r: 229 if not r:
222 return 1 230 return 1
223 return int(r) 231 try:
232 return int(r)
233 except:
234 self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
224 235
225 def stream_out(self): 236 def stream_out(self):
226 return self.do_cmd('stream_out') 237 return self.do_cmd('stream_out')
227 238
228 instance = sshrepository 239 instance = sshrepository