Patchwork [6,of,8] treemanifests: set bundle2 part parameter indicating treemanifest

login
register
mail settings
Submitter timeless@mozdev.org
Date Jan. 12, 2016, 10:56 p.m.
Message ID <86bdb5382cd077082a03.1452639390@waste.org>
Download mbox | patch
Permalink /patch/12734/
State Accepted
Commit 5c0fd878779c15cd01a74acd2ddaaeae6014891a
Headers show

Comments

timeless@mozdev.org - Jan. 12, 2016, 10:56 p.m.
# HG changeset patch
# User Martin von Zweigbergk <martinvonz@google.com>
# Date 1452316386 28800
#      Fri Jan 08 21:13:06 2016 -0800
# Node ID 86bdb5382cd077082a0365f2b4c5fe69561b451c
# Parent  b377a23d6d61694be26a4764d08ea7b155bfe866
treemanifests: set bundle2 part parameter indicating treemanifest

By adding a mandatory 'treemanifest' parameter in the bundle2 part, we
make it possible for the recipient to set repo requirements before the
manifest revlog is accessed.

Patch

diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -1262,7 +1262,7 @@ 
     obscaps = caps.get('obsmarkers', ())
     return [int(c[1:]) for c in obscaps if c.startswith('V')]
 
-@parthandler('changegroup', ('version', 'nbchanges'))
+@parthandler('changegroup', ('version', 'nbchanges', 'treemanifest'))
 def handlechangegroup(op, inpart):
     """apply a changegroup part on the repo
 
@@ -1284,6 +1284,15 @@ 
     nbchangesets = None
     if 'nbchanges' in inpart.params:
         nbchangesets = int(inpart.params.get('nbchanges'))
+    if ('treemanifest' in inpart.params and
+        'treemanifest' not in op.repo.requirements):
+        if len(op.repo.changelog) != 0:
+            raise error.Abort(_(
+                "bundle contains tree manifests, but local repo is "
+                "non-empty and does not use tree manifests"))
+        op.repo.requirements.add('treemanifest')
+        op.repo._applyopenerreqs()
+        op.repo._writerequirements()
     ret = cg.apply(op.repo, 'bundle2', 'bundle2', expectedtotal=nbchangesets)
     op.records.add('changegroup', {'return': ret})
     if op.reply is not None:
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -1046,17 +1046,6 @@ 
         directory = (f[-1] == '/')
         if directory:
             # a directory using treemanifests
-            # TODO fixup repo requirements safely
-            if 'treemanifest' not in repo.requirements:
-                if not wasempty:
-                    raise error.Abort(_(
-                        "bundle contains tree manifests, but local repo is "
-                        "non-empty and does not use tree manifests"))
-                repo.requirements.add('treemanifest')
-                repo._applyopenerreqs()
-                repo._writerequirements()
-                repo.manifest._treeondisk = True
-                repo.manifest._treeinmem = True
             fl = repo.manifest.dirlog(f)
         else:
             fl = repo.file(f)
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -1519,6 +1519,8 @@ 
         if version is not None:
             part.addparam('version', version)
         part.addparam('nbchanges', str(len(outgoing.missing)), mandatory=False)
+        if 'treemanifest' in repo.requirements:
+            part.addparam('treemanifest', '1')
 
 @getbundle2partsgenerator('listkeys')
 def _getbundlelistkeysparts(bundler, repo, source, bundlecaps=None,