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 |