# HG changeset patch # User Pierre-Yves David # Date 2019-10-07 03:36:51 # Node ID c17a63eb5d4c6d39567ea2aadd7687af9213526f # Parent c88075eb28e3281a4470fde929fbf5a13bda5f8a sidedata: apply basic but tight security around exchange We don't currently have code to deal with exchange between repository using sidedata and repository not using sidedata. Until we implement such code (eg: dropping side data when pushing to a non-sidedata repo) we prevent the two kind of repo to speak to each other. This is somewhere similar to what 'treemanifest' does. Note that sidedata exchange is broken unless one use changegroup v3 anyway. See next changeset for details. Differential Revision: https://phab.mercurial-scm.org/D6939 diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -1711,6 +1711,8 @@ def _addpartsfromopts(ui, repo, bundler, part.addparam( b'targetphase', b'%d' % phases.secret, mandatory=False ) + if b'exp-sidedata-flag' in repo.requirements: + part.addparam(b'exp-sidedata', b'1') if opts.get(b'streamv2', False): addpartbundlestream2(bundler, repo, stream=True) @@ -1930,7 +1932,14 @@ def combinechangegroupresults(op): @parthandler( - b'changegroup', (b'version', b'nbchanges', b'treemanifest', b'targetphase') + b'changegroup', + ( + b'version', + b'nbchanges', + b'exp-sidedata', + b'treemanifest', + b'targetphase', + ), ) def handlechangegroup(op, inpart): """apply a changegroup part on the repo @@ -1965,6 +1974,14 @@ def handlechangegroup(op, inpart): op.repo.ui, op.repo.requirements, op.repo.features ) op.repo._writerequirements() + + bundlesidedata = bool(b'exp-sidedata' in inpart.params) + reposidedata = bool(b'exp-sidedata-flag' in op.repo.requirements) + if reposidedata and not bundlesidedata: + msg = b"repository is using sidedata but the bundle source do not" + hint = b'this is currently unsupported' + raise error.Abort(msg, hint=hint) + extrakwargs = {} targetphase = inpart.params.get(b'targetphase') if targetphase is not None: @@ -2551,5 +2568,7 @@ def widen_bundle( part.addparam(b'version', cgversion) if b'treemanifest' in repo.requirements: part.addparam(b'treemanifest', b'1') + if b'exp-sidedata-flag' in repo.requirements: + part.addparam(b'exp-sidedata', b'1') return bundler diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -1049,6 +1049,8 @@ def _pushb2ctx(pushop, bundler): cgpart.addparam(b'version', version) if b'treemanifest' in pushop.repo.requirements: cgpart.addparam(b'treemanifest', b'1') + if b'exp-sidedata-flag' in pushop.repo.requirements: + cgpart.addparam(b'exp-sidedata', b'1') def handlereply(op): """extract addchangegroup returns from server reply""" @@ -2511,6 +2513,9 @@ def _getbundlechangegrouppart( if b'treemanifest' in repo.requirements: part.addparam(b'treemanifest', b'1') + if b'exp-sidedata-flag' in repo.requirements: + part.addparam(b'exp-sidedata', b'1') + if ( kwargs.get(r'narrow', False) and kwargs.get(r'narrow_acl', False)