##// END OF EJS Templates
commitctx: gather more code dealing with copy-in-extra...
commitctx: gather more code dealing with copy-in-extra Now that we have a function that deal with the copy-in-extra special case, we can gather more code meant to deal with this special case. Making the rest of the code simpler.

File last commit:

r45666:a03c177a default
r45811:0041a42c default
Show More
upgrade.py
1431 lines | 44.3 KiB | text/x-python | PythonLexer
Pierre-Yves David
upgrade: update the header comment
r31894 # upgrade.py - functions for in place upgrade of Mercurial repository
Pierre-Yves David
upgrade: extract code in its own module...
r31864 #
Pierre-Yves David
upgrade: update the copyright statement
r31895 # Copyright (c) 2016-present, Gregory Szorc
Pierre-Yves David
upgrade: extract code in its own module...
r31864 #
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
import stat
from .i18n import _
Gregory Szorc
py3: manually import getattr where it is needed...
r43359 from .pycompat import getattr
Pierre-Yves David
upgrade: extract code in its own module...
r31864 from . import (
changelog,
error,
Boris Feld
upgrade: use actual filelog to convert filelog...
r35345 filelog,
Boris Feld
upgrade: more standard creation of the temporary repository...
r35344 hg,
Pierre-Yves David
upgrade: import 'localrepo' globally...
r31893 localrepo,
Pierre-Yves David
upgrade: extract code in its own module...
r31864 manifest,
metadata: move computation related to files touched in a dedicated module...
r45466 metadata,
Yuya Nishihara
py3: wrap tempfile.mkdtemp() to use bytes path...
r38183 pycompat,
Pierre-Yves David
upgrade: extract code in its own module...
r31864 revlog,
scmutil,
util,
vfs as vfsmod,
)
Augie Fackler
formatting: blacken the codebase...
r43346 from .utils import compression
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306
upgrade: make sure we reclone all revlogs when updating to some format...
r43100 # list of requirements that request a clone of all revlog if added/removed
RECLONES_REQUIREMENTS = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'generaldelta',
upgrade: make sure we reclone all revlogs when updating to some format...
r43100 localrepo.SPARSEREVLOG_REQUIREMENT,
}
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'requiredsourcerequirements' function...
r31865 def requiredsourcerequirements(repo):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Obtain requirements required to be present to upgrade a repo.
An upgrade will not be allowed if the repository doesn't have the
requirements returned by this function.
"""
Martin von Zweigbergk
cleanup: use set literals...
r32291 return {
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Introduced in Mercurial 0.9.2.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'revlogv1',
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Introduced in Mercurial 0.9.2.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'store',
Martin von Zweigbergk
cleanup: use set literals...
r32291 }
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'blocksourcerequirements' function...
r31866 def blocksourcerequirements(repo):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Obtain requirements that will prevent an upgrade from occurring.
An upgrade cannot be performed if the source repository contains a
requirements in the returned set.
"""
Martin von Zweigbergk
cleanup: use set literals...
r32291 return {
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # The upgrade code does not yet support these experimental features.
# This is an artificial limitation.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'treemanifest',
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # This was a precursor to generaldelta and was never enabled by default.
# It should (hopefully) not exist in the wild.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'parentdelta',
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Upgrade should operate on the actual store, not the shared link.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'shared',
Martin von Zweigbergk
cleanup: use set literals...
r32291 }
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'supportremovedrequirements' function...
r31867 def supportremovedrequirements(repo):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Obtain requirements that can be removed during an upgrade.
If an upgrade were to create a repository that dropped a requirement,
the dropped requirement must appear in the returned set for the upgrade
to be allowed.
"""
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported = {
Paul Morelle
upgrade: enable adding or removing sparse-revlog requirement
r38742 localrepo.SPARSEREVLOG_REQUIREMENT,
upgrade: allow for `sidedata` removal...
r43405 localrepo.SIDEDATA_REQUIREMENT,
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 localrepo.COPIESSDC_REQUIREMENT,
upgrade: support upgrade and downgrade from persistent nodemap...
r45356 localrepo.NODEMAP_REQUIREMENT,
Paul Morelle
upgrade: enable adding or removing sparse-revlog requirement
r38742 }
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 for name in compression.compengines:
engine = compression.compengines[name]
if engine.available() and engine.revlogheader():
supported.add(b'exp-compression-%s' % name)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if engine.name() == b'zstd':
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported.add(b'revlog-compression-zstd')
return supported
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'supporteddestrequirements' function...
r31870 def supporteddestrequirements(repo):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Obtain requirements that upgrade supports in the destination.
If the result of the upgrade would create requirements not in this set,
the upgrade is disallowed.
Extensions should monkeypatch this to add their custom requirements.
"""
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'dotencode',
b'fncache',
b'generaldelta',
b'revlogv1',
b'store',
Paul Morelle
upgrade: enable adding or removing sparse-revlog requirement
r38742 localrepo.SPARSEREVLOG_REQUIREMENT,
upgrade: allow upgrade to repository using sidedata...
r43404 localrepo.SIDEDATA_REQUIREMENT,
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 localrepo.COPIESSDC_REQUIREMENT,
upgrade: support upgrade and downgrade from persistent nodemap...
r45356 localrepo.NODEMAP_REQUIREMENT,
Martin von Zweigbergk
cleanup: use set literals...
r32291 }
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 for name in compression.compengines:
engine = compression.compengines[name]
if engine.available() and engine.revlogheader():
supported.add(b'exp-compression-%s' % name)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if engine.name() == b'zstd':
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported.add(b'revlog-compression-zstd')
return supported
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'allowednewrequirements' function...
r31869 def allowednewrequirements(repo):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Obtain requirements that can be added to a repository during upgrade.
This is used to disallow proposed requirements from being added when
they weren't present before.
We use a list of allowed requirement additions instead of a list of known
bad additions because the whitelist approach is safer and will prevent
future, unknown requirements from accidentally being added.
"""
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'dotencode',
b'fncache',
b'generaldelta',
Paul Morelle
upgrade: enable adding or removing sparse-revlog requirement
r38742 localrepo.SPARSEREVLOG_REQUIREMENT,
upgrade: allow upgrade to repository using sidedata...
r43404 localrepo.SIDEDATA_REQUIREMENT,
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 localrepo.COPIESSDC_REQUIREMENT,
upgrade: support upgrade and downgrade from persistent nodemap...
r45356 localrepo.NODEMAP_REQUIREMENT,
Martin von Zweigbergk
cleanup: use set literals...
r32291 }
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 for name in compression.compengines:
engine = compression.compengines[name]
if engine.available() and engine.revlogheader():
supported.add(b'exp-compression-%s' % name)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if engine.name() == b'zstd':
upgrade: support upgrade to/from zstd storage (issue6088)...
r42306 supported.add(b'revlog-compression-zstd')
return supported
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Boris Feld
upgraderepo: allow extension to register preserved requirements...
r35303 def preservedrequirements(repo):
return set()
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 deficiency = b'deficiency'
optimisation = b'optimization'
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the 'improvement' class...
r31868 class improvement(object):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Represents an improvement that can be made as part of an upgrade.
The following attributes are defined on each instance:
name
Machine-readable string uniquely identifying this improvement. It
will be mapped to an action later in the upgrade process.
type
Either ``deficiency`` or ``optimisation``. A deficiency is an obvious
problem. An optimization is an action (sometimes optional) that
can be taken to further improve the state of the repository.
description
Message intended for humans explaining the improvement in more detail,
including the implications of it. For ``deficiency`` types, should be
worded in the present tense. For ``optimisation`` types, should be
worded in the future tense.
upgrademessage
Message intended for humans explaining what an upgrade addressing this
issue will do. Should be worded in the future tense.
"""
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030 def __init__(self, name, type, description, upgrademessage):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 self.name = name
self.type = type
self.description = description
self.upgrademessage = upgrademessage
Pierre-Yves David
upgrade: implement equality for 'improvement' object...
r31902 def __eq__(self, other):
if not isinstance(other, improvement):
# This is what python tell use to do
return NotImplemented
return self.name == other.name
Pierre-Yves David
upgrade: implement '__ne__' on 'improvement' class...
r32028 def __ne__(self, other):
Benjamin Peterson
upgrade: correct implementation of improvement.__ne__...
r41033 return not (self == other)
Pierre-Yves David
upgrade: implement '__ne__' on 'improvement' class...
r32028
Pierre-Yves David
upgrade: implement '__hash__' on 'improvement' class...
r32029 def __hash__(self):
return hash(self.name)
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 allformatvariant = []
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 def registerformatvariant(cls):
allformatvariant.append(cls)
return cls
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030 class formatvariant(improvement):
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 """an improvement subclass dedicated to repository format"""
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 type = deficiency
### The following attributes should be defined for each class:
# machine-readable string uniquely identifying this improvement. it will be
# mapped to an action later in the upgrade process.
name = None
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 # message intended for humans explaining the improvement in more detail,
# including the implications of it ``deficiency`` types, should be worded
# in the present tense.
description = None
# message intended for humans explaining what an upgrade addressing this
# issue will do. should be worded in the future tense.
upgrademessage = None
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 # value of current Mercurial default for new repository
default = None
def __init__(self):
raise NotImplementedError()
@staticmethod
def fromrepo(repo):
"""current value of the variant in the repository"""
raise NotImplementedError()
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 @staticmethod
def fromconfig(repo):
"""current value of the variant in the configuration"""
raise NotImplementedError()
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 class requirementformatvariant(formatvariant):
"""formatvariant based on a 'requirement' name.
Many format variant are controlled by a 'requirement'. We define a small
subclass to factor the code.
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030 """
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 # the requirement that control this format variant
_requirement = None
@staticmethod
Gregory Szorc
localrepo: pass ui to newreporequirements() (API)...
r39583 def _newreporequirements(ui):
Gregory Szorc
localrepo: define storage backend in creation options (API)...
r40032 return localrepo.newreporequirements(
Augie Fackler
formatting: blacken the codebase...
r43346 ui, localrepo.defaultcreateopts(ui)
)
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
@classmethod
def fromrepo(cls, repo):
assert cls._requirement is not None
return cls._requirement in repo.requirements
@classmethod
def fromconfig(cls, repo):
assert cls._requirement is not None
Gregory Szorc
localrepo: pass ui to newreporequirements() (API)...
r39583 return cls._requirement in cls._newreporequirements(repo.ui)
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 @registerformatvariant
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 class fncache(requirementformatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'fncache'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _requirement = b'fncache'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
default = True
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'long and reserved filenames may not work correctly; '
b'repository performance is sub-optimal'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'repository will be more resilient to storing '
b'certain paths and performance of certain '
b'operations should be improved'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 @registerformatvariant
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 class dotencode(requirementformatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'dotencode'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _requirement = b'dotencode'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
default = True
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'storage of filenames beginning with a period or '
b'space may not work correctly'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'repository will be better able to store files '
b'beginning with a space or period'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 @registerformatvariant
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 class generaldelta(requirementformatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'generaldelta'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _requirement = b'generaldelta'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
default = True
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage are unable to '
b'choose optimal revisions; repository is larger and '
b'slower than it could be; interaction with other '
b'repositories may require extra network and CPU '
b'resources, making "hg push" and "hg pull" slower'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'repository storage will be able to create '
b'optimal deltas; new repository data will be '
b'smaller and read times should decrease; '
b'interacting with other repositories using this '
b'storage model should require less network and '
b'CPU resources, making "hg push" and "hg pull" '
b'faster'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 @registerformatvariant
Paul Morelle
upgrade: add information about sparse-revlog...
r38741 class sparserevlog(requirementformatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'sparserevlog'
Paul Morelle
upgrade: add information about sparse-revlog...
r38741
_requirement = localrepo.SPARSEREVLOG_REQUIREMENT
Boris Feld
sparse-revlog: enabled by default...
r40954 default = True
Paul Morelle
upgrade: add information about sparse-revlog...
r38741
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'in order to limit disk reading and memory usage on older '
b'version, the span of a delta chain from its root to its '
b'end is limited, whatever the relevant data in this span. '
b'This can severly limit Mercurial ability to build good '
b'chain of delta resulting is much more storage space being '
b'taken and limit reusability of on disk delta during '
b'exchange.'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Paul Morelle
upgrade: add information about sparse-revlog...
r38741
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'Revlog supports delta chain with more unused data '
b'between payload. These gaps will be skipped at read '
b'time. This allows for better delta chains, making a '
b'better compression and faster exchange with server.'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Paul Morelle
upgrade: add information about sparse-revlog...
r38741
@registerformatvariant
upgrade: detect the side-data format variants...
r43299 class sidedata(requirementformatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'sidedata'
upgrade: detect the side-data format variants...
r43299
_requirement = localrepo.SIDEDATA_REQUIREMENT
default = False
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'Allows storage of extra data alongside a revision, '
b'unlocking various caching options.'
Augie Fackler
formatting: blacken the codebase...
r43346 )
upgrade: detect the side-data format variants...
r43299
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 upgrademessage = _(b'Allows storage of extra data alongside a revision.')
upgrade: detect the side-data format variants...
r43299
Augie Fackler
formatting: blacken the codebase...
r43346
upgrade: detect the side-data format variants...
r43299 @registerformatvariant
nodemap: teach `hg debugformat` about the persistent nodemap option...
r45303 class persistentnodemap(requirementformatvariant):
name = b'persistent-nodemap'
_requirement = localrepo.NODEMAP_REQUIREMENT
default = False
description = _(
b'persist the node -> rev mapping on disk to speedup lookup'
)
upgrademessage = _(b'Speedup revision lookup by node id.')
@registerformatvariant
sidedatacopies: teach upgrade about the new requirement...
r43408 class copiessdc(requirementformatvariant):
name = b'copies-sdc'
_requirement = localrepo.COPIESSDC_REQUIREMENT
default = False
description = _(b'Stores copies information alongside changesets.')
upgrademessage = _(
b'Allows to use more efficient algorithm to deal with ' b'copy tracing.'
)
@registerformatvariant
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 class removecldeltachain(formatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'plain-cl-delta'
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
default = True
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'changelog storage is using deltas instead of '
b'raw entries; changelog reading and any '
b'operation relying on changelog data are slower '
b'than they could be'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'changelog storage will be reformated to '
b'store raw entries; changelog reading will be '
b'faster; changelog size may be reduced'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031
@staticmethod
def fromrepo(repo):
# Mercurial 4.0 changed changelogs to not use delta chains. Search for
# changelogs with deltas.
cl = repo.changelog
chainbase = cl.chainbase
return all(rev == chainbase(rev) for rev in cl)
@staticmethod
def fromconfig(repo):
return True
Pierre-Yves David
upgrade: introduce a 'formatvariant' class...
r32030
Augie Fackler
formatting: blacken the codebase...
r43346
Boris Feld
upgrade: register compression as a format variants...
r35341 @registerformatvariant
class compressionengine(formatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'compression'
default = b'zlib'
Boris Feld
upgrade: register compression as a format variants...
r35341
Augie Fackler
formatting: blacken the codebase...
r43346 description = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'Compresion algorithm used to compress data. '
b'Some engine are faster than other'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Boris Feld
upgrade: register compression as a format variants...
r35341
Augie Fackler
formatting: blacken the codebase...
r43346 upgrademessage = _(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 b'revlog content will be recompressed with the new algorithm.'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Boris Feld
upgrade: register compression as a format variants...
r35341
@classmethod
def fromrepo(cls, repo):
compression: introduce an official `zstd-revlog` requirement...
r42305 # we allow multiple compression engine requirement to co-exist because
# strickly speaking, revlog seems to support mixed compression style.
#
# The compression used for new entries will be "the last one"
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 compression = b'zlib'
Boris Feld
upgrade: register compression as a format variants...
r35341 for req in repo.requirements:
compression: introduce an official `zstd-revlog` requirement...
r42305 prefix = req.startswith
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
compression = req.split(b'-', 2)[2]
compression: introduce an official `zstd-revlog` requirement...
r42305 return compression
Boris Feld
upgrade: register compression as a format variants...
r35341
@classmethod
def fromconfig(cls, repo):
revlog-compression: update the config to be a list...
r44866 compengines = repo.ui.configlist(b'format', b'revlog-compression')
# return the first valid value as the selection code would do
for comp in compengines:
if comp in util.compengines:
return comp
# no valide compression found lets display it all for clarity
return b','.join(compengines)
Boris Feld
upgrade: register compression as a format variants...
r35341
Augie Fackler
formatting: blacken the codebase...
r43346
compression: display compression level in debugformat...
r42212 @registerformatvariant
class compressionlevel(formatvariant):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'compression-level'
default = b'default'
compression: display compression level in debugformat...
r42212
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 description = _(b'compression level')
compression: display compression level in debugformat...
r42212
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 upgrademessage = _(b'revlog content will be recompressed')
compression: display compression level in debugformat...
r42212
@classmethod
def fromrepo(cls, repo):
comp = compressionengine.fromrepo(repo)
level = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if comp == b'zlib':
level = repo.ui.configint(b'storage', b'revlog.zlib.level')
elif comp == b'zstd':
level = repo.ui.configint(b'storage', b'revlog.zstd.level')
compression: display compression level in debugformat...
r42212 if level is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b'default'
compression: display compression level in debugformat...
r42212 return bytes(level)
@classmethod
def fromconfig(cls, repo):
comp = compressionengine.fromconfig(repo)
level = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if comp == b'zlib':
level = repo.ui.configint(b'storage', b'revlog.zlib.level')
elif comp == b'zstd':
level = repo.ui.configint(b'storage', b'revlog.zstd.level')
compression: display compression level in debugformat...
r42212 if level is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b'default'
compression: display compression level in debugformat...
r42212 return bytes(level)
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 def finddeficiencies(repo):
"""returns a list of deficiencies that the repo suffer from"""
deficiencies = []
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# We could detect lack of revlogv1 and store here, but they were added
# in 0.9.2 and we don't support upgrading repos without these
# requirements, so let's not bother.
Pierre-Yves David
upgrade: register all format variants in a list...
r32032 for fv in allformatvariant:
if not fv.fromrepo(repo):
deficiencies.append(fv)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 return deficiencies
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Boris Feld
upgrade: add '-' in optimization name...
r41120 # search without '-' to support older form on newer client.
#
# We don't enforce backward compatibility for debug command so this
# might eventually be dropped. However, having to use two different
# forms in script when comparing result is anoying enough to add
# backward compatibility for a while.
legacy_opts_map = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'redeltaparent': b're-delta-parent',
b'redeltamultibase': b're-delta-multibase',
b'redeltaall': b're-delta-all',
b'redeltafulladd': b're-delta-fulladd',
Boris Feld
upgrade: add '-' in optimization name...
r41120 }
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 def findoptimizations(repo):
"""Determine optimisation that could be used during upgrade"""
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # These are unconditionally added. There is logic later that figures out
# which ones to apply.
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 optimizations = []
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 optimizations.append(
improvement(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name=b're-delta-parent',
Augie Fackler
formatting: blacken the codebase...
r43346 type=optimisation,
description=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will be recalculated to '
b'choose an optimal base revision where this was not '
b'already done; the size of the repository may shrink and '
b'various operations may become faster; the first time '
b'this optimization is performed could slow down upgrade '
b'execution considerably; subsequent invocations should '
b'not run noticeably slower'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
upgrademessage=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will choose a new '
b'base revision if needed'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 optimizations.append(
improvement(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name=b're-delta-multibase',
Augie Fackler
formatting: blacken the codebase...
r43346 type=optimisation,
description=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will be recalculated '
b'against multiple base revision and the smallest '
b'difference will be used; the size of the repository may '
b'shrink significantly when there are many merges; this '
b'optimization will slow down execution in proportion to '
b'the number of merges in the repository and the amount '
b'of files in the repository; this slow down should not '
b'be significant unless there are tens of thousands of '
b'files and thousands of merges'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
upgrademessage=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will choose an '
b'optimal delta by computing deltas against multiple '
b'parents; may slow down execution time '
b'significantly'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 optimizations.append(
improvement(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name=b're-delta-all',
Augie Fackler
formatting: blacken the codebase...
r43346 type=optimisation,
description=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will always be '
b'recalculated without reusing prior deltas; this will '
b'likely make execution run several times slower; this '
b'optimization is typically not needed'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
upgrademessage=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'deltas within internal storage will be fully '
b'recomputed; this will likely drastically slow down '
b'execution time'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 optimizations.append(
improvement(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name=b're-delta-fulladd',
Augie Fackler
formatting: blacken the codebase...
r43346 type=optimisation,
description=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'every revision will be re-added as if it was new '
b'content. It will go through the full storage '
b'mechanism giving extensions a chance to process it '
b'(eg. lfs). This is similar to "re-delta-all" but even '
b'slower since more logic is involved.'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
upgrademessage=_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'each revision will be added as new content to the '
b'internal storage; this will likely drastically slow '
b'down execution time, but some extensions might need '
b'it'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
)
Boris Feld
upgrade: add a 'redeltafullall' mode...
r35346
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 return optimizations
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: simplify 'determineactions'...
r31900 def determineactions(repo, deficiencies, sourcereqs, destreqs):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Determine upgrade actions that will be performed.
Pierre-Yves David
upgrade: split finding deficiencies from finding optimisations...
r31896 Given a list of improvements as returned by ``finddeficiencies`` and
``findoptimizations``, determine the list of upgrade actions that
will be performed.
Pierre-Yves David
upgrade: extract code in its own module...
r31864
The role of this function is to filter improvements if needed, apply
recommended optimizations from the improvements list that make sense,
etc.
Returns a list of action names.
"""
newactions = []
Pierre-Yves David
upgrade: simplify 'determineactions'...
r31900 for d in deficiencies:
upgrade: properly filter action depending on planned work...
r45248 name = d._requirement
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# If the action is a requirement that doesn't show up in the
# destination requirements, prune the action.
upgrade: properly filter action depending on planned work...
r45248 if name is not None and name not in destreqs:
Pierre-Yves David
upgrade: extract code in its own module...
r31864 continue
Pierre-Yves David
upgrade: use 'improvement' object for action too...
r31903 newactions.append(d)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# FUTURE consider adding some optimizations here for certain transitions.
# e.g. adding generaldelta could schedule parent redeltas.
return newactions
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: extract code in its own module...
r31864 def _revlogfrompath(repo, path):
"""Obtain a revlog from a repo path.
An instance of the appropriate class is returned.
"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if path == b'00changelog.i':
Pierre-Yves David
upgrade: extract code in its own module...
r31864 return changelog.changelog(repo.svfs)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif path.endswith(b'00manifest.i'):
mandir = path[: -len(b'00manifest.i')]
Gregory Szorc
manifest: rename dir argument and attribute to tree...
r39279 return manifest.manifestrevlog(repo.svfs, tree=mandir)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 else:
Augie Fackler
formatting: blacken the codebase...
r43346 # reverse of "/".join(("data", path + ".i"))
Boris Feld
upgrade: use actual filelog to convert filelog...
r35345 return filelog.filelog(repo.svfs, path[5:-2])
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346
upgrade: introduce a _copyrevlog method...
r42918 def _copyrevlog(tr, destrepo, oldrl, unencodedname):
"""copy all relevant files for `oldrl` into `destrepo` store
Files are copied "as is" without any transformation. The copy is performed
without extra checks. Callers are responsible for making sure the copied
content is compatible with format of the destination repository.
"""
oldrl = getattr(oldrl, '_revlog', oldrl)
newrl = _revlogfrompath(destrepo, unencodedname)
newrl = getattr(newrl, '_revlog', newrl)
oldvfs = oldrl.opener
newvfs = newrl.opener
oldindex = oldvfs.join(oldrl.indexfile)
newindex = newvfs.join(newrl.indexfile)
olddata = oldvfs.join(oldrl.datafile)
newdata = newvfs.join(newrl.datafile)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with newvfs(newrl.indexfile, b'w'):
Augie Fackler
formatting: blacken the codebase...
r43346 pass # create all the directories
upgrade: introduce a _copyrevlog method...
r42918
util.copyfile(oldindex, newindex)
upgrade: also register copied `.d` files to fncache...
r43272 copydata = oldrl.opener.exists(oldrl.datafile)
if copydata:
upgrade: introduce a _copyrevlog method...
r42918 util.copyfile(olddata, newdata)
Augie Fackler
formatting: blacken the codebase...
r43346 if not (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 unencodedname.endswith(b'00changelog.i')
or unencodedname.endswith(b'00manifest.i')
Augie Fackler
formatting: blacken the codebase...
r43346 ):
upgrade: introduce a _copyrevlog method...
r42918 destrepo.svfs.fncache.add(unencodedname)
upgrade: also register copied `.d` files to fncache...
r43272 if copydata:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 destrepo.svfs.fncache.add(unencodedname[:-2] + b'.d')
upgrade: introduce a _copyrevlog method...
r42918
Augie Fackler
formatting: blacken the codebase...
r43346
upgrade: introduce the internal code for revlog cloning selection...
r42921 UPGRADE_CHANGELOG = object()
UPGRADE_MANIFEST = object()
UPGRADE_FILELOG = object()
Augie Fackler
formatting: blacken the codebase...
r43346 UPGRADE_ALL_REVLOGS = frozenset(
[UPGRADE_CHANGELOG, UPGRADE_MANIFEST, UPGRADE_FILELOG]
)
upgrade: introduce the internal code for revlog cloning selection...
r42921
upgrade: allow for `sidedata` removal...
r43405 def getsidedatacompanion(srcrepo, dstrepo):
sidedatacompanion = None
removedreqs = srcrepo.requirements - dstrepo.requirements
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 addedreqs = dstrepo.requirements - srcrepo.requirements
upgrade: allow for `sidedata` removal...
r43405 if localrepo.SIDEDATA_REQUIREMENT in removedreqs:
def sidedatacompanion(rl, rev):
rl = getattr(rl, '_revlog', rl)
if rl.flags(rev) & revlog.REVIDX_SIDEDATA:
return True, (), {}
return False, (), {}
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 elif localrepo.COPIESSDC_REQUIREMENT in addedreqs:
metadata: move computation related to files touched in a dedicated module...
r45466 sidedatacompanion = metadata.getsidedataadder(srcrepo, dstrepo)
sidedatacopies: deal with upgrading and downgrading to that format...
r43418 elif localrepo.COPIESSDC_REQUIREMENT in removedreqs:
metadata: move computation related to files touched in a dedicated module...
r45466 sidedatacompanion = metadata.getsidedataremover(srcrepo, dstrepo)
upgrade: allow for `sidedata` removal...
r43405 return sidedatacompanion
upgrade: allow upgrade to repository using sidedata...
r43404
upgrade: introduce the internal code for revlog cloning selection...
r42921 def matchrevlog(revlogfilter, entry):
"""check is a revlog is selected for cloning
The store entry is checked against the passed filter"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if entry.endswith(b'00changelog.i'):
upgrade: introduce the internal code for revlog cloning selection...
r42921 return UPGRADE_CHANGELOG in revlogfilter
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif entry.endswith(b'00manifest.i'):
upgrade: introduce the internal code for revlog cloning selection...
r42921 return UPGRADE_MANIFEST in revlogfilter
return UPGRADE_FILELOG in revlogfilter
Augie Fackler
formatting: blacken the codebase...
r43346
def _clonerevlogs(
ui,
srcrepo,
dstrepo,
tr,
deltareuse,
forcedeltabothparents,
revlogs=UPGRADE_ALL_REVLOGS,
):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Copy revlogs between 2 repos."""
revcount = 0
srcsize = 0
srcrawsize = 0
dstsize = 0
fcount = 0
frevcount = 0
fsrcsize = 0
frawsize = 0
fdstsize = 0
mcount = 0
mrevcount = 0
msrcsize = 0
mrawsize = 0
mdstsize = 0
crevcount = 0
csrcsize = 0
crawsize = 0
cdstsize = 0
upgrade: walk the source store file only once...
r42916 alldatafiles = list(srcrepo.store.walk())
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Perform a pass to collect metadata. This validates we can open all
# source files and allows a unified progress bar to be displayed.
upgrade: walk the source store file only once...
r42916 for unencoded, encoded, size in alldatafiles:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if unencoded.endswith(b'.d'):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 continue
rl = _revlogfrompath(srcrepo, unencoded)
Augie Fackler
formatting: blacken the codebase...
r43346 info = rl.storageinfo(
exclusivefiles=True,
revisionscount=True,
trackedsize=True,
storedsize=True,
)
Gregory Szorc
upgrade: report size of backing files, not internal storage size...
r39893
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 revcount += info[b'revisionscount'] or 0
datasize = info[b'storedsize'] or 0
rawsize = info[b'trackedsize'] or 0
Pierre-Yves David
upgrade: extract code in its own module...
r31864
srcsize += datasize
srcrawsize += rawsize
# This is for the separate progress bars.
if isinstance(rl, changelog.changelog):
crevcount += len(rl)
csrcsize += datasize
crawsize += rawsize
elif isinstance(rl, manifest.manifestrevlog):
mcount += 1
mrevcount += len(rl)
msrcsize += datasize
mrawsize += rawsize
Gregory Szorc
upgrade: sniff for filelog type...
r37462 elif isinstance(rl, filelog.filelog):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 fcount += 1
frevcount += len(rl)
fsrcsize += datasize
frawsize += rawsize
Gregory Szorc
upgrade: sniff for filelog type...
r37462 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 error.ProgrammingError(b'unknown revlog type')
Pierre-Yves David
upgrade: extract code in its own module...
r31864
if not revcount:
return
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'migrating %d total revisions (%d in filelogs, %d in manifests, '
b'%d in changelog)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (revcount, frevcount, mrevcount, crevcount)
)
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'migrating %s in store; %s tracked data\n')
Augie Fackler
formatting: blacken the codebase...
r43346 % ((util.bytecount(srcsize), util.bytecount(srcrawsize)))
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# Used to keep track of progress.
Martin von Zweigbergk
upgrade: use progress helper...
r38418 progress = None
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: extract code in its own module...
r31864 def oncopiedrevision(rl, rev, node):
Martin von Zweigbergk
upgrade: use progress helper...
r38418 progress.increment()
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: allow upgrade to repository using sidedata...
r43404 sidedatacompanion = getsidedatacompanion(srcrepo, dstrepo)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Do the actual copying.
# FUTURE this operation can be farmed off to worker processes.
seen = set()
upgrade: walk the source store file only once...
r42916 for unencoded, encoded, size in alldatafiles:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if unencoded.endswith(b'.d'):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 continue
oldrl = _revlogfrompath(srcrepo, unencoded)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if isinstance(oldrl, changelog.changelog) and b'c' not in seen:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'finished migrating %d manifest revisions across %d '
b'manifests; change in size: %s\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (mrevcount, mcount, util.bytecount(mdstsize - msrcsize))
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'migrating changelog containing %d revisions '
b'(%s in store; %s tracked data)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (
crevcount,
util.bytecount(csrcsize),
util.bytecount(crawsize),
)
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 seen.add(b'c')
Augie Fackler
formatting: blacken the codebase...
r43346 progress = srcrepo.ui.makeprogress(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'changelog revisions'), total=crevcount
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif isinstance(oldrl, manifest.manifestrevlog) and b'm' not in seen:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'finished migrating %d filelog revisions across %d '
b'filelogs; change in size: %s\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (frevcount, fcount, util.bytecount(fdstsize - fsrcsize))
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'migrating %d manifests containing %d revisions '
b'(%s in store; %s tracked data)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (
mcount,
mrevcount,
util.bytecount(msrcsize),
util.bytecount(mrawsize),
)
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 seen.add(b'm')
Martin von Zweigbergk
upgrade: close progress after each revlog...
r38417 if progress:
Martin von Zweigbergk
upgrade: use progress helper...
r38418 progress.complete()
Augie Fackler
formatting: blacken the codebase...
r43346 progress = srcrepo.ui.makeprogress(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'manifest revisions'), total=mrevcount
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif b'f' not in seen:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'migrating %d filelogs containing %d revisions '
b'(%s in store; %s tracked data)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (
fcount,
frevcount,
util.bytecount(fsrcsize),
util.bytecount(frawsize),
)
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 seen.add(b'f')
Martin von Zweigbergk
upgrade: close progress after each revlog...
r38417 if progress:
Martin von Zweigbergk
upgrade: use progress helper...
r38418 progress.complete()
Augie Fackler
formatting: blacken the codebase...
r43346 progress = srcrepo.ui.makeprogress(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'file revisions'), total=frevcount
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: introduce the internal code for revlog cloning selection...
r42921 if matchrevlog(revlogs, unencoded):
Augie Fackler
formatting: blacken the codebase...
r43346 ui.note(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'cloning %d revisions from %s\n') % (len(oldrl), unencoded)
Augie Fackler
formatting: blacken the codebase...
r43346 )
upgrade: introduce the internal code for revlog cloning selection...
r42921 newrl = _revlogfrompath(dstrepo, unencoded)
Augie Fackler
formatting: blacken the codebase...
r43346 oldrl.clone(
tr,
newrl,
addrevisioncb=oncopiedrevision,
deltareuse=deltareuse,
forcedeltabothparents=forcedeltabothparents,
upgrade: allow upgrade to repository using sidedata...
r43404 sidedatacompanion=sidedatacompanion,
Augie Fackler
formatting: blacken the codebase...
r43346 )
upgrade: introduce the internal code for revlog cloning selection...
r42921 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 msg = _(b'blindly copying %s containing %i revisions\n')
upgrade: introduce the internal code for revlog cloning selection...
r42921 ui.note(msg % (unencoded, len(oldrl)))
_copyrevlog(tr, dstrepo, oldrl, unencoded)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: introduce the internal code for revlog cloning selection...
r42921 newrl = _revlogfrompath(dstrepo, unencoded)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Gregory Szorc
upgrade: use storageinfo() for obtaining storage metadata...
r39906 info = newrl.storageinfo(storedsize=True)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 datasize = info[b'storedsize'] or 0
Pierre-Yves David
upgrade: extract code in its own module...
r31864
dstsize += datasize
if isinstance(newrl, changelog.changelog):
cdstsize += datasize
elif isinstance(newrl, manifest.manifestrevlog):
mdstsize += datasize
else:
fdstsize += datasize
Martin von Zweigbergk
upgrade: use progress helper...
r38418 progress.complete()
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(
b'finished migrating %d changelog revisions; change in size: '
b'%s\n'
)
Augie Fackler
formatting: blacken the codebase...
r43346 % (crevcount, util.bytecount(cdstsize - csrcsize))
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'finished migrating %d total revisions; total change in store '
b'size: %s\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (revcount, util.bytecount(dstsize - srcsize))
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: drop the prefix to the '_filterstorefile' function...
r31873 def _filterstorefile(srcrepo, dstrepo, requirements, path, mode, st):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Determine whether to copy a store file during upgrade.
This function is called when migrating store files from ``srcrepo`` to
``dstrepo`` as part of upgrading a repository.
Args:
srcrepo: repo we are copying from
dstrepo: repo we are copying to
requirements: set of requirements for ``dstrepo``
path: store file being examined
mode: the ``ST_MODE`` file type of ``path``
st: ``stat`` data structure for ``path``
Function should return ``True`` if the file is to be copied.
"""
# Skip revlogs.
upgrade: support upgrade and downgrade from persistent nodemap...
r45356 if path.endswith((b'.i', b'.d', b'.n', b'.nd')):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 return False
# Skip transaction related files.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if path.startswith(b'undo'):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 return False
# Only copy regular files.
if mode != stat.S_IFREG:
return False
# Skip other skipped files.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if path in (b'lock', b'fncache'):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 return False
return True
Augie Fackler
formatting: blacken the codebase...
r43346
Pierre-Yves David
upgrade: drop the prefix to the '_finishdatamigration' function...
r31874 def _finishdatamigration(ui, srcrepo, dstrepo, requirements):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Hook point for extensions to perform additional actions during upgrade.
This function is called after revlogs and store files have been copied but
before the new store is swapped into the original location.
"""
Augie Fackler
formatting: blacken the codebase...
r43346
def _upgraderepo(
ui, srcrepo, dstrepo, requirements, actions, revlogs=UPGRADE_ALL_REVLOGS
):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Do the low-level work of upgrading a repository.
The upgrade is effectively performed as a copy between a source
repository and a temporary destination repository.
The source repository is unmodified for as long as possible so the
upgrade can abort at any time without causing loss of service for
readers and without corrupting the source repository.
"""
assert srcrepo.currentwlock()
assert dstrepo.currentwlock()
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'(it is safe to interrupt this process any time before '
b'data migration completes)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b're-delta-all' in actions:
Pierre-Yves David
upgrade: extract code in its own module...
r31864 deltareuse = revlog.revlog.DELTAREUSENEVER
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif b're-delta-parent' in actions:
Pierre-Yves David
upgrade: extract code in its own module...
r31864 deltareuse = revlog.revlog.DELTAREUSESAMEREVS
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif b're-delta-multibase' in actions:
Pierre-Yves David
upgrade: extract code in its own module...
r31864 deltareuse = revlog.revlog.DELTAREUSESAMEREVS
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif b're-delta-fulladd' in actions:
Boris Feld
upgrade: add a 'redeltafullall' mode...
r35346 deltareuse = revlog.revlog.DELTAREUSEFULLADD
Pierre-Yves David
upgrade: extract code in its own module...
r31864 else:
deltareuse = revlog.revlog.DELTAREUSEALWAYS
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with dstrepo.transaction(b'upgrade') as tr:
Augie Fackler
formatting: blacken the codebase...
r43346 _clonerevlogs(
ui,
srcrepo,
dstrepo,
tr,
deltareuse,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b're-delta-multibase' in actions,
Augie Fackler
formatting: blacken the codebase...
r43346 revlogs=revlogs,
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# Now copy other files in the store directory.
Yuya Nishihara
merge with stable
r31875 # The sorted() makes execution deterministic.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for p, kind, st in sorted(srcrepo.store.vfs.readdir(b'', stat=True)):
Augie Fackler
formatting: blacken the codebase...
r43346 if not _filterstorefile(srcrepo, dstrepo, requirements, p, kind, st):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 continue
upgrade: support the --quiet flag...
r45302 srcrepo.ui.status(_(b'copying %s\n') % p)
Yuya Nishihara
merge with stable
r31875 src = srcrepo.store.rawvfs.join(p)
dst = dstrepo.store.rawvfs.join(p)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 util.copyfile(src, dst, copystat=True)
Pierre-Yves David
upgrade: drop the prefix to the '_finishdatamigration' function...
r31874 _finishdatamigration(ui, srcrepo, dstrepo, requirements)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(_(b'data fully migrated to temporary repository\n'))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 backuppath = pycompat.mkdtemp(prefix=b'upgradebackup.', dir=srcrepo.path)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 backupvfs = vfsmod.vfs(backuppath)
# Make a backup of requires file first, as it is the first to be modified.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 util.copyfile(srcrepo.vfs.join(b'requires'), backupvfs.join(b'requires'))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# We install an arbitrary requirement that clients must not support
# as a mechanism to lock out new clients during the data swap. This is
# better than allowing a client to continue while the repository is in
# an inconsistent state.
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'marking source repository as being upgraded; clients will be '
b'unable to read from repository\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pulkit Goyal
scmutil: add writereporequirements() and route requires writing through it...
r45666 scmutil.writereporequirements(
srcrepo, srcrepo.requirements | {b'upgradeinprogress'}
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(_(b'starting in-place swap of repository data\n'))
ui.status(_(b'replaced files will be backed up at %s\n') % backuppath)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# Now swap in the new store directory. Doing it as a rename should make
# the operation nearly instantaneous and atomic (at least in well-behaved
# environments).
upgrade: support the --quiet flag...
r45302 ui.status(_(b'replacing store...\n'))
Pierre-Yves David
upgrade: extract code in its own module...
r31864 tstart = util.timer()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 util.rename(srcrepo.spath, backupvfs.join(b'store'))
Pierre-Yves David
upgrade: extract code in its own module...
r31864 util.rename(dstrepo.spath, srcrepo.spath)
elapsed = util.timer() - tstart
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'store replacement complete; repository was inconsistent for '
b'%0.1fs\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% elapsed
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# We first write the requirements file. Any new requirements will lock
# out legacy clients.
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'finalizing requirements file and making repository readable '
b'again\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pulkit Goyal
scmutil: add writereporequirements() and route requires writing through it...
r45666 scmutil.writereporequirements(srcrepo, requirements)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# The lock file from the old store won't be removed because nothing has a
# reference to its new location. So clean it up manually. Alternatively, we
# could update srcrepo.svfs and other variables to point to the new
# location. This is simpler.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 backupvfs.unlink(b'store/lock')
Pierre-Yves David
upgrade: extract code in its own module...
r31864
return backuppath
Augie Fackler
formatting: blacken the codebase...
r43346
def upgraderepo(
ui,
repo,
run=False,
optimize=None,
backup=True,
manifest=None,
changelog=None,
):
Pierre-Yves David
upgrade: extract code in its own module...
r31864 """Upgrade a repository in place."""
Boris Feld
upgrade: add '-' in optimization name...
r41120 if optimize is None:
optimize = []
Augie Fackler
cleanup: run pyupgrade on our source tree to clean up varying things...
r44937 optimize = {legacy_opts_map.get(o, o) for o in optimize}
Pierre-Yves David
upgrade: extract code in its own module...
r31864 repo = repo.unfiltered()
upgrade: add an argument to control manifest upgrade...
r43098 revlogs = set(UPGRADE_ALL_REVLOGS)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 specentries = ((b'c', changelog), (b'm', manifest))
upgrade: add an argument to control manifest upgrade...
r43098 specified = [(y, x) for (y, x) in specentries if x is not None]
if specified:
# we have some limitation on revlogs to be recloned
if any(x for y, x in specified):
revlogs = set()
for r, enabled in specified:
if enabled:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if r == b'c':
upgrade: add an argument to control changelog upgrade...
r43099 revlogs.add(UPGRADE_CHANGELOG)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif r == b'm':
upgrade: add an argument to control manifest upgrade...
r43098 revlogs.add(UPGRADE_MANIFEST)
else:
# none are enabled
for r, __ in specified:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if r == b'c':
upgrade: add an argument to control changelog upgrade...
r43099 revlogs.discard(UPGRADE_CHANGELOG)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif r == b'm':
upgrade: add an argument to control manifest upgrade...
r43098 revlogs.discard(UPGRADE_MANIFEST)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 # Ensure the repository can be upgraded.
Pierre-Yves David
upgrade: drop the prefix to the 'requiredsourcerequirements' function...
r31865 missingreqs = requiredsourcerequirements(repo) - repo.requirements
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if missingreqs:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b'cannot upgrade repository; requirement missing: %s')
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 % _(b', ').join(sorted(missingreqs))
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: drop the prefix to the 'blocksourcerequirements' function...
r31866 blockedreqs = blocksourcerequirements(repo) & repo.requirements
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if blockedreqs:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'cannot upgrade repository; unsupported source '
b'requirement: %s'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 % _(b', ').join(sorted(blockedreqs))
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# FUTURE there is potentially a need to control the wanted requirements via
# command arguments or via an extension hook point.
Gregory Szorc
localrepo: define storage backend in creation options (API)...
r40032 newreqs = localrepo.newreporequirements(
Augie Fackler
formatting: blacken the codebase...
r43346 repo.ui, localrepo.defaultcreateopts(repo.ui)
)
Boris Feld
upgraderepo: allow extension to register preserved requirements...
r35303 newreqs.update(preservedrequirements(repo))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 noremovereqs = (
repo.requirements - newreqs - supportremovedrequirements(repo)
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if noremovereqs:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(
b'cannot upgrade repository; requirement would be '
b'removed: %s'
)
% _(b', ').join(sorted(noremovereqs))
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Augie Fackler
formatting: blacken the codebase...
r43346 noaddreqs = newreqs - repo.requirements - allowednewrequirements(repo)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if noaddreqs:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'cannot upgrade repository; do not support adding '
b'requirement: %s'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 % _(b', ').join(sorted(noaddreqs))
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: drop the prefix to the 'supporteddestrequirements' function...
r31870 unsupportedreqs = newreqs - supporteddestrequirements(repo)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if unsupportedreqs:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'cannot upgrade repository; do not support '
b'destination requirement: %s'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 % _(b', ').join(sorted(unsupportedreqs))
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
# Find and validate all improvements that can be made.
Pierre-Yves David
upgrade: filter optimizations outside of 'determineactions'...
r31899 alloptimizations = findoptimizations(repo)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: filter optimizations outside of 'determineactions'...
r31899 # Apply and Validate arguments.
optimizations = []
for o in alloptimizations:
if o.name in optimize:
optimizations.append(o)
optimize.discard(o.name)
Augie Fackler
formatting: blacken the codebase...
r43346 if optimize: # anything left is unknown
raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'unknown optimization action requested: %s')
% b', '.join(sorted(optimize)),
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 hint=_(b'run without arguments to see valid optimizations'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: simplify optimisations validation...
r31897 deficiencies = finddeficiencies(repo)
Pierre-Yves David
upgrade: filter optimizations outside of 'determineactions'...
r31899 actions = determineactions(repo, deficiencies, repo.requirements, newreqs)
Augie Fackler
formatting: blacken the codebase...
r43346 actions.extend(
o
for o in sorted(optimizations)
# determineactions could have added optimisation
if o not in actions
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: make sure we reclone all revlogs when updating to some format...
r43100 removedreqs = repo.requirements - newreqs
addedreqs = newreqs - repo.requirements
if revlogs != UPGRADE_ALL_REVLOGS:
incompatible = RECLONES_REQUIREMENTS & (removedreqs | addedreqs)
if incompatible:
Augie Fackler
formatting: blacken the codebase...
r43346 msg = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'ignoring revlogs selection flags, format requirements '
b'change: %s\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.warn(msg % b', '.join(sorted(incompatible)))
upgrade: make sure we reclone all revlogs when updating to some format...
r43100 revlogs = UPGRADE_ALL_REVLOGS
upgrade-repo: colorize some of the output...
r44257 def write_labeled(l, label):
first = True
for r in sorted(l):
if not first:
ui.write(b', ')
ui.write(r, label=label)
first = False
Pierre-Yves David
upgrade: extract code in its own module...
r31864 def printrequirements():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(_(b'requirements\n'))
upgrade-repo: colorize some of the output...
r44257 ui.write(_(b' preserved: '))
write_labeled(
newreqs & repo.requirements, "upgrade-repo.requirement.preserved"
Augie Fackler
formatting: blacken the codebase...
r43346 )
upgrade-repo: colorize some of the output...
r44257 ui.write((b'\n'))
removed = repo.requirements - newreqs
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if repo.requirements - newreqs:
upgrade-repo: colorize some of the output...
r44257 ui.write(_(b' removed: '))
write_labeled(removed, "upgrade-repo.requirement.removed")
ui.write((b'\n'))
added = newreqs - repo.requirements
if added:
ui.write(_(b' added: '))
write_labeled(added, "upgrade-repo.requirement.added")
ui.write((b'\n'))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: clearly list optimisations...
r45301 def printoptimisations():
optimisations = [a for a in actions if a.type == optimisation]
optimisations.sort(key=lambda a: a.name)
if optimisations:
ui.write(_(b'optimisations: '))
write_labeled(
[a.name for a in optimisations],
"upgrade-repo.optimisation.performed",
)
ui.write(b'\n\n')
Pierre-Yves David
upgrade: extract code in its own module...
r31864 def printupgradeactions():
Pierre-Yves David
upgrade: use 'improvement' object for action too...
r31903 for a in actions:
upgrade: support the --quiet flag...
r45302 ui.status(b'%s\n %s\n\n' % (a.name, a.upgrademessage))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
if not run:
fromconfig = []
Pierre-Yves David
upgrade: simplify the "origin" dispatch in dry run...
r31904 onlydefault = []
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: simplify some of the initial dispatch for dry run...
r31901 for d in deficiencies:
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 if d.fromconfig(repo):
Pierre-Yves David
upgrade: simplify some of the initial dispatch for dry run...
r31901 fromconfig.append(d)
Pierre-Yves David
upgrade: move descriptions and selection logic in individual classes...
r32031 elif d.default:
Pierre-Yves David
upgrade: simplify the "origin" dispatch in dry run...
r31904 onlydefault.append(d)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Pierre-Yves David
upgrade: simplify the "origin" dispatch in dry run...
r31904 if fromconfig or onlydefault:
Pierre-Yves David
upgrade: extract code in its own module...
r31864
if fromconfig:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'repository lacks features recommended by '
b'current config options:\n\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 for i in fromconfig:
upgrade: support the --quiet flag...
r45302 ui.status(b'%s\n %s\n\n' % (i.name, i.description))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
if onlydefault:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'repository lacks features used by the default '
b'config options:\n\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 for i in onlydefault:
upgrade: support the --quiet flag...
r45302 ui.status(b'%s\n %s\n\n' % (i.name, i.description))
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(b'\n')
Pierre-Yves David
upgrade: extract code in its own module...
r31864 else:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(
b'(no feature deficiencies found in existing '
b'repository)\n'
)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'performing an upgrade with "--run" will make the following '
b'changes:\n\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
printrequirements()
upgrade: clearly list optimisations...
r45301 printoptimisations()
Pierre-Yves David
upgrade: extract code in its own module...
r31864 printupgradeactions()
Pierre-Yves David
upgrade: use 'improvement' object for action too...
r31903 unusedoptimize = [i for i in alloptimizations if i not in actions]
Pierre-Yves David
upgrade: extract code in its own module...
r31864 if unusedoptimize:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'additional optimizations are available by specifying '
b'"--optimize <name>":\n\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Pierre-Yves David
upgrade: extract code in its own module...
r31864 for i in unusedoptimize:
upgrade: support the --quiet flag...
r45302 ui.status(_(b'%s\n %s\n\n') % (i.name, i.description))
Pierre-Yves David
upgrade: extract code in its own module...
r31864 return
# Else we're in the run=true case.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(_(b'upgrade will perform the following actions:\n\n'))
Pierre-Yves David
upgrade: extract code in its own module...
r31864 printrequirements()
upgrade: clearly list optimisations...
r45301 printoptimisations()
Pierre-Yves David
upgrade: extract code in its own module...
r31864 printupgradeactions()
Pierre-Yves David
upgrade: use 'improvement' object for action too...
r31903 upgradeactions = [a.name for a in actions]
upgrade: support the --quiet flag...
r45302 ui.status(_(b'beginning upgrade...\n'))
Jun Wu
codemod: simplify nested withs...
r33438 with repo.wlock(), repo.lock():
upgrade: support the --quiet flag...
r45302 ui.status(_(b'repository locked and read-only\n'))
Jun Wu
codemod: simplify nested withs...
r33438 # Our strategy for upgrading the repository is to create a new,
# temporary repository, write data to it, then do a swap of the
# data. There are less heavyweight ways to do this, but it is easier
# to create a new repo object than to instantiate all the components
# (like the store) separately.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tmppath = pycompat.mkdtemp(prefix=b'upgrade.', dir=repo.path)
Jun Wu
codemod: simplify nested withs...
r33438 backuppath = None
try:
upgrade: support the --quiet flag...
r45302 ui.status(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'creating temporary repository to stage migrated '
b'data: %s\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% tmppath
)
Boris Feld
upgrade: use the repository 'ui' as the base for the new repository...
r35343
Yuya Nishihara
upgrade: simplify workaround for repo.ui.copy()...
r35380 # clone ui without using ui.copy because repo.ui is protected
repoui = repo.ui.__class__(repo.ui)
dstrepo = hg.repository(repoui, path=tmppath, create=True)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Jun Wu
codemod: simplify nested withs...
r33438 with dstrepo.wlock(), dstrepo.lock():
Augie Fackler
formatting: blacken the codebase...
r43346 backuppath = _upgraderepo(
ui, repo, dstrepo, newreqs, upgradeactions, revlogs=revlogs
)
Boris Feld
debugupgraderepo: add a --no-backup mode...
r41121 if not (backup or backuppath is None):
upgrade: support the --quiet flag...
r45302 ui.status(
_(b'removing old repository content%s\n') % backuppath
)
Boris Feld
debugupgraderepo: add a --no-backup mode...
r41121 repo.vfs.rmtree(backuppath, forcibly=True)
backuppath = None
Pierre-Yves David
upgrade: extract code in its own module...
r31864
Jun Wu
codemod: simplify nested withs...
r33438 finally:
upgrade: support the --quiet flag...
r45302 ui.status(_(b'removing temporary repository %s\n') % tmppath)
Jun Wu
codemod: simplify nested withs...
r33438 repo.vfs.rmtree(tmppath, forcibly=True)
Pierre-Yves David
upgrade: extract code in its own module...
r31864
upgrade: support the --quiet flag...
r45302 if backuppath and not ui.quiet:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'copy of old repository backed up at %s\n') % backuppath
Augie Fackler
formatting: blacken the codebase...
r43346 )
ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'the old repository will not be deleted; remove '
b'it to free up disk space once the upgraded '
b'repository is verified\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)