Mercurial > hg
comparison mercurial/revlog.py @ 47387:75e1104f23a2
revlog: use dedicated code for reading sidedata
We are about to introduce a new, dedicated, file to store sidedata. Before doing so, we make sidedata reading go through different code as reading data chunk. This will simplify some of the complexity of the next changesets.
The reading is very simple right now and will need some improvement later to
reuse some of the caching strategy we use for the data file.
Differential Revision: https://phab.mercurial-scm.org/D10785
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 27 May 2021 04:09:30 +0200 |
parents | 0d0fb091c49f |
children | e6292eb33384 |
comparison
equal
deleted
inserted
replaced
47386:0d0fb091c49f | 47387:75e1104f23a2 |
---|---|
800 func = self._indexfp | 800 func = self._indexfp |
801 else: | 801 else: |
802 func = self._datafp | 802 func = self._datafp |
803 with func() as fp: | 803 with func() as fp: |
804 yield fp | 804 yield fp |
805 | |
806 def _sidedatareadfp(self): | |
807 """file object suitable to read sidedata""" | |
808 return self._datareadfp() | |
805 | 809 |
806 def tiprev(self): | 810 def tiprev(self): |
807 return len(self.index) - 1 | 811 return len(self.index) - 1 |
808 | 812 |
809 def tip(self): | 813 def tip(self): |
2066 if self._inline: | 2070 if self._inline: |
2067 sidedata_offset += self.index.entry_size * (1 + rev) | 2071 sidedata_offset += self.index.entry_size * (1 + rev) |
2068 if sidedata_size == 0: | 2072 if sidedata_size == 0: |
2069 return {} | 2073 return {} |
2070 | 2074 |
2071 comp_segment = self._getsegment(sidedata_offset, sidedata_size) | 2075 # XXX this need caching, as we do for data |
2076 with self._sidedatareadfp() as sdf: | |
2077 sdf.seek(sidedata_offset) | |
2078 comp_segment = sdf.read(sidedata_size) | |
2079 | |
2080 if len(comp_segment) < sidedata_size: | |
2081 filename = self._datafile | |
2082 length = sidedata_size | |
2083 offset = sidedata_offset | |
2084 got = len(comp_segment) | |
2085 m = PARTIAL_READ_MSG % (filename, length, offset, got) | |
2086 raise error.RevlogError(m) | |
2087 | |
2072 comp = self.index[rev][11] | 2088 comp = self.index[rev][11] |
2073 if comp == COMP_MODE_PLAIN: | 2089 if comp == COMP_MODE_PLAIN: |
2074 segment = comp_segment | 2090 segment = comp_segment |
2075 elif comp == COMP_MODE_DEFAULT: | 2091 elif comp == COMP_MODE_DEFAULT: |
2076 segment = self._decompressor(comp_segment) | 2092 segment = self._decompressor(comp_segment) |