mercurial/wireproto.py
changeset 37533 df4985497986
parent 37498 aacfca6f9767
child 37534 465187fec06f
--- a/mercurial/wireproto.py	Sun Apr 08 09:45:45 2018 -0700
+++ b/mercurial/wireproto.py	Mon Apr 09 11:52:31 2018 -0700
@@ -903,7 +903,8 @@
 
 # If you are writing an extension and consider wrapping this function. Wrap
 # `_capabilities` instead.
-@wireprotocommand('capabilities', permission='pull')
+@wireprotocommand('capabilities', permission='pull',
+                  transportpolicy=POLICY_V1_ONLY)
 def capabilities(repo, proto):
     caps = _capabilities(repo, proto)
     return wireprototypes.bytesresponse(' '.join(sorted(caps)))
@@ -1283,6 +1284,31 @@
 
 # Wire protocol version 2 commands only past this point.
 
+def _capabilitiesv2(repo, proto):
+    """Obtain the set of capabilities for version 2 transports.
+
+    These capabilities are distinct from the capabilities for version 1
+    transports.
+    """
+    compression = []
+    for engine in supportedcompengines(repo.ui, util.SERVERROLE):
+        compression.append({
+            b'name': engine.wireprotosupport().name,
+        })
+
+    caps = {
+        'commands': {},
+        'compression': compression,
+    }
+
+    for command, entry in commandsv2.items():
+        caps['commands'][command] = {
+            'args': sorted(entry.args.split()) if entry.args else [],
+            'permissions': [entry.permission],
+        }
+
+    return proto.addcapabilities(repo, caps)
+
 @wireprotocommand('branchmap', permission='pull',
                   transportpolicy=POLICY_V2_ONLY)
 def branchmapv2(repo, proto):
@@ -1291,6 +1317,13 @@
 
     return wireprototypes.cborresponse(branchmap)
 
+@wireprotocommand('capabilities', permission='pull',
+                  transportpolicy=POLICY_V2_ONLY)
+def capabilitiesv2(repo, proto):
+    caps = _capabilitiesv2(repo, proto)
+
+    return wireprototypes.cborresponse(caps)
+
 @wireprotocommand('heads', args='publiconly', permission='pull',
                   transportpolicy=POLICY_V2_ONLY)
 def headsv2(repo, proto, publiconly=False):