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)