diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -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, diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -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') diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -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)