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.
indygreg | |
Alphare |
hg-reviewers |
They are multiple motivation to do it:
No Linters Available |
No Unit Test Coverage |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/revlog.py (43 lines) |
Commit | Parents | Author | Summary | Date |
---|---|---|---|---|
dab88088c5c7 | 4187ebba3b86 | Pierre-Yves David | May 3 2021, 6:25 AM |
elif self._chunkcachesize & (self._chunkcachesize - 1): | elif self._chunkcachesize & (self._chunkcachesize - 1): | ||||
raise error.RevlogError( | raise error.RevlogError( | ||||
_(b'revlog chunk cache size %r is not a power of 2') | _(b'revlog chunk cache size %r is not a power of 2') | ||||
% self._chunkcachesize | % self._chunkcachesize | ||||
) | ) | ||||
force_nodemap = opts.get(b'devel-force-nodemap', False) | force_nodemap = opts.get(b'devel-force-nodemap', False) | ||||
return newversionflags, mmapindexthreshold, force_nodemap | 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): | def _loadindex(self): | ||||
newversionflags, mmapindexthreshold, force_nodemap = self._init_opts() | newversionflags, mmapindexthreshold, force_nodemap = self._init_opts() | ||||
if self.postfix is None: | if self.postfix is None: | ||||
index_file = b'%s.i' % self.radix | index_file = b'%s.i' % self.radix | ||||
data_file = b'%s.d' % self.radix | data_file = b'%s.d' % self.radix | ||||
elif self.postfix == b'a': | elif self.postfix == b'a': | ||||
index_file = b'%s.i.a' % self.radix | index_file = b'%s.i.a' % self.radix | ||||
data_file = b'%s.d' % self.radix | data_file = b'%s.d' % self.radix | ||||
else: | else: | ||||
index_file = b'%s.i.%s' % (self.radix, self.postfix) | index_file = b'%s.i.%s' % (self.radix, self.postfix) | ||||
data_file = b'%s.d.%s' % (self.radix, self.postfix) | data_file = b'%s.d.%s' % (self.radix, self.postfix) | ||||
self._indexfile = index_file | self._indexfile = index_file | ||||
self._datafile = data_file | self._datafile = data_file | ||||
indexdata = b'' | indexdata = b'' | ||||
self._initempty = True | self._initempty = True | ||||
try: | indexdata = self._get_data(self._indexfile, mmapindexthreshold) | ||||
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: | if len(indexdata) > 0: | ||||
versionflags = INDEX_HEADER.unpack(indexdata[:4])[0] | versionflags = INDEX_HEADER.unpack(indexdata[:4])[0] | ||||
self._initempty = False | self._initempty = False | ||||
else: | else: | ||||
versionflags = newversionflags | versionflags = newversionflags | ||||
except IOError as inst: | |||||
if inst.errno != errno.ENOENT: | |||||
raise | |||||
versionflags = newversionflags | |||||
flags = self._format_flags = versionflags & ~0xFFFF | flags = self._format_flags = versionflags & ~0xFFFF | ||||
fmt = self._format_version = versionflags & 0xFFFF | fmt = self._format_version = versionflags & 0xFFFF | ||||
if fmt == REVLOGV0: | if fmt == REVLOGV0: | ||||
if flags: | if flags: | ||||
raise error.RevlogError( | raise error.RevlogError( | ||||
_(b'unknown flags (%#04x) in version %d revlog %s') | _(b'unknown flags (%#04x) in version %d revlog %s') |