comparison mercurial/sshrepo.py @ 11592:26e0782b8380

protocol: unify client unbundle support - introduce _callpush helper - factor out differences in result handling into helpers - unify
author Matt Mackall <mpm@selenic.com>
date Wed, 14 Jul 2010 17:12:18 -0500
parents 0d9cb3f3b0a1
children 47ca289a3a08
comparison
equal deleted inserted replaced
11591:0d9cb3f3b0a1 11592:26e0782b8380
126 126
127 def _call(self, cmd, **args): 127 def _call(self, cmd, **args):
128 self._callstream(cmd, **args) 128 self._callstream(cmd, **args)
129 return self._recv() 129 return self._recv()
130 130
131 def _callpush(self, cmd, fp, **args):
132 r = self._call(cmd, **args)
133 if r:
134 return '', r
135 while 1:
136 d = fp.read(4096)
137 if not d:
138 break
139 self._send(d)
140 self._send("", flush=True)
141 r = self._recv()
142 if r:
143 return '', r
144 return self._recv(), ''
145
131 def _decompress(self, stream): 146 def _decompress(self, stream):
132 return stream 147 return stream
133 148
134 def _recv(self): 149 def _recv(self):
135 l = self.pipei.readline() 150 l = self.pipei.readline()
153 return remotelock(self) 168 return remotelock(self)
154 169
155 def unlock(self): 170 def unlock(self):
156 self._call("unlock") 171 self._call("unlock")
157 172
158 def unbundle(self, cg, heads, source):
159 '''Send cg (a readable file-like object representing the
160 changegroup to push, typically a chunkbuffer object) to the
161 remote server as a bundle. Return an integer indicating the
162 result of the push (see localrepository.addchangegroup()).'''
163 d = self._call("unbundle", heads=' '.join(map(hex, heads)))
164 if d:
165 # remote may send "unsynced changes"
166 self._abort(error.RepoError(_("push refused: %s") % d))
167
168 while 1:
169 d = cg.read(4096)
170 if not d:
171 break
172 self._send(d)
173
174 self._send("", flush=True)
175
176 r = self._recv()
177 if r:
178 # remote may send "unsynced changes"
179 self._abort(error.RepoError(_("push failed: %s") % r))
180
181 r = self._recv()
182 try:
183 return int(r)
184 except:
185 self._abort(error.ResponseError(_("unexpected response:"), r))
186
187 def addchangegroup(self, cg, source, url): 173 def addchangegroup(self, cg, source, url):
188 '''Send a changegroup to the remote server. Return an integer 174 '''Send a changegroup to the remote server. Return an integer
189 similar to unbundle(). DEPRECATED, since it requires locking the 175 similar to unbundle(). DEPRECATED, since it requires locking the
190 remote.''' 176 remote.'''
191 d = self._call("addchangegroup") 177 d = self._call("addchangegroup")