changeset 43030:827cb4fe62a3

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
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 09 Sep 2019 22:42:55 +0200
parents 041f042afcc5
children e16ca9fde7aa
files mercurial/configitems.py mercurial/localrepo.py mercurial/revlog.py
diffstat 3 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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)