diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -657,6 +657,9 @@ b'experimental', b'revisions.disambiguatewithin', default=None, ) coreconfigitem( + b'experimental', b'rust.index', default=False, +) +coreconfigitem( b'experimental', b'server.filesdata.recommended-batch-size', default=50000, ) coreconfigitem( diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -927,6 +927,9 @@ if repository.NARROW_REQUIREMENT in requirements: options[b'enableellipsis'] = True + if ui.configbool('experimental', 'rust.index'): + options[b'rust.index'] = True + return options diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -106,6 +106,7 @@ parsers = policy.importmod('parsers') rustancestor = policy.importrust('ancestor') rustdagop = policy.importrust('dagop') +rustrevlog = policy.importrust('revlog') # Aliased for performance. _zlibdecompress = zlib.decompress @@ -351,6 +352,12 @@ return p +class rustrevlogio(revlogio): + def parseindex(self, data, inline): + index, cache = super(rustrevlogio, self).parseindex(data, inline) + return rustrevlog.MixedIndex(index), cache + + class revlog(object): """ the underlying revision storage object @@ -585,6 +592,8 @@ self._storedeltachains = True self._io = revlogio() + if rustrevlog is not None and self.opener.options.get('rust.index'): + self._io = rustrevlogio() if self.version == REVLOGV0: self._io = revlogoldio() try: