[PATCH 1 of 3 main] wireprotocol: distinct list and set in getbundle argument

Pierre-Yves David pierre-yves.david at ens-lyon.org
Mon Jun 1 17:34:39 UTC 2015


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1433179720 25200
#      Mon Jun 01 10:28:40 2015 -0700
# Node ID b2f643a640da8176791eebb449c9be85b29aeb72
# Parent  52569d4c494e4e1b57a3fa1873a3a9f133bce8a7
wireprotocol: distinct list and set in getbundle argument

The 'bundlecaps' argument is expected to be a set, but 'listkeys' is expected to
be a list were ordering matters. We introduce a new 'scvs' argument type for the
'set' version and move 'cvs' to the 'list' version.

'test-ssh.t' is changed because this introduced an instability in the order we
were producing listkeys parts.

diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
--- a/mercurial/wireproto.py
+++ b/mercurial/wireproto.py
@@ -201,15 +201,16 @@ def unescapearg(escaped):
 #
 # supported types are:
 #
 # :nodes: list of binary nodes
 # :csv:   list of comma-separated values
+# :scsv:  list of comma-separated values return as set
 # :plain: string with no transformation needed.
 gboptsmap = {'heads':  'nodes',
              'common': 'nodes',
              'obsmarkers': 'boolean',
-             'bundlecaps': 'csv',
+             'bundlecaps': 'scsv',
              'listkeys': 'csv',
              'cg': 'boolean'}
 
 # client side
 
@@ -358,11 +359,11 @@ class wirepeer(peer.peerrepository):
             keytype = gboptsmap.get(key)
             if keytype is None:
                 assert False, 'unexpected'
             elif keytype == 'nodes':
                 value = encodelist(value)
-            elif keytype == 'csv':
+            elif keytype in ('csv', 'scsv'):
                 value = ','.join(value)
             elif keytype == 'boolean':
                 value = '%i' % bool(value)
             elif keytype != 'plain':
                 raise KeyError('unknown getbundle option type %s'
@@ -663,10 +664,12 @@ def getbundle(repo, proto, others):
     for k, v in opts.iteritems():
         keytype = gboptsmap[k]
         if keytype == 'nodes':
             opts[k] = decodelist(v)
         elif keytype == 'csv':
+            opts[k] = list(v.split(','))
+        elif keytype == 'scsv':
             opts[k] = set(v.split(','))
         elif keytype == 'boolean':
             opts[k] = bool(v)
         elif keytype != 'plain':
             raise KeyError('unknown getbundle option type %s'
diff --git a/tests/test-ssh.t b/tests/test-ssh.t
--- a/tests/test-ssh.t
+++ b/tests/test-ssh.t
@@ -464,12 +464,12 @@ debug output
   all remote heads known locally
   no changes found
   sending getbundle command
   bundle2-input-bundle: with-transaction
   bundle2-input-part: "listkeys" (params: 1 mandatory) supported
+  bundle2-input-part: "listkeys" (params: 1 mandatory) supported
   bundle2-input-part: total payload size 45
-  bundle2-input-part: "listkeys" (params: 1 mandatory) supported
   bundle2-input-bundle: 1 parts total
   checking for updated bookmarks
   preparing listkeys for "phases"
   sending listkeys command
   received listkey for "phases": 15 bytes


More information about the Mercurial-devel mailing list