diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -599,6 +599,8 @@ chainspan = self.ui.configbytes('experimental', 'maxdeltachainspan', -1) if 0 <= chainspan: self.svfs.options['maxdeltachainspan'] = chainspan + self.svfs.options['mmapindex'] = self.ui.configbool('experimental', + 'mmapindex') for r in self.requirements: if r.startswith('exp-compression-'): diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -19,6 +19,7 @@ import hashlib import os import struct +import sys import zlib # import stuff from node for others to import from revlog @@ -300,6 +301,7 @@ self._nodepos = None self._compengine = 'zlib' self._maxdeltachainspan = -1 + self._mmapindex = False v = REVLOG_DEFAULT_VERSION opts = getattr(opener, 'options', None) @@ -323,6 +325,8 @@ self._compengine = opts['compengine'] if 'maxdeltachainspan' in opts: self._maxdeltachainspan = opts['maxdeltachainspan'] + if sys.version_info >= (2, 7) and 'mmapindex' in opts: + self._mmapindex = opts['mmapindex'] if self._chunkcachesize <= 0: raise RevlogError(_('revlog chunk cache size %r is not greater ' @@ -335,7 +339,10 @@ self._initempty = True try: f = self.opener(self.indexfile) - indexdata = f.read() + if self._mmapindex: + indexdata = util.buffer(util.mmapread(f)) + else: + indexdata = f.read() f.close() if len(indexdata) > 0: v = versionformat_unpack(indexdata[:4])[0]