# HG changeset patch # User Joerg Sonnenberger # Date 1523044201 -7200 # Node ID 3e1688711efdd9305b32496e89a8f741f15bfd79 # Parent a6651f5e2c7814350d8137db0e6635bf32c33cb6 wireproto: turn client capabilities into sets, sorted on the wire Differential Revision: https://phab.mercurial-scm.org/D3169 diff -r a6651f5e2c78 -r 3e1688711efd mercurial/httppeer.py --- a/mercurial/httppeer.py Wed Apr 04 13:43:52 2018 -0700 +++ b/mercurial/httppeer.py Fri Apr 06 21:50:01 2018 +0200 @@ -282,17 +282,17 @@ # Tell the server we accept application/mercurial-0.2 and multiple # compression formats if the server is capable of emitting those # payloads. - protoparams = [] + protoparams = set() mediatypes = set() if self._caps is not None: mt = self.capable('httpmediatype') if mt: - protoparams.append('0.1') + protoparams.add('0.1') mediatypes = set(mt.split(',')) if '0.2tx' in mediatypes: - protoparams.append('0.2') + protoparams.add('0.2') if '0.2tx' in mediatypes and self.capable('compression'): # We /could/ compare supported compression formats and prune @@ -300,10 +300,10 @@ # For now, send the full list to the server and have it error. comps = [e.wireprotosupport().name for e in util.compengines.supportedwireengines(util.CLIENTROLE)] - protoparams.append('comp=%s' % ','.join(comps)) + protoparams.add('comp=%s' % ','.join(comps)) if protoparams: - protoheaders = encodevalueinheaders(' '.join(protoparams), + protoheaders = encodevalueinheaders(' '.join(sorted(protoparams)), 'X-HgProto', headersize or 1024) for header, value in protoheaders: diff -r a6651f5e2c78 -r 3e1688711efd mercurial/sshpeer.py --- a/mercurial/sshpeer.py Wed Apr 04 13:43:52 2018 -0700 +++ b/mercurial/sshpeer.py Fri Apr 06 21:50:01 2018 +0200 @@ -168,10 +168,10 @@ Returns a list of capabilities that are supported by this client. """ - protoparams = [] + protoparams = set() comps = [e.wireprotosupport().name for e in util.compengines.supportedwireengines(util.CLIENTROLE)] - protoparams.append('comp=%s' % ','.join(comps)) + protoparams.add('comp=%s' % ','.join(comps)) return protoparams def _performhandshake(ui, stdin, stdout, stderr): @@ -626,7 +626,8 @@ # capabilities. if 'protocaps' in peer.capabilities(): try: - peer._call("protocaps", caps=' '.join(_clientcapabilities())) + peer._call("protocaps", + caps=' '.join(sorted(_clientcapabilities()))) except IOError: peer._cleanup() raise error.RepoError(_('capability exchange failed'))