diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -31,11 +31,18 @@ from . import ( repository, streamclone, util, + wireprototypes, ) urlerr = util.urlerr urlreq = util.urlreq +ooberror = wireprototypes.ooberror +pushres = wireprototypes.pushres +pusherr = wireprototypes.pusherr +streamres = wireprototypes.streamres +streamres_legacy = wireprototypes.streamreslegacy + bundle2requiredmain = _('incompatible Mercurial client; bundle2 required') bundle2requiredhint = _('see https://www.mercurial-scm.org/wiki/' 'IncompatibleClient') @@ -477,60 +484,6 @@ class wirepeer(repository.legacypeer): # server side # wire protocol command can either return a string or one of these classes. -class streamres(object): - """wireproto reply: binary stream - - The call was successful and the result is a stream. - - Accepts a generator containing chunks of data to be sent to the client. - - ``prefer_uncompressed`` indicates that the data is expected to be - uncompressable and that the stream should therefore use the ``none`` - engine. - """ - def __init__(self, gen=None, prefer_uncompressed=False): - self.gen = gen - self.prefer_uncompressed = prefer_uncompressed - -class streamres_legacy(object): - """wireproto reply: uncompressed binary stream - - The call was successful and the result is a stream. - - Accepts a generator containing chunks of data to be sent to the client. - - Like ``streamres``, but sends an uncompressed data for "version 1" clients - using the application/mercurial-0.1 media type. - """ - def __init__(self, gen=None): - self.gen = gen - -class pushres(object): - """wireproto reply: success with simple integer return - - The call was successful and returned an integer contained in `self.res`. - """ - def __init__(self, res, output): - self.res = res - self.output = output - -class pusherr(object): - """wireproto reply: failure - - The call failed. The `self.res` attribute contains the error message. - """ - def __init__(self, res, output): - self.res = res - self.output = output - -class ooberror(object): - """wireproto reply: failure of a batch of operation - - Something failed during a batch call. The error message is stored in - `self.message`. - """ - def __init__(self, message): - self.message = message def getdispatchrepo(repo, proto, command): """Obtain the repo used for processing wire protocol commands. diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -20,6 +20,7 @@ from . import ( pycompat, util, wireproto, + wireprototypes, ) stringio = util.stringio @@ -273,11 +274,11 @@ def _callhttp(repo, req, proto, cmd): if isinstance(rsp, bytes): req.respond(HTTP_OK, HGTYPE, body=rsp) return [] - elif isinstance(rsp, wireproto.streamres_legacy): + elif isinstance(rsp, wireprototypes.streamreslegacy): gen = rsp.gen req.respond(HTTP_OK, HGTYPE) return gen - elif isinstance(rsp, wireproto.streamres): + elif isinstance(rsp, wireprototypes.streamres): gen = rsp.gen # This code for compression should not be streamres specific. It @@ -291,18 +292,18 @@ def _callhttp(repo, req, proto, cmd): req.respond(HTTP_OK, mediatype) return gen - elif isinstance(rsp, wireproto.pushres): + elif isinstance(rsp, wireprototypes.pushres): rsp = '%d\n%s' % (rsp.res, rsp.output) req.respond(HTTP_OK, HGTYPE, body=rsp) return [] - elif isinstance(rsp, wireproto.pusherr): + elif isinstance(rsp, wireprototypes.pusherr): # This is the httplib workaround documented in _handlehttperror(). req.drain() rsp = '0\n%s\n' % rsp.res req.respond(HTTP_OK, HGTYPE, body=rsp) return [] - elif isinstance(rsp, wireproto.ooberror): + elif isinstance(rsp, wireprototypes.ooberror): rsp = rsp.message req.respond(HTTP_OK, HGERRTYPE, body=rsp) return [] @@ -434,16 +435,16 @@ class sshserver(object): if isinstance(rsp, bytes): _sshv1respondbytes(self._fout, rsp) - elif isinstance(rsp, wireproto.streamres): + elif isinstance(rsp, wireprototypes.streamres): _sshv1respondstream(self._fout, rsp) - elif isinstance(rsp, wireproto.streamres_legacy): + elif isinstance(rsp, wireprototypes.streamreslegacy): _sshv1respondstream(self._fout, rsp) - elif isinstance(rsp, wireproto.pushres): + elif isinstance(rsp, wireprototypes.pushres): _sshv1respondbytes(self._fout, b'') _sshv1respondbytes(self._fout, bytes(rsp.res)) - elif isinstance(rsp, wireproto.pusherr): + elif isinstance(rsp, wireprototypes.pusherr): _sshv1respondbytes(self._fout, rsp.res) - elif isinstance(rsp, wireproto.ooberror): + elif isinstance(rsp, wireprototypes.ooberror): _sshv1respondooberror(self._fout, self._ui.ferr, rsp.message) else: raise error.ProgrammingError('unhandled response type from ' diff --git a/mercurial/wireprototypes.py b/mercurial/wireprototypes.py new file mode 100644 --- /dev/null +++ b/mercurial/wireprototypes.py @@ -0,0 +1,61 @@ +# Copyright 2018 Gregory Szorc +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +from __future__ import absolute_import + +class ooberror(object): + """wireproto reply: failure of a batch of operation + + Something failed during a batch call. The error message is stored in + `self.message`. + """ + def __init__(self, message): + self.message = message + +class pushres(object): + """wireproto reply: success with simple integer return + + The call was successful and returned an integer contained in `self.res`. + """ + def __init__(self, res, output): + self.res = res + self.output = output + +class pusherr(object): + """wireproto reply: failure + + The call failed. The `self.res` attribute contains the error message. + """ + def __init__(self, res, output): + self.res = res + self.output = output + +class streamres(object): + """wireproto reply: binary stream + + The call was successful and the result is a stream. + + Accepts a generator containing chunks of data to be sent to the client. + + ``prefer_uncompressed`` indicates that the data is expected to be + uncompressable and that the stream should therefore use the ``none`` + engine. + """ + def __init__(self, gen=None, prefer_uncompressed=False): + self.gen = gen + self.prefer_uncompressed = prefer_uncompressed + +class streamreslegacy(object): + """wireproto reply: uncompressed binary stream + + The call was successful and the result is a stream. + + Accepts a generator containing chunks of data to be sent to the client. + + Like ``streamres``, but sends an uncompressed data for "version 1" clients + using the application/mercurial-0.1 media type. + """ + def __init__(self, gen=None): + self.gen = gen