changeset 179:c4c0efb37187

protocol: add the abilty to trace the protocol between the client and server This is useful when debugging issues with driving hg via hglib where output and error messages can be lost. Call setprotocoltrace with the name of a trace function or None. If the trace function is None no tracing is done. The trace function is called with the direction, the channel-identified and its data.
author Barry A. Scott <barry@barrys-emacs.org>
date Tue, 18 Oct 2016 17:45:17 +0100
parents 77a5fded9f45
children ff6efc1ab9e4
files hglib/client.py
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hglib/client.py	Fri Oct 28 11:45:57 2016 +0100
+++ b/hglib/client.py	Tue Oct 18 17:45:17 2016 +0100
@@ -62,6 +62,18 @@
         if connect:
             self.open()
 
+        self._protocoltracefn = None
+
+    def setprotocoltrace(self, tracefn=None):
+        """
+        if tracefn is None no trace calls will be made.
+        Otherwise tracefn is call as tracefn( direction, channel, data )
+        direction is 'r' for read from server and 'w' for write to server
+        channel is always None when direction is 'w'
+        and the channel-identified when the direction is 'r'
+        """
+        self._protocoltracefn = tracefn
+
     def __enter__(self):
         if self.server is None:
             self.open()
@@ -119,6 +131,8 @@
 
     def runcommand(self, args, inchannels, outchannels):
         def writeblock(data):
+            if self._protocoltracefn is not None:
+                self._protocoltracefn('w', None, data)
             self.server.stdin.write(struct.pack(self.inputfmt, len(data)))
             self.server.stdin.write(data)
             self.server.stdin.flush()
@@ -131,6 +145,8 @@
 
         while True:
             channel, data = self._readchannel()
+            if self._protocoltracefn is not None:
+                self._protocoltracefn('r', channel, data)
 
             # input channels
             if channel in inchannels: