diff -r 8475c9bf096d -r df4985497986 mercurial/wireproto.py --- 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):