D6939: sidedata: apply basic but tight security around exchange

marmoute (Pierre-Yves David) phabricator at mercurial-scm.org
Tue Oct 1 12:08:36 EDT 2019


marmoute created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6939

AFFECTED FILES
  mercurial/bundle2.py
  mercurial/exchange.py

CHANGE DETAILS

diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -919,6 +919,8 @@
         cgpart.addparam('version', version)
     if 'treemanifest' in pushop.repo.requirements:
         cgpart.addparam('treemanifest', '1')
+    if 'exp-sidedata-flag' in pushop.repo.requirements:
+        cgpart.addparam('exp-sidedata', '1')
     def handlereply(op):
         """extract addchangegroup returns from server reply"""
         cgreplies = op.records.getreplies(cgpart.id)
@@ -2211,6 +2213,9 @@
     if 'treemanifest' in repo.requirements:
         part.addparam('treemanifest', '1')
 
+    if 'exp-sidedata-flag' in repo.requirements:
+        part.addparam('exp-sidedata', '1')
+
     if (kwargs.get(r'narrow', False) and kwargs.get(r'narrow_acl', False)
         and (include or exclude)):
         # this is mandatory because otherwise ACL clients won't work
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -1802,8 +1802,8 @@
         result = -1 + changedheads
     return result
 
- at parthandler('changegroup', ('version', 'nbchanges', 'treemanifest',
-                             'targetphase'))
+ at parthandler('changegroup', ('version', 'nbchanges', 'exp-sidedata',
+                             'treemanifest', 'targetphase'))
 def handlechangegroup(op, inpart):
     """apply a changegroup part on the repo
 
@@ -1831,6 +1831,14 @@
         op.repo.svfs.options = localrepo.resolvestorevfsoptions(
             op.repo.ui, op.repo.requirements, op.repo.features)
         op.repo._writerequirements()
+
+    bundlesidedata = bool('exp-sidedata' in inpart.params)
+    reposidedata = bool('exp-sidedata-flag' in op.repo.requirements)
+    if reposidedata and not bundlesidedata:
+        msg = "repository is using sidedata but the bundle source do not"
+        hint = 'this is currently unsupported'
+        raise error.Abort(msg, hint=hint)
+
     extrakwargs = {}
     targetphase = inpart.params.get('targetphase')
     if targetphase is not None:
@@ -2329,5 +2337,7 @@
         part.addparam('version', cgversion)
         if 'treemanifest' in repo.requirements:
             part.addparam('treemanifest', '1')
+        if 'exp-sidedata-flag' in repo.requirements:
+            part.addparam('sidedata', '1')
 
     return bundler



To: marmoute, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list