# HG changeset patch # User Pierre-Yves David # Date 1549032662 -3600 # 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 -r 10a6725dca6e -r d086ba387ae8 mercurial/upgrade.py --- a/mercurial/upgrade.py Wed Mar 27 18:27:03 2019 +0100 +++ b/mercurial/upgrade.py Fri Feb 01 15:51:02 2019 +0100 @@ -24,6 +24,10 @@ vfs as vfsmod, ) +from .utils import ( + compression, +) + def requiredsourcerequirements(repo): """Obtain requirements required to be present to upgrade a repo. @@ -61,9 +65,16 @@ 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 @@ Extensions should monkeypatch this to add their custom requirements. """ - return { + supported = { 'dotencode', 'fncache', 'generaldelta', @@ -81,6 +92,13 @@ '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 @@ 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 -r 10a6725dca6e -r d086ba387ae8 tests/test-upgrade-repo.t --- a/tests/test-upgrade-repo.t Wed Mar 27 18:27:03 2019 +0100 +++ b/tests/test-upgrade-repo.t Fri Feb 01 15:51:02 2019 +0100 @@ -854,4 +854,78 @@ 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