sidedata: introduce a new requirement to protect the feature
The feature will be usable only within repository supported by version of
Mercurial with the support.
Since the support is not fully implemented yet, the requirement has a temporary,
experimental name.
Differential Revision: https://phab.mercurial-scm.org/D6886
--- a/mercurial/configitems.py Wed Sep 25 03:58:46 2019 +0200
+++ b/mercurial/configitems.py Mon Sep 09 22:42:55 2019 +0200
@@ -733,6 +733,10 @@
coreconfigitem('format', 'usestore',
default=True,
)
+coreconfigitem('format', 'use-side-data',
+ default=False,
+ experimental=True,
+)
coreconfigitem('format', 'internal-phase',
default=False,
experimental=True,
--- a/mercurial/localrepo.py Wed Sep 25 03:58:46 2019 +0200
+++ b/mercurial/localrepo.py Mon Sep 09 22:42:55 2019 +0200
@@ -394,6 +394,10 @@
# This is why once a repository has enabled sparse-read, it becomes required.
SPARSEREVLOG_REQUIREMENT = 'sparserevlog'
+# A repository with the sidedataflag requirement will allow to store extra
+# information for revision without altering their original hashes.
+SIDEDATA_REQUIREMENT = 'exp-sidedata-flag'
+
# Functions receiving (ui, features) that extensions can register to impact
# the ability to load repositories with custom requirements. Only
# functions defined in loaded extensions are called.
@@ -814,6 +818,9 @@
if sparserevlog:
options[b'generaldelta'] = True
+ sidedata = SIDEDATA_REQUIREMENT in requirements
+ options[b'side-data'] = sidedata
+
maxchainlen = None
if sparserevlog:
maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
@@ -917,6 +924,7 @@
'generaldelta',
'treemanifest',
REVLOGV2_REQUIREMENT,
+ SIDEDATA_REQUIREMENT,
SPARSEREVLOG_REQUIREMENT,
bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
}
@@ -3153,6 +3161,10 @@
requirements.add('generaldelta')
if ui.configbool('format', 'sparse-revlog'):
requirements.add(SPARSEREVLOG_REQUIREMENT)
+
+ # experimental config: format.use-side-data
+ if ui.configbool('format', 'use-side-data'):
+ requirements.add(SIDEDATA_REQUIREMENT)
if ui.configbool('experimental', 'treemanifest'):
requirements.add('treemanifest')
--- a/mercurial/revlog.py Wed Sep 25 03:58:46 2019 +0200
+++ b/mercurial/revlog.py Mon Sep 09 22:42:55 2019 +0200
@@ -388,6 +388,7 @@
self._maxdeltachainspan = opts['maxdeltachainspan']
if self._mmaplargeindex and 'mmapindexthreshold' in opts:
mmapindexthreshold = opts['mmapindexthreshold']
+ self.hassidedata = bool(opts.get('side-data', False))
self._sparserevlog = bool(opts.get('sparse-revlog', False))
withsparseread = bool(opts.get('with-sparse-read', False))
# sparse-revlog forces sparse-read
@@ -1849,6 +1850,10 @@
if sidedata is None:
sidedata = {}
+ elif not self.hassidedata:
+ raise error.ProgrammingError(
+ _("trying to add sidedata to a revlog who don't support them")
+ )
if flags:
node = node or self.hash(text, p1, p2)