diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -31,11 +31,18 @@ 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 @@ # 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 @@ pycompat, util, wireproto, + wireprototypes, ) stringio = util.stringio @@ -273,11 +274,11 @@ 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 @@ 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 [] @@ -409,11 +410,11 @@ _handlers = { str: _sendresponse, - wireproto.streamres: _sendstream, - wireproto.streamres_legacy: _sendstream, - wireproto.pushres: _sendpushresponse, - wireproto.pusherr: _sendpusherror, - wireproto.ooberror: _sendooberror, + wireprototypes.streamres: _sendstream, + wireprototypes.streamreslegacy: _sendstream, + wireprototypes.pushres: _sendpushresponse, + wireprototypes.pusherr: _sendpusherror, + wireprototypes.ooberror: _sendooberror, } def client(self): 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