Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 51089:9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
This is a necessary step before being able to move more logic around restoring
a revision content there.
For now, we do a simple patch for the perf extension logic, when the
implementation of the inner object changes, we will likely need some evolution
of the API. However this is true of many things in the perf extension. So we
will see this later.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 19 Oct 2023 02:57:05 +0200 |
parents | a82704902db8 |
children | ff673b9da21f |
comparison
equal
deleted
inserted
replaced
51088:a82704902db8 | 51089:9c8df10ea6e0 |
---|---|
716 end += (endrev + 1) * self.index.entry_size | 716 end += (endrev + 1) * self.index.entry_size |
717 length = end - start | 717 length = end - start |
718 | 718 |
719 return start, self._segmentfile.read_chunk(start, length) | 719 return start, self._segmentfile.read_chunk(start, length) |
720 | 720 |
721 def _chunk(self, rev): | |
722 """Obtain a single decompressed chunk for a revision. | |
723 | |
724 Accepts an integer revision and an optional already-open file handle | |
725 to be used for reading. If used, the seek position of the file will not | |
726 be preserved. | |
727 | |
728 Returns a str holding uncompressed data for the requested revision. | |
729 """ | |
730 compression_mode = self.index[rev][10] | |
731 data = self.get_segment_for_revs(rev, rev)[1] | |
732 if compression_mode == COMP_MODE_PLAIN: | |
733 return data | |
734 elif compression_mode == COMP_MODE_DEFAULT: | |
735 return self._decompressor(data) | |
736 elif compression_mode == COMP_MODE_INLINE: | |
737 return self.decompress(data) | |
738 else: | |
739 msg = b'unknown compression mode %d' | |
740 msg %= compression_mode | |
741 raise error.RevlogError(msg) | |
742 | |
721 | 743 |
722 class revlog: | 744 class revlog: |
723 """ | 745 """ |
724 the underlying revision storage object | 746 the underlying revision storage object |
725 | 747 |
2334 returns True if text is different than what is stored. | 2356 returns True if text is different than what is stored. |
2335 """ | 2357 """ |
2336 p1, p2 = self.parents(node) | 2358 p1, p2 = self.parents(node) |
2337 return storageutil.hashrevisionsha1(text, p1, p2) != node | 2359 return storageutil.hashrevisionsha1(text, p1, p2) != node |
2338 | 2360 |
2339 def _chunk(self, rev): | |
2340 """Obtain a single decompressed chunk for a revision. | |
2341 | |
2342 Accepts an integer revision and an optional already-open file handle | |
2343 to be used for reading. If used, the seek position of the file will not | |
2344 be preserved. | |
2345 | |
2346 Returns a str holding uncompressed data for the requested revision. | |
2347 """ | |
2348 compression_mode = self.index[rev][10] | |
2349 data = self._inner.get_segment_for_revs(rev, rev)[1] | |
2350 if compression_mode == COMP_MODE_PLAIN: | |
2351 return data | |
2352 elif compression_mode == COMP_MODE_DEFAULT: | |
2353 return self._inner._decompressor(data) | |
2354 elif compression_mode == COMP_MODE_INLINE: | |
2355 return self._inner.decompress(data) | |
2356 else: | |
2357 msg = b'unknown compression mode %d' | |
2358 msg %= compression_mode | |
2359 raise error.RevlogError(msg) | |
2360 | |
2361 def _chunks(self, revs, targetsize=None): | 2361 def _chunks(self, revs, targetsize=None): |
2362 """Obtain decompressed chunks for the specified revisions. | 2362 """Obtain decompressed chunks for the specified revisions. |
2363 | 2363 |
2364 Accepts an iterable of numeric revisions that are assumed to be in | 2364 Accepts an iterable of numeric revisions that are assumed to be in |
2365 ascending order. Also accepts an optional already-open file handle | 2365 ascending order. Also accepts an optional already-open file handle |
2402 lastrev, | 2402 lastrev, |
2403 ) | 2403 ) |
2404 except OverflowError: | 2404 except OverflowError: |
2405 # issue4215 - we can't cache a run of chunks greater than | 2405 # issue4215 - we can't cache a run of chunks greater than |
2406 # 2G on Windows | 2406 # 2G on Windows |
2407 return [self._chunk(rev) for rev in revschunk] | 2407 return [self._inner._chunk(rev) for rev in revschunk] |
2408 | 2408 |
2409 decomp = self._inner.decompress | 2409 decomp = self._inner.decompress |
2410 # self._decompressor might be None, but will not be used in that case | 2410 # self._decompressor might be None, but will not be used in that case |
2411 def_decomp = self._inner._decompressor | 2411 def_decomp = self._inner._decompressor |
2412 for rev in revschunk: | 2412 for rev in revschunk: |
2482 | 2482 |
2483 The delta calculated is in binary form and is intended to be written to | 2483 The delta calculated is in binary form and is intended to be written to |
2484 revlog data directly. So this function needs raw revision data. | 2484 revlog data directly. So this function needs raw revision data. |
2485 """ | 2485 """ |
2486 if rev1 != nullrev and self.deltaparent(rev2) == rev1: | 2486 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
2487 return bytes(self._chunk(rev2)) | 2487 return bytes(self._inner._chunk(rev2)) |
2488 | 2488 |
2489 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) | 2489 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) |
2490 | 2490 |
2491 def revision(self, nodeorrev): | 2491 def revision(self, nodeorrev): |
2492 """return an uncompressed revision of a given node or revision | 2492 """return an uncompressed revision of a given node or revision |
3679 ) | 3679 ) |
3680 else: | 3680 else: |
3681 if destrevlog.delta_config.lazy_delta: | 3681 if destrevlog.delta_config.lazy_delta: |
3682 dp = self.deltaparent(rev) | 3682 dp = self.deltaparent(rev) |
3683 if dp != nullrev: | 3683 if dp != nullrev: |
3684 cachedelta = (dp, bytes(self._chunk(rev))) | 3684 cachedelta = (dp, bytes(self._inner._chunk(rev))) |
3685 | 3685 |
3686 sidedata = None | 3686 sidedata = None |
3687 if not cachedelta: | 3687 if not cachedelta: |
3688 try: | 3688 try: |
3689 rawtext = self._revisiondata(rev) | 3689 rawtext = self._revisiondata(rev) |