comparison mercurial/wireproto.py @ 37393:afcfdf53e4b5

wireproto: provide accessors for client capabilities For HTTP, this refactors the existing logic, including the parsing of the compression engine capability. For SSH, this adds a ssh-only capability "protocaps" and a command for informing the server on what the client supports. Since SSH is stateful, keep track of the capabilities in the server instance. Differential Revision: https://phab.mercurial-scm.org/D1944
author Joerg Sonnenberger <joerg@bec.de>
date Sat, 24 Mar 2018 17:57:22 +0100
parents ac666c5c2e0c
children 1d459f61b42a
comparison
equal deleted inserted replaced
37392:a4f02a17420d 37393:afcfdf53e4b5
156 args = ','.join('%s=%s' % (escapearg(k), escapearg(v)) 156 args = ','.join('%s=%s' % (escapearg(k), escapearg(v))
157 for k, v in argsdict.iteritems()) 157 for k, v in argsdict.iteritems())
158 cmds.append('%s %s' % (op, args)) 158 cmds.append('%s %s' % (op, args))
159 159
160 return ';'.join(cmds) 160 return ';'.join(cmds)
161
162 def clientcompressionsupport(proto):
163 """Returns a list of compression methods supported by the client.
164
165 Returns a list of the compression methods supported by the client
166 according to the protocol capabilities. If no such capability has
167 been announced, fallback to the default of zlib and uncompressed.
168 """
169 for cap in proto.getprotocaps():
170 if cap.startswith('comp='):
171 return cap[5:].split(',')
172 return ['zlib', 'none']
161 173
162 # mapping of options accepted by getbundle and their types 174 # mapping of options accepted by getbundle and their types
163 # 175 #
164 # Meant to be extended by extensions. It is extensions responsibility to ensure 176 # Meant to be extended by extensions. It is extensions responsibility to ensure
165 # such options are properly processed in exchange.getbundle. 177 # such options are properly processed in exchange.getbundle.
1024 1036
1025 @wireprotocommand('known', 'nodes *', permission='pull') 1037 @wireprotocommand('known', 'nodes *', permission='pull')
1026 def known(repo, proto, nodes, others): 1038 def known(repo, proto, nodes, others):
1027 v = ''.join(b and '1' or '0' for b in repo.known(decodelist(nodes))) 1039 v = ''.join(b and '1' or '0' for b in repo.known(decodelist(nodes)))
1028 return wireprototypes.bytesresponse(v) 1040 return wireprototypes.bytesresponse(v)
1041
1042 @wireprotocommand('protocaps', 'caps', permission='pull',
1043 transportpolicy=POLICY_V1_ONLY)
1044 def protocaps(repo, proto, caps):
1045 if proto.name == wireprototypes.SSHV1:
1046 proto._protocaps = set(caps.split(' '))
1047 return wireprototypes.bytesresponse('OK')
1029 1048
1030 @wireprotocommand('pushkey', 'namespace key old new', permission='push') 1049 @wireprotocommand('pushkey', 'namespace key old new', permission='push')
1031 def pushkey(repo, proto, namespace, key, old, new): 1050 def pushkey(repo, proto, namespace, key, old, new):
1032 # compatibility with pre-1.8 clients which were accidentally 1051 # compatibility with pre-1.8 clients which were accidentally
1033 # sending raw binary nodes rather than utf-8-encoded hex 1052 # sending raw binary nodes rather than utf-8-encoded hex