diff -r f913e90f15a0 -r dedab036215d mercurial/wireproto.py --- a/mercurial/wireproto.py Sun Aug 06 18:00:19 2017 -0700 +++ b/mercurial/wireproto.py Thu Aug 10 20:58:28 2017 -0700 @@ -27,6 +27,7 @@ peer, pushkey as pushkeymod, pycompat, + repository, streamclone, util, ) @@ -212,7 +213,7 @@ # client side -class wirepeer(peer.peerrepository): +class wirepeer(repository.legacypeer): """Client-side interface for communicating with a peer repository. Methods commonly call wire protocol commands of the same name. @@ -220,28 +221,7 @@ See also httppeer.py and sshpeer.py for protocol-specific implementations of this interface. """ - def _submitbatch(self, req): - """run batch request on the server - - Returns an iterator of the raw responses from the server. - """ - rsp = self._callstream("batch", cmds=encodebatchcmds(req)) - chunk = rsp.read(1024) - work = [chunk] - while chunk: - while ';' not in chunk and chunk: - chunk = rsp.read(1024) - work.append(chunk) - merged = ''.join(work) - while ';' in merged: - one, merged = merged.split(';', 1) - yield unescapearg(one) - chunk = rsp.read(1024) - work = [merged, chunk] - yield unescapearg(''.join(work)) - - def _submitone(self, op, args): - return self._call(op, **args) + # Begin of basewirepeer interface. def iterbatch(self): return remoteiterbatcher(self) @@ -293,26 +273,17 @@ except TypeError: self._abort(error.ResponseError(_("unexpected response:"), d)) - def branches(self, nodes): - n = encodelist(nodes) - d = self._call("branches", nodes=n) - try: - br = [tuple(decodelist(b)) for b in d.splitlines()] - return br - except ValueError: - self._abort(error.ResponseError(_("unexpected response:"), d)) - - def between(self, pairs): - batch = 8 # avoid giant requests - r = [] - for i in xrange(0, len(pairs), batch): - n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]]) - d = self._call("between", pairs=n) - try: - r.extend(l and decodelist(l) or [] for l in d.splitlines()) - except ValueError: - self._abort(error.ResponseError(_("unexpected response:"), d)) - return r + @batchable + def listkeys(self, namespace): + if not self.capable('pushkey'): + yield {}, None + f = future() + self.ui.debug('preparing listkeys for "%s"\n' % namespace) + yield {'namespace': encoding.fromlocal(namespace)}, f + d = f.value + self.ui.debug('received listkey for "%s": %i bytes\n' + % (namespace, len(d))) + yield pushkeymod.decodekeys(d) @batchable def pushkey(self, namespace, key, old, new): @@ -335,34 +306,9 @@ self.ui.status(_('remote: '), l) yield d - @batchable - def listkeys(self, namespace): - if not self.capable('pushkey'): - yield {}, None - f = future() - self.ui.debug('preparing listkeys for "%s"\n' % namespace) - yield {'namespace': encoding.fromlocal(namespace)}, f - d = f.value - self.ui.debug('received listkey for "%s": %i bytes\n' - % (namespace, len(d))) - yield pushkeymod.decodekeys(d) - def stream_out(self): return self._callstream('stream_out') - def changegroup(self, nodes, kind): - n = encodelist(nodes) - f = self._callcompressable("changegroup", roots=n) - return changegroupmod.cg1unpacker(f, 'UN') - - def changegroupsubset(self, bases, heads, kind): - self.requirecap('changegroupsubset', _('look up remote changes')) - bases = encodelist(bases) - heads = encodelist(heads) - f = self._callcompressable("changegroupsubset", - bases=bases, heads=heads) - return changegroupmod.cg1unpacker(f, 'UN') - def getbundle(self, source, **kwargs): self.requirecap('getbundle', _('look up remote changes')) opts = {} @@ -433,6 +379,69 @@ ret = bundle2.getunbundler(self.ui, stream) return ret + # End of basewirepeer interface. + + # Begin of baselegacywirepeer interface. + + def branches(self, nodes): + n = encodelist(nodes) + d = self._call("branches", nodes=n) + try: + br = [tuple(decodelist(b)) for b in d.splitlines()] + return br + except ValueError: + self._abort(error.ResponseError(_("unexpected response:"), d)) + + def between(self, pairs): + batch = 8 # avoid giant requests + r = [] + for i in xrange(0, len(pairs), batch): + n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]]) + d = self._call("between", pairs=n) + try: + r.extend(l and decodelist(l) or [] for l in d.splitlines()) + except ValueError: + self._abort(error.ResponseError(_("unexpected response:"), d)) + return r + + def changegroup(self, nodes, kind): + n = encodelist(nodes) + f = self._callcompressable("changegroup", roots=n) + return changegroupmod.cg1unpacker(f, 'UN') + + def changegroupsubset(self, bases, heads, kind): + self.requirecap('changegroupsubset', _('look up remote changes')) + bases = encodelist(bases) + heads = encodelist(heads) + f = self._callcompressable("changegroupsubset", + bases=bases, heads=heads) + return changegroupmod.cg1unpacker(f, 'UN') + + # End of baselegacywirepeer interface. + + def _submitbatch(self, req): + """run batch request on the server + + Returns an iterator of the raw responses from the server. + """ + rsp = self._callstream("batch", cmds=encodebatchcmds(req)) + chunk = rsp.read(1024) + work = [chunk] + while chunk: + while ';' not in chunk and chunk: + chunk = rsp.read(1024) + work.append(chunk) + merged = ''.join(work) + while ';' in merged: + one, merged = merged.split(';', 1) + yield unescapearg(one) + chunk = rsp.read(1024) + work = [merged, chunk] + yield unescapearg(''.join(work)) + + def _submitone(self, op, args): + return self._call(op, **args) + def debugwireargs(self, one, two, three=None, four=None, five=None): # don't pass optional arguments left at their default value opts = {}