changeset 36371:0c231df1ffdc

wireprototypes: move baseprotocolhandler from wireprotoserver This is needed to prevent a cycle in an upcoming commit. Differential Revision: https://phab.mercurial-scm.org/D2384
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 21 Feb 2018 14:21:05 -0800
parents 11ba1a96f946
children b8d0761a85c7
files mercurial/wireprotoserver.py mercurial/wireprototypes.py
diffstat 2 files changed, 53 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/wireprotoserver.py	Wed Feb 21 14:02:23 2018 -0800
+++ b/mercurial/wireprotoserver.py	Wed Feb 21 14:21:05 2018 -0800
@@ -6,7 +6,6 @@
 
 from __future__ import absolute_import
 
-import abc
 import contextlib
 import struct
 import sys
@@ -39,55 +38,6 @@
 # to reflect BC breakages.
 SSHV2 = 'exp-ssh-v2-0001'
 
-class baseprotocolhandler(object):
-    """Abstract base class for wire protocol handlers.
-
-    A wire protocol handler serves as an interface between protocol command
-    handlers and the wire protocol transport layer. Protocol handlers provide
-    methods to read command arguments, redirect stdio for the duration of
-    the request, handle response types, etc.
-    """
-
-    __metaclass__ = abc.ABCMeta
-
-    @abc.abstractproperty
-    def name(self):
-        """The name of the protocol implementation.
-
-        Used for uniquely identifying the transport type.
-        """
-
-    @abc.abstractmethod
-    def getargs(self, args):
-        """return the value for arguments in <args>
-
-        returns a list of values (same order as <args>)"""
-
-    @abc.abstractmethod
-    def forwardpayload(self, fp):
-        """Read the raw payload and forward to a file.
-
-        The payload is read in full before the function returns.
-        """
-
-    @abc.abstractmethod
-    def mayberedirectstdio(self):
-        """Context manager to possibly redirect stdio.
-
-        The context manager yields a file-object like object that receives
-        stdout and stderr output when the context manager is active. Or it
-        yields ``None`` if no I/O redirection occurs.
-
-        The intent of this context manager is to capture stdio output
-        so it may be sent in the response. Some transports support streaming
-        stdio to the client in real time. For these transports, stdio output
-        won't be captured.
-        """
-
-    @abc.abstractmethod
-    def client(self):
-        """Returns a string representation of this client (as bytes)."""
-
 def decodevaluefromheaders(req, headerprefix):
     """Decode a long value from multiple HTTP request headers.
 
@@ -105,7 +55,7 @@
 
     return ''.join(chunks)
 
-class httpv1protocolhandler(baseprotocolhandler):
+class httpv1protocolhandler(wireprototypes.baseprotocolhandler):
     def __init__(self, req, ui):
         self._req = req
         self._ui = ui
@@ -364,7 +314,7 @@
     fout.write(b'\n')
     fout.flush()
 
-class sshv1protocolhandler(baseprotocolhandler):
+class sshv1protocolhandler(wireprototypes.baseprotocolhandler):
     """Handler for requests services via version 1 of SSH protocol."""
     def __init__(self, ui, fin, fout):
         self._ui = ui
--- a/mercurial/wireprototypes.py	Wed Feb 21 14:02:23 2018 -0800
+++ b/mercurial/wireprototypes.py	Wed Feb 21 14:21:05 2018 -0800
@@ -5,6 +5,8 @@
 
 from __future__ import absolute_import
 
+import abc
+
 class bytesresponse(object):
     """A wire protocol response consisting of raw bytes."""
     def __init__(self, data):
@@ -64,3 +66,52 @@
     """
     def __init__(self, gen=None):
         self.gen = gen
+
+class baseprotocolhandler(object):
+    """Abstract base class for wire protocol handlers.
+
+    A wire protocol handler serves as an interface between protocol command
+    handlers and the wire protocol transport layer. Protocol handlers provide
+    methods to read command arguments, redirect stdio for the duration of
+    the request, handle response types, etc.
+    """
+
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractproperty
+    def name(self):
+        """The name of the protocol implementation.
+
+        Used for uniquely identifying the transport type.
+        """
+
+    @abc.abstractmethod
+    def getargs(self, args):
+        """return the value for arguments in <args>
+
+        returns a list of values (same order as <args>)"""
+
+    @abc.abstractmethod
+    def forwardpayload(self, fp):
+        """Read the raw payload and forward to a file.
+
+        The payload is read in full before the function returns.
+        """
+
+    @abc.abstractmethod
+    def mayberedirectstdio(self):
+        """Context manager to possibly redirect stdio.
+
+        The context manager yields a file-object like object that receives
+        stdout and stderr output when the context manager is active. Or it
+        yields ``None`` if no I/O redirection occurs.
+
+        The intent of this context manager is to capture stdio output
+        so it may be sent in the response. Some transports support streaming
+        stdio to the client in real time. For these transports, stdio output
+        won't be captured.
+        """
+
+    @abc.abstractmethod
+    def client(self):
+        """Returns a string representation of this client (as bytes)."""