wireprotov2peer: split responsedata handling into separate function
authorGregory Szorc <gregory.szorc@gmail.com>
Thu, 23 Aug 2018 13:46:39 -0700
changeset 39438 c734a5c82f38
parent 39437 3c6f7eebc010
child 39439 dc61a67c1fc0
wireprotov2peer: split responsedata handling into separate function So we don't have so much logic inside an if/elif block. Differential Revision: https://phab.mercurial-scm.org/D4439
mercurial/wireprotov2peer.py
--- a/mercurial/wireprotov2peer.py	Wed Aug 22 10:25:47 2018 -0700
+++ b/mercurial/wireprotov2peer.py	Thu Aug 23 13:46:39 2018 -0700
@@ -136,38 +136,40 @@
         response = self._responses[frame.requestid]
 
         if action == 'responsedata':
-            # This buffers all data until end of stream is received. This
-            # is bad for performance.
-            # TODO make response data streamable
-            response.b.write(meta['data'])
-
-            if meta['eos']:
-                # If the command has a decoder, resolve the future to the
-                # decoded value. Otherwise resolve to the rich response object.
-                decoder = COMMAND_DECODERS.get(response.command)
-
-                # TODO consider always resolving the overall status map.
-                if decoder:
-                    objs = response.cborobjects()
-
-                    overall = next(objs)
-
-                    if overall['status'] == 'ok':
-                        self._futures[frame.requestid].set_result(decoder(objs))
-                    else:
-                        e = error.RepoError(
-                            formatrichmessage(overall['error']['message']))
-                        self._futures[frame.requestid].set_exception(e)
-                else:
-                    self._futures[frame.requestid].set_result(response)
-
-                del self._requests[frame.requestid]
-                del self._futures[frame.requestid]
-
+            self._processresponsedata(frame, meta, response)
         else:
             raise error.ProgrammingError(
                 'unhandled action from clientreactor: %s' % action)
 
+    def _processresponsedata(self, frame, meta, response):
+        # This buffers all data until end of stream is received. This
+        # is bad for performance.
+        # TODO make response data streamable
+        response.b.write(meta['data'])
+
+        if meta['eos']:
+            # If the command has a decoder, resolve the future to the
+            # decoded value. Otherwise resolve to the rich response object.
+            decoder = COMMAND_DECODERS.get(response.command)
+
+            # TODO consider always resolving the overall status map.
+            if decoder:
+                objs = response.cborobjects()
+
+                overall = next(objs)
+
+                if overall['status'] == 'ok':
+                    self._futures[frame.requestid].set_result(decoder(objs))
+                else:
+                    e = error.RepoError(
+                        formatrichmessage(overall['error']['message']))
+                    self._futures[frame.requestid].set_exception(e)
+            else:
+                self._futures[frame.requestid].set_result(response)
+
+            del self._requests[frame.requestid]
+            del self._futures[frame.requestid]
+
 def decodebranchmap(objs):
     # Response should be a single CBOR map of branch name to array of nodes.
     bm = next(objs)