# HG changeset patch # User Pierre-Yves David # Date 2019-02-01 14:51:02 # Node ID d086ba387ae8265b073f16421791380bd6686568 # Parent 10a6725dca6e344cb6f9e1b8cd30972ba4b3e4f7 upgrade: support upgrade to/from zstd storage (issue6088) Now that we have an official config option for a shiny format improvement, we better make it simple to migrate to/from it. diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py --- a/mercurial/upgrade.py +++ b/mercurial/upgrade.py @@ -24,6 +24,10 @@ from . import ( vfs as vfsmod, ) +from .utils import ( + compression, +) + def requiredsourcerequirements(repo): """Obtain requirements required to be present to upgrade a repo. @@ -61,9 +65,16 @@ def supportremovedrequirements(repo): the dropped requirement must appear in the returned set for the upgrade to be allowed. """ - return { + supported = { localrepo.SPARSEREVLOG_REQUIREMENT, } + for name in compression.compengines: + engine = compression.compengines[name] + if engine.available() and engine.revlogheader(): + supported.add(b'exp-compression-%s' % name) + if engine.name() == 'zstd': + supported.add(b'revlog-compression-zstd') + return supported def supporteddestrequirements(repo): """Obtain requirements that upgrade supports in the destination. @@ -73,7 +84,7 @@ def supporteddestrequirements(repo): Extensions should monkeypatch this to add their custom requirements. """ - return { + supported = { 'dotencode', 'fncache', 'generaldelta', @@ -81,6 +92,13 @@ def supporteddestrequirements(repo): 'store', localrepo.SPARSEREVLOG_REQUIREMENT, } + for name in compression.compengines: + engine = compression.compengines[name] + if engine.available() and engine.revlogheader(): + supported.add(b'exp-compression-%s' % name) + if engine.name() == 'zstd': + supported.add(b'revlog-compression-zstd') + return supported def allowednewrequirements(repo): """Obtain requirements that can be added to a repository during upgrade. @@ -92,12 +110,19 @@ def allowednewrequirements(repo): bad additions because the whitelist approach is safer and will prevent future, unknown requirements from accidentally being added. """ - return { + supported = { 'dotencode', 'fncache', 'generaldelta', localrepo.SPARSEREVLOG_REQUIREMENT, } + for name in compression.compengines: + engine = compression.compengines[name] + if engine.available() and engine.revlogheader(): + supported.add(b'exp-compression-%s' % name) + if engine.name() == 'zstd': + supported.add(b'revlog-compression-zstd') + return supported def preservedrequirements(repo): return set() diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t --- a/tests/test-upgrade-repo.t +++ b/tests/test-upgrade-repo.t @@ -854,4 +854,78 @@ Check that we can remove the sparse-revl generaldelta revlogv1 store + +#if zstd + +Check upgrading to a zstd revlog +-------------------------------- + +upgrade + + $ hg --config format.revlog-compression=zstd debugupgraderepo --run --no-backup >/dev/null + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + plain-cl-delta: yes yes yes + compression: zstd zlib zlib + compression-level: default default default + $ cat .hg/requires + dotencode + fncache + generaldelta + revlog-compression-zstd + revlogv1 + sparserevlog + store + +downgrade + + $ hg debugupgraderepo --run --no-backup > /dev/null + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + plain-cl-delta: yes yes yes + compression: zlib zlib zlib + compression-level: default default default + $ cat .hg/requires + dotencode + fncache + generaldelta + revlogv1 + sparserevlog + store + +upgrade from hgrc + + $ cat >> .hg/hgrc << EOF + > [format] + > revlog-compression=zstd + > EOF + $ hg debugupgraderepo --run --no-backup > /dev/null + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + plain-cl-delta: yes yes yes + compression: zstd zstd zlib + compression-level: default default default + $ cat .hg/requires + dotencode + fncache + generaldelta + revlog-compression-zstd + revlogv1 + sparserevlog + store + $ cd .. + +#endif