Mercurial > hg
changeset 47169:a13f72b9ccfb
revlog: move index reading logic in a dedicated method
They are multiple motivation to do it:
* The logic is complicated enough to deserver its own method.
* We will need to reuse this once we put a docket in use.
* This split the actual reading from the processing of the read data better.
Differential Revision: https://phab.mercurial-scm.org/D10595
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 12:25:56 +0200 |
parents | cacb08f357ed |
children | 6e0ee1810fbd |
files | mercurial/revlog.py |
diffstat | 1 files changed, 23 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Mon May 03 12:25:45 2021 +0200 +++ b/mercurial/revlog.py Mon May 03 12:25:56 2021 +0200 @@ -446,6 +446,24 @@ force_nodemap = opts.get(b'devel-force-nodemap', False) return newversionflags, mmapindexthreshold, force_nodemap + def _get_data(self, filepath, mmap_threshold): + """return a file content with or without mmap + + If the file is missing return the empty string""" + try: + with self.opener(filepath) as fp: + if mmap_threshold is not None: + file_size = self.opener.fstat(fp).st_size + if file_size >= mmap_threshold: + # TODO: should .close() to release resources without + # relying on Python GC + return util.buffer(util.mmapread(fp)) + return fp.read() + except IOError as inst: + if inst.errno != errno.ENOENT: + raise + return b'' + def _loadindex(self): newversionflags, mmapindexthreshold, force_nodemap = self._init_opts() @@ -465,26 +483,11 @@ indexdata = b'' self._initempty = True - try: - with self._indexfp() as f: - if ( - mmapindexthreshold is not None - and self.opener.fstat(f).st_size >= mmapindexthreshold - ): - # TODO: should .close() to release resources without - # relying on Python GC - indexdata = util.buffer(util.mmapread(f)) - else: - indexdata = f.read() - if len(indexdata) > 0: - versionflags = INDEX_HEADER.unpack(indexdata[:4])[0] - self._initempty = False - else: - versionflags = newversionflags - except IOError as inst: - if inst.errno != errno.ENOENT: - raise - + indexdata = self._get_data(self._indexfile, mmapindexthreshold) + if len(indexdata) > 0: + versionflags = INDEX_HEADER.unpack(indexdata[:4])[0] + self._initempty = False + else: versionflags = newversionflags flags = self._format_flags = versionflags & ~0xFFFF