sidedata: introduce a new requirement to protect the feature
authorPierre-Yves David <pierre-yves.david@octobus.net>
Mon, 09 Sep 2019 22:42:55 +0200
changeset 43030 827cb4fe62a3
parent 43027 041f042afcc5
child 43031 e16ca9fde7aa
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
mercurial/configitems.py
mercurial/localrepo.py
mercurial/revlog.py
--- 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)