Mercurial > hg-stable
changeset 27734:5c0fd878779c
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.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 08 Jan 2016 21:13:06 -0800 |
parents | 3d1baa702d1a |
children | bd37212c20ed |
files | mercurial/bundle2.py mercurial/changegroup.py mercurial/exchange.py |
diffstat | 3 files changed, 12 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/bundle2.py Wed Jan 06 20:05:18 2016 +0000 +++ b/mercurial/bundle2.py Fri Jan 08 21:13:06 2016 -0800 @@ -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:
--- a/mercurial/changegroup.py Wed Jan 06 20:05:18 2016 +0000 +++ b/mercurial/changegroup.py Fri Jan 08 21:13:06 2016 -0800 @@ -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)
--- a/mercurial/exchange.py Wed Jan 06 20:05:18 2016 +0000 +++ b/mercurial/exchange.py Fri Jan 08 21:13:06 2016 -0800 @@ -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,