# HG changeset patch # User Pierre-Yves David # Date 2023-10-19 00:57:05 # Node ID 9c8df10ea6e0fbc2c0c80fb117eabefb48f6e360 # Parent a82704902db88245d19043f7944bace0fffdc4bc 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. diff --git a/contrib/perf.py b/contrib/perf.py --- a/contrib/perf.py +++ b/contrib/perf.py @@ -3810,13 +3810,15 @@ def perfrevlogchunks(ui, repo, file_=Non def dochunk(): rl.clearcaches() + # chunk used to be available directly on the revlog + _chunk = getattr(rl, '_inner', rl)._chunk with reading(rl) as fh: if fh is not None: for rev in revs: - rl._chunk(rev, df=fh) + _chunk(rev, df=fh) else: for rev in revs: - rl._chunk(rev) + _chunk(rev) chunks = [None] diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -718,6 +718,28 @@ class _InnerRevlog: return start, self._segmentfile.read_chunk(start, length) + def _chunk(self, rev): + """Obtain a single decompressed chunk for a revision. + + Accepts an integer revision and an optional already-open file handle + to be used for reading. If used, the seek position of the file will not + be preserved. + + Returns a str holding uncompressed data for the requested revision. + """ + compression_mode = self.index[rev][10] + data = self.get_segment_for_revs(rev, rev)[1] + if compression_mode == COMP_MODE_PLAIN: + return data + elif compression_mode == COMP_MODE_DEFAULT: + return self._decompressor(data) + elif compression_mode == COMP_MODE_INLINE: + return self.decompress(data) + else: + msg = b'unknown compression mode %d' + msg %= compression_mode + raise error.RevlogError(msg) + class revlog: """ @@ -2336,28 +2358,6 @@ class revlog: p1, p2 = self.parents(node) return storageutil.hashrevisionsha1(text, p1, p2) != node - def _chunk(self, rev): - """Obtain a single decompressed chunk for a revision. - - Accepts an integer revision and an optional already-open file handle - to be used for reading. If used, the seek position of the file will not - be preserved. - - Returns a str holding uncompressed data for the requested revision. - """ - compression_mode = self.index[rev][10] - data = self._inner.get_segment_for_revs(rev, rev)[1] - if compression_mode == COMP_MODE_PLAIN: - return data - elif compression_mode == COMP_MODE_DEFAULT: - return self._inner._decompressor(data) - elif compression_mode == COMP_MODE_INLINE: - return self._inner.decompress(data) - else: - msg = b'unknown compression mode %d' - msg %= compression_mode - raise error.RevlogError(msg) - def _chunks(self, revs, targetsize=None): """Obtain decompressed chunks for the specified revisions. @@ -2404,7 +2404,7 @@ class revlog: except OverflowError: # issue4215 - we can't cache a run of chunks greater than # 2G on Windows - return [self._chunk(rev) for rev in revschunk] + return [self._inner._chunk(rev) for rev in revschunk] decomp = self._inner.decompress # self._decompressor might be None, but will not be used in that case @@ -2484,7 +2484,7 @@ class revlog: revlog data directly. So this function needs raw revision data. """ if rev1 != nullrev and self.deltaparent(rev2) == rev1: - return bytes(self._chunk(rev2)) + return bytes(self._inner._chunk(rev2)) return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) @@ -3681,7 +3681,7 @@ class revlog: if destrevlog.delta_config.lazy_delta: dp = self.deltaparent(rev) if dp != nullrev: - cachedelta = (dp, bytes(self._chunk(rev))) + cachedelta = (dp, bytes(self._inner._chunk(rev))) sidedata = None if not cachedelta: diff --git a/mercurial/revlogutils/rewrite.py b/mercurial/revlogutils/rewrite.py --- a/mercurial/revlogutils/rewrite.py +++ b/mercurial/revlogutils/rewrite.py @@ -109,7 +109,7 @@ def v1_censor(rl, tr, censornode, tombst b'revision having delta stored' ) raise error.Abort(m) - rawtext = rl._chunk(rev) + rawtext = rl._inner._chunk(rev) else: rawtext = rl.rawdata(rev)