[PATCH 1 of 2] wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc
gregory.szorc at gmail.com
Sat Aug 6 20:59:25 UTC 2016
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1470516388 25200
# Sat Aug 06 13:46:28 2016 -0700
# Node ID a700e61e5b1b74884e3537c9268c08bc11a8b1e8
# Parent 3ef9aa7ad1fc4c43b92d48e4bb1f4e3de68b6910
wireproto: consolidate code for obtaining "cmds" argument value
Both wireproto.py and sshpeer.py had code for producing the value to
the "cmds" argument used by the "batch" command. This patch extracts
that code to a standalone function and uses it.
diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
--- a/mercurial/sshpeer.py
+++ b/mercurial/sshpeer.py
@@ -227,23 +227,17 @@ class sshpeer(wireproto.wirepeer):
self.ui.status(_("remote: "), l)
except (IOError, ValueError):
pass
self.pipee.close()
__del__ = cleanup
def _submitbatch(self, req):
- cmds = []
- for op, argsdict in req:
- args = ','.join('%s=%s' % (wireproto.escapearg(k),
- wireproto.escapearg(v))
- for k, v in argsdict.iteritems())
- cmds.append('%s %s' % (op, args))
- rsp = self._callstream("batch", cmds=';'.join(cmds))
+ rsp = self._callstream("batch", cmds=wireproto.encodebatchcmds(req))
available = self._getamount()
# TODO this response parsing is probably suboptimal for large
# batches with large responses.
toread = min(available, 1024)
work = rsp.read(toread)
available -= toread
chunk = work
while chunk:
diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
--- a/mercurial/wireproto.py
+++ b/mercurial/wireproto.py
@@ -182,16 +182,26 @@ def escapearg(plain):
def unescapearg(escaped):
return (escaped
.replace(':e', '=')
.replace(':s', ';')
.replace(':o', ',')
.replace(':c', ':'))
+def encodebatchcmds(req):
+ """Return a ``cmds`` argument value for the ``batch`` command."""
+ cmds = []
+ for op, argsdict in req:
+ args = ','.join('%s=%s' % (escapearg(k), escapearg(v))
+ for k, v in argsdict.iteritems())
+ cmds.append('%s %s' % (op, args))
+
+ return ';'.join(cmds)
+
# mapping of options accepted by getbundle and their types
#
# Meant to be extended by extensions. It is extensions responsibility to ensure
# such options are properly processed in exchange.getbundle.
#
# supported types are:
#
# :nodes: list of binary nodes
@@ -221,22 +231,17 @@ class wirepeer(peer.peerrepository):
return remotebatch(self)
else:
return peer.localbatch(self)
def _submitbatch(self, req):
"""run batch request <req> on the server
Returns an iterator of the raw responses from the server.
"""
- cmds = []
- for op, argsdict in req:
- args = ','.join('%s=%s' % (escapearg(k), escapearg(v))
- for k, v in argsdict.iteritems())
- cmds.append('%s %s' % (op, args))
- rsp = self._callstream("batch", cmds=';'.join(cmds))
+ rsp = self._callstream("batch", cmds=encodebatchcmds(req))
chunk = rsp.read(1024)
work = [chunk]
while chunk:
while ';' not in chunk and chunk:
chunk = rsp.read(1024)
work.append(chunk)
merged = ''.join(work)
while ';' in merged:
More information about the Mercurial-devel
mailing list