wireprotov2peer: properly format errors
authorGregory Szorc <gregory.szorc@gmail.com>
Wed, 05 Sep 2018 09:04:40 -0700
changeset 39486 43d92d68ac88
parent 39485 42bc1c70a6b8
child 39487 931386a0b108
wireprotov2peer: properly format errors formatrichmessage() expects an iterable containing dicts with well-defined keys. We were passing in something else. This caused an exception. Change the code to call formatrichmessage() with the proper argument. And add a TODO to potentially emit the proper data structure from the server in the first place. Differential Revision: https://phab.mercurial-scm.org/D4441
mercurial/wireprotoframing.py
mercurial/wireprotov2peer.py
--- a/mercurial/wireprotoframing.py	Thu Aug 23 13:50:47 2018 -0700
+++ b/mercurial/wireprotoframing.py	Wed Sep 05 09:04:40 2018 -0700
@@ -419,6 +419,8 @@
                            payload=b'')
 
 def createcommanderrorresponse(stream, requestid, message, args=None):
+    # TODO should this be using a list of {'msg': ..., 'args': {}} so atom
+    # formatting works consistently?
     m = {
         b'status': b'error',
         b'error': {
--- a/mercurial/wireprotov2peer.py	Thu Aug 23 13:50:47 2018 -0700
+++ b/mercurial/wireprotov2peer.py	Wed Sep 05 09:04:40 2018 -0700
@@ -27,7 +27,7 @@
         msg = _(atom[b'msg'])
 
         if b'args' in atom:
-            msg = msg % atom[b'args']
+            msg = msg % tuple(atom[b'args'])
 
         chunks.append(msg)
 
@@ -163,8 +163,10 @@
                 if overall['status'] == 'ok':
                     self._futures[frame.requestid].set_result(decoder(objs))
                 else:
-                    e = error.RepoError(
-                        formatrichmessage(overall['error']['message']))
+                    atoms = [{'msg': overall['error']['message']}]
+                    if 'args' in overall['error']:
+                        atoms[0]['args'] = overall['error']['args']
+                    e = error.RepoError(formatrichmessage(atoms))
                     self._futures[frame.requestid].set_exception(e)
             else:
                 self._futures[frame.requestid].set_result(response)