# HG changeset patch # User Pierre-Yves David # Date 1697677659 -7200 # Node ID 30f458fc59e9bdc40a720f6c7a1e81cfdb92a154 # Parent e8ad6d8de8b84acc5c199a77d15f95d68f1e71e0 revlog: move the `deltachain` 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 -r e8ad6d8de8b8 -r 30f458fc59e9 mercurial/revlog.py --- a/mercurial/revlog.py Thu Oct 19 03:00:58 2023 +0200 +++ b/mercurial/revlog.py Thu Oct 19 03:07:39 2023 +0200 @@ -460,6 +460,47 @@ return False return self.issnapshot(base) + def _deltachain(self, rev, stoprev=None): + """Obtain the delta chain for a revision. + + ``stoprev`` specifies a revision to stop at. If not specified, we + stop at the base of the chain. + + Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of + revs in ascending order and ``stopped`` is a bool indicating whether + ``stoprev`` was hit. + """ + generaldelta = self.delta_config.general_delta + # Try C implementation. + try: + return self.index.deltachain(rev, stoprev, generaldelta) + except AttributeError: + pass + + chain = [] + + # Alias to prevent attribute lookup in tight loop. + index = self.index + + iterrev = rev + e = index[iterrev] + while iterrev != e[3] and iterrev != stoprev: + chain.append(iterrev) + if generaldelta: + iterrev = e[3] + else: + iterrev -= 1 + e = index[iterrev] + + if iterrev == stoprev: + stopped = True + else: + chain.append(iterrev) + stopped = False + + chain.reverse() + return chain, stopped + @util.propertycache def _compressor(self): engine = util.compengines[self.feature_config.compression_engine] @@ -1003,7 +1044,6 @@ chunk_cache = self._loadindex() self._load_inner(chunk_cache) - self._concurrencychecker = concurrencychecker @property @@ -1823,45 +1863,7 @@ return r def _deltachain(self, rev, stoprev=None): - """Obtain the delta chain for a revision. - - ``stoprev`` specifies a revision to stop at. If not specified, we - stop at the base of the chain. - - Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of - revs in ascending order and ``stopped`` is a bool indicating whether - ``stoprev`` was hit. - """ - generaldelta = self.delta_config.general_delta - # Try C implementation. - try: - return self.index.deltachain(rev, stoprev, generaldelta) - except AttributeError: - pass - - chain = [] - - # Alias to prevent attribute lookup in tight loop. - index = self.index - - iterrev = rev - e = index[iterrev] - while iterrev != e[3] and iterrev != stoprev: - chain.append(iterrev) - if generaldelta: - iterrev = e[3] - else: - iterrev -= 1 - e = index[iterrev] - - if iterrev == stoprev: - stopped = True - else: - chain.append(iterrev) - stopped = False - - chain.reverse() - return chain, stopped + return self._inner._deltachain(rev, stoprev=stoprev) def ancestors(self, revs, stoprev=0, inclusive=False): """Generate the ancestors of 'revs' in reverse revision order. @@ -2496,7 +2498,7 @@ """number of snapshot in the chain before this one""" if not self.issnapshot(rev): raise error.ProgrammingError(b'revision %d not a snapshot') - return len(self._deltachain(rev)[0]) - 1 + return len(self._inner._deltachain(rev)[0]) - 1 def revdiff(self, rev1, rev2): """return or calculate a delta between two revisions @@ -2594,7 +2596,7 @@ if rev is None: rev = self.rev(node) - chain, stopped = self._deltachain(rev, stoprev=cachedrev) + chain, stopped = self._inner._deltachain(rev, stoprev=cachedrev) if stopped: basetext = self._revisioncache[2]