revlogv2: allow upgrading to v2
Revlogv2 implies sidedata.
Right now sidedata is not really used in production, and Revlogv2 will be used
for the first production-ready version of sidedata support.
Differential Revision: https://phab.mercurial-scm.org/D9844
--- a/mercurial/configitems.py Thu Jan 28 15:28:57 2021 +0100
+++ b/mercurial/configitems.py Wed Jan 20 21:14:06 2021 +0100
@@ -1299,6 +1299,12 @@
)
coreconfigitem(
b'format',
+ b'exp-revlogv2.2',
+ default=False,
+ experimental=True,
+)
+coreconfigitem(
+ b'format',
b'exp-use-copies-side-data-changeset',
default=False,
experimental=True,
--- a/mercurial/localrepo.py Thu Jan 28 15:28:57 2021 +0100
+++ b/mercurial/localrepo.py Wed Jan 20 21:14:06 2021 +0100
@@ -3447,9 +3447,13 @@
# experimental config: format.exp-use-side-data
if ui.configbool(b'format', b'exp-use-side-data'):
+ requirements.discard(requirementsmod.REVLOGV1_REQUIREMENT)
+ requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
# experimental config: format.exp-use-copies-side-data-changeset
if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
+ requirements.discard(requirementsmod.REVLOGV1_REQUIREMENT)
+ requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
if ui.configbool(b'experimental', b'treemanifest'):
@@ -3457,7 +3461,7 @@
revlogv2 = ui.config(b'experimental', b'revlogv2')
if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
- requirements.remove(requirementsmod.REVLOGV1_REQUIREMENT)
+ requirements.discard(requirementsmod.REVLOGV1_REQUIREMENT)
# generaldelta is implied by revlogv2.
requirements.discard(requirementsmod.GENERALDELTA_REQUIREMENT)
requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
--- a/mercurial/upgrade_utils/actions.py Thu Jan 28 15:28:57 2021 +0100
+++ b/mercurial/upgrade_utils/actions.py Wed Jan 20 21:14:06 2021 +0100
@@ -328,7 +328,7 @@
class sidedata(requirementformatvariant):
name = b'sidedata'
- _requirement = requirements.SIDEDATA_REQUIREMENT
+ _requirement = requirements.REVLOGV2_REQUIREMENT
default = False
@@ -339,6 +339,11 @@
upgrademessage = _(b'Allows storage of extra data alongside a revision.')
+ @classmethod
+ def fromrepo(cls, repo):
+ assert cls._requirement is not None
+ return cls._requirement in repo.requirements
+
@registerformatvariant
class persistentnodemap(requirementformatvariant):
@@ -371,6 +376,15 @@
@registerformatvariant
+class revlogv2(requirementformatvariant):
+ name = b'revlog-v2'
+ _requirement = requirements.REVLOGV2_REQUIREMENT
+ default = False
+ description = _(b'Version 2 of the revlog.')
+ upgrademessage = _(b'very experimental')
+
+
+@registerformatvariant
class removecldeltachain(formatvariant):
name = b'plain-cl-delta'
@@ -857,8 +871,6 @@
"""
return {
# Introduced in Mercurial 0.9.2.
- requirements.REVLOGV1_REQUIREMENT,
- # Introduced in Mercurial 0.9.2.
requirements.STORE_REQUIREMENT,
}
@@ -881,9 +893,21 @@
}
+def check_revlog_version(reqs):
+ """Check that the requirements contain at least one Revlog version"""
+ all_revlogs = {
+ requirements.REVLOGV1_REQUIREMENT,
+ requirements.REVLOGV2_REQUIREMENT,
+ }
+ if not all_revlogs.intersection(reqs):
+ msg = _(b'cannot upgrade repository; missing a revlog version')
+ raise error.Abort(msg)
+
+
def check_source_requirements(repo):
"""Ensure that no existing requirements prevent the repository upgrade"""
+ check_revlog_version(repo.requirements)
required = requiredsourcerequirements(repo)
missingreqs = required - repo.requirements
if missingreqs:
@@ -915,6 +939,8 @@
requirements.COPIESSDC_REQUIREMENT,
requirements.NODEMAP_REQUIREMENT,
requirements.SHARESAFE_REQUIREMENT,
+ requirements.REVLOGV2_REQUIREMENT,
+ requirements.REVLOGV1_REQUIREMENT,
}
for name in compression.compengines:
engine = compression.compengines[name]
@@ -937,13 +963,14 @@
requirements.DOTENCODE_REQUIREMENT,
requirements.FNCACHE_REQUIREMENT,
requirements.GENERALDELTA_REQUIREMENT,
- requirements.REVLOGV1_REQUIREMENT,
+ requirements.REVLOGV1_REQUIREMENT, # allowed in case of downgrade
requirements.STORE_REQUIREMENT,
requirements.SPARSEREVLOG_REQUIREMENT,
requirements.SIDEDATA_REQUIREMENT,
requirements.COPIESSDC_REQUIREMENT,
requirements.NODEMAP_REQUIREMENT,
requirements.SHARESAFE_REQUIREMENT,
+ requirements.REVLOGV2_REQUIREMENT,
}
for name in compression.compengines:
engine = compression.compengines[name]
@@ -973,6 +1000,8 @@
requirements.COPIESSDC_REQUIREMENT,
requirements.NODEMAP_REQUIREMENT,
requirements.SHARESAFE_REQUIREMENT,
+ requirements.REVLOGV1_REQUIREMENT,
+ requirements.REVLOGV2_REQUIREMENT,
}
for name in compression.compengines:
engine = compression.compengines[name]
@@ -985,7 +1014,7 @@
def check_requirements_changes(repo, new_reqs):
old_reqs = repo.requirements
-
+ check_revlog_version(repo.requirements)
support_removal = supportremovedrequirements(repo)
no_remove_reqs = old_reqs - new_reqs - support_removal
if no_remove_reqs:
--- a/tests/test-copies-chain-merge.t Thu Jan 28 15:28:57 2021 +0100
+++ b/tests/test-copies-chain-merge.t Wed Jan 20 21:14:06 2021 +0100
@@ -1469,6 +1469,7 @@
sidedata: no yes no
persistent-nodemap: no no no
copies-sdc: no yes no
+ revlog-v2: no yes no
plain-cl-delta: yes yes yes
compression: * (glob)
compression-level: default default default
@@ -1477,7 +1478,8 @@
requirements
preserved: * (glob)
- added: exp-copies-sidedata-changeset, exp-sidedata-flag
+ removed: revlogv1
+ added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
processed revlogs:
- all-filelogs
@@ -1507,6 +1509,7 @@
sidedata: no yes no
persistent-nodemap: no no no
copies-sdc: no yes no
+ revlog-v2: no yes no
plain-cl-delta: yes yes yes
compression: * (glob)
compression-level: default default default
@@ -1515,7 +1518,8 @@
requirements
preserved: * (glob)
- added: exp-copies-sidedata-changeset, exp-sidedata-flag
+ removed: revlogv1
+ added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
processed revlogs:
- all-filelogs
--- a/tests/test-copies-in-changeset.t Thu Jan 28 15:28:57 2021 +0100
+++ b/tests/test-copies-in-changeset.t Wed Jan 20 21:14:06 2021 +0100
@@ -42,6 +42,7 @@
sidedata: yes yes no
persistent-nodemap: no no no
copies-sdc: yes yes no
+ revlog-v2: yes yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -56,6 +57,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -427,6 +429,7 @@
sidedata: yes yes no
persistent-nodemap: no no no
copies-sdc: yes yes no
+ revlog-v2: yes yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -453,6 +456,7 @@
sidedata: yes yes no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: yes yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -481,6 +485,7 @@
sidedata: yes yes no
persistent-nodemap: no no no
copies-sdc: yes yes no
+ revlog-v2: yes yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
--- a/tests/test-persistent-nodemap.t Thu Jan 28 15:28:57 2021 +0100
+++ b/tests/test-persistent-nodemap.t Wed Jan 20 21:14:06 2021 +0100
@@ -59,6 +59,7 @@
sidedata: no
persistent-nodemap: yes
copies-sdc: no
+ revlog-v2: no
plain-cl-delta: yes
compression: zlib
compression-level: default
@@ -578,6 +579,7 @@
sidedata: no no no
persistent-nodemap: yes no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -623,6 +625,7 @@
sidedata: no no no
persistent-nodemap: no yes no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
--- a/tests/test-sidedata.t Thu Jan 28 15:28:57 2021 +0100
+++ b/tests/test-sidedata.t Wed Jan 20 21:14:06 2021 +0100
@@ -59,6 +59,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -72,6 +73,7 @@
sidedata: no yes no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -91,6 +93,7 @@
sidedata: yes no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: yes no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -104,6 +107,7 @@
sidedata: yes no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: yes no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
--- a/tests/test-upgrade-repo.t Thu Jan 28 15:28:57 2021 +0100
+++ b/tests/test-upgrade-repo.t Wed Jan 20 21:14:06 2021 +0100
@@ -21,7 +21,7 @@
> EOF
$ hg -R no-revlogv1 debugupgraderepo
- abort: cannot upgrade repository; requirement missing: revlogv1
+ abort: cannot upgrade repository; missing a revlog version
[255]
Cannot upgrade shared repositories
@@ -61,6 +61,7 @@
sidedata: no
persistent-nodemap: no
copies-sdc: no
+ revlog-v2: no
plain-cl-delta: yes
compression: zlib
compression-level: default
@@ -74,6 +75,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -87,6 +89,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -100,6 +103,7 @@
[formatvariant.name.uptodate|sidedata: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|persistent-nodemap:][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|copies-sdc: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
+ [formatvariant.name.uptodate|revlog-v2: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|plain-cl-delta: ][formatvariant.repo.uptodate| yes][formatvariant.config.default| yes][formatvariant.default| yes]
[formatvariant.name.uptodate|compression: ][formatvariant.repo.uptodate| zlib][formatvariant.config.default| zlib][formatvariant.default| zlib]
[formatvariant.name.uptodate|compression-level: ][formatvariant.repo.uptodate| default][formatvariant.config.default| default][formatvariant.default| default]
@@ -154,6 +158,12 @@
"repo": false
},
{
+ "config": false,
+ "default": false,
+ "name": "revlog-v2",
+ "repo": false
+ },
+ {
"config": true,
"default": true,
"name": "plain-cl-delta",
@@ -306,6 +316,7 @@
sidedata: no
persistent-nodemap: no
copies-sdc: no
+ revlog-v2: no
plain-cl-delta: yes
compression: zlib
compression-level: default
@@ -319,6 +330,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -332,6 +344,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -345,6 +358,7 @@
[formatvariant.name.uptodate|sidedata: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|persistent-nodemap:][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|copies-sdc: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
+ [formatvariant.name.uptodate|revlog-v2: ][formatvariant.repo.uptodate| no][formatvariant.config.default| no][formatvariant.default| no]
[formatvariant.name.uptodate|plain-cl-delta: ][formatvariant.repo.uptodate| yes][formatvariant.config.default| yes][formatvariant.default| yes]
[formatvariant.name.uptodate|compression: ][formatvariant.repo.uptodate| zlib][formatvariant.config.default| zlib][formatvariant.default| zlib]
[formatvariant.name.uptodate|compression-level: ][formatvariant.repo.uptodate| default][formatvariant.config.default| default][formatvariant.default| default]
@@ -1288,6 +1302,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zstd zlib zlib
compression-level: default default default
@@ -1324,6 +1339,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib
compression-level: default default default
@@ -1363,6 +1379,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zstd zstd zlib
compression-level: default default default
@@ -1386,10 +1403,11 @@
upgrade will perform the following actions:
requirements
- preserved: dotencode, fncache, generaldelta, revlogv1, store (no-zstd !)
- preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, revlogv1, sparserevlog, store (zstd !)
- added: exp-sidedata-flag (zstd !)
- added: exp-sidedata-flag, sparserevlog (no-zstd !)
+ preserved: dotencode, fncache, generaldelta, store (no-zstd !)
+ preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, sparserevlog, store (zstd !)
+ removed: revlogv1
+ added: exp-revlogv2.2, exp-sidedata-flag (zstd !)
+ added: exp-revlogv2.2, exp-sidedata-flag, sparserevlog (no-zstd !)
processed revlogs:
- all-filelogs
@@ -1406,17 +1424,18 @@
sidedata: yes no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: yes no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib (no-zstd !)
compression: zstd zstd zlib (zstd !)
compression-level: default default default
$ cat .hg/requires
dotencode
+ exp-revlogv2.2
exp-sidedata-flag
fncache
generaldelta
revlog-compression-zstd (zstd !)
- revlogv1
sparserevlog
store
$ hg debugsidedata -c 0
@@ -1430,9 +1449,10 @@
upgrade will perform the following actions:
requirements
- preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store (no-zstd !)
- preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, revlogv1, sparserevlog, store (zstd !)
- removed: exp-sidedata-flag
+ preserved: dotencode, fncache, generaldelta, sparserevlog, store (no-zstd !)
+ preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, sparserevlog, store (zstd !)
+ removed: exp-revlogv2.2, exp-sidedata-flag
+ added: revlogv1
processed revlogs:
- all-filelogs
@@ -1449,6 +1469,7 @@
sidedata: no no no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: no no no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib (no-zstd !)
compression: zstd zstd zlib (zstd !)
@@ -1473,9 +1494,10 @@
upgrade will perform the following actions:
requirements
- preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store (no-zstd !)
- preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, revlogv1, sparserevlog, store (zstd !)
- added: exp-sidedata-flag
+ preserved: dotencode, fncache, generaldelta, sparserevlog, store (no-zstd !)
+ preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, sparserevlog, store (zstd !)
+ removed: revlogv1
+ added: exp-revlogv2.2, exp-sidedata-flag
processed revlogs:
- all-filelogs
@@ -1492,17 +1514,18 @@
sidedata: yes yes no
persistent-nodemap: no no no
copies-sdc: no no no
+ revlog-v2: yes yes no
plain-cl-delta: yes yes yes
compression: zlib zlib zlib (no-zstd !)
compression: zstd zstd zlib (zstd !)
compression-level: default default default
$ cat .hg/requires
dotencode
+ exp-revlogv2.2
exp-sidedata-flag
fncache
generaldelta
revlog-compression-zstd (zstd !)
- revlogv1
sparserevlog
store
$ hg debugsidedata -c 0