Mercurial > hg
comparison mercurial/revlog.py @ 51095:30f458fc59e9
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.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 19 Oct 2023 03:07:39 +0200 |
parents | e8ad6d8de8b8 |
children | 8ec2de9c6770 |
comparison
equal
deleted
inserted
replaced
51094:e8ad6d8de8b8 | 51095:30f458fc59e9 |
---|---|
458 p2 = b | 458 p2 = b |
459 if base == p1 or base == p2: | 459 if base == p1 or base == p2: |
460 return False | 460 return False |
461 return self.issnapshot(base) | 461 return self.issnapshot(base) |
462 | 462 |
463 def _deltachain(self, rev, stoprev=None): | |
464 """Obtain the delta chain for a revision. | |
465 | |
466 ``stoprev`` specifies a revision to stop at. If not specified, we | |
467 stop at the base of the chain. | |
468 | |
469 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of | |
470 revs in ascending order and ``stopped`` is a bool indicating whether | |
471 ``stoprev`` was hit. | |
472 """ | |
473 generaldelta = self.delta_config.general_delta | |
474 # Try C implementation. | |
475 try: | |
476 return self.index.deltachain(rev, stoprev, generaldelta) | |
477 except AttributeError: | |
478 pass | |
479 | |
480 chain = [] | |
481 | |
482 # Alias to prevent attribute lookup in tight loop. | |
483 index = self.index | |
484 | |
485 iterrev = rev | |
486 e = index[iterrev] | |
487 while iterrev != e[3] and iterrev != stoprev: | |
488 chain.append(iterrev) | |
489 if generaldelta: | |
490 iterrev = e[3] | |
491 else: | |
492 iterrev -= 1 | |
493 e = index[iterrev] | |
494 | |
495 if iterrev == stoprev: | |
496 stopped = True | |
497 else: | |
498 chain.append(iterrev) | |
499 stopped = False | |
500 | |
501 chain.reverse() | |
502 return chain, stopped | |
503 | |
463 @util.propertycache | 504 @util.propertycache |
464 def _compressor(self): | 505 def _compressor(self): |
465 engine = util.compengines[self.feature_config.compression_engine] | 506 engine = util.compengines[self.feature_config.compression_engine] |
466 return engine.revlogcompressor( | 507 return engine.revlogcompressor( |
467 self.feature_config.compression_engine_options | 508 self.feature_config.compression_engine_options |
1001 # prevent nesting of addgroup | 1042 # prevent nesting of addgroup |
1002 self._adding_group = None | 1043 self._adding_group = None |
1003 | 1044 |
1004 chunk_cache = self._loadindex() | 1045 chunk_cache = self._loadindex() |
1005 self._load_inner(chunk_cache) | 1046 self._load_inner(chunk_cache) |
1006 | |
1007 self._concurrencychecker = concurrencychecker | 1047 self._concurrencychecker = concurrencychecker |
1008 | 1048 |
1009 @property | 1049 @property |
1010 def _generaldelta(self): | 1050 def _generaldelta(self): |
1011 """temporary compatibility proxy""" | 1051 """temporary compatibility proxy""" |
1821 r = (clen, compresseddeltalen) | 1861 r = (clen, compresseddeltalen) |
1822 chaininfocache[rev] = r | 1862 chaininfocache[rev] = r |
1823 return r | 1863 return r |
1824 | 1864 |
1825 def _deltachain(self, rev, stoprev=None): | 1865 def _deltachain(self, rev, stoprev=None): |
1826 """Obtain the delta chain for a revision. | 1866 return self._inner._deltachain(rev, stoprev=stoprev) |
1827 | |
1828 ``stoprev`` specifies a revision to stop at. If not specified, we | |
1829 stop at the base of the chain. | |
1830 | |
1831 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of | |
1832 revs in ascending order and ``stopped`` is a bool indicating whether | |
1833 ``stoprev`` was hit. | |
1834 """ | |
1835 generaldelta = self.delta_config.general_delta | |
1836 # Try C implementation. | |
1837 try: | |
1838 return self.index.deltachain(rev, stoprev, generaldelta) | |
1839 except AttributeError: | |
1840 pass | |
1841 | |
1842 chain = [] | |
1843 | |
1844 # Alias to prevent attribute lookup in tight loop. | |
1845 index = self.index | |
1846 | |
1847 iterrev = rev | |
1848 e = index[iterrev] | |
1849 while iterrev != e[3] and iterrev != stoprev: | |
1850 chain.append(iterrev) | |
1851 if generaldelta: | |
1852 iterrev = e[3] | |
1853 else: | |
1854 iterrev -= 1 | |
1855 e = index[iterrev] | |
1856 | |
1857 if iterrev == stoprev: | |
1858 stopped = True | |
1859 else: | |
1860 chain.append(iterrev) | |
1861 stopped = False | |
1862 | |
1863 chain.reverse() | |
1864 return chain, stopped | |
1865 | 1867 |
1866 def ancestors(self, revs, stoprev=0, inclusive=False): | 1868 def ancestors(self, revs, stoprev=0, inclusive=False): |
1867 """Generate the ancestors of 'revs' in reverse revision order. | 1869 """Generate the ancestors of 'revs' in reverse revision order. |
1868 Does not generate revs lower than stoprev. | 1870 Does not generate revs lower than stoprev. |
1869 | 1871 |
2494 | 2496 |
2495 def snapshotdepth(self, rev): | 2497 def snapshotdepth(self, rev): |
2496 """number of snapshot in the chain before this one""" | 2498 """number of snapshot in the chain before this one""" |
2497 if not self.issnapshot(rev): | 2499 if not self.issnapshot(rev): |
2498 raise error.ProgrammingError(b'revision %d not a snapshot') | 2500 raise error.ProgrammingError(b'revision %d not a snapshot') |
2499 return len(self._deltachain(rev)[0]) - 1 | 2501 return len(self._inner._deltachain(rev)[0]) - 1 |
2500 | 2502 |
2501 def revdiff(self, rev1, rev2): | 2503 def revdiff(self, rev1, rev2): |
2502 """return or calculate a delta between two revisions | 2504 """return or calculate a delta between two revisions |
2503 | 2505 |
2504 The delta calculated is in binary form and is intended to be written to | 2506 The delta calculated is in binary form and is intended to be written to |
2592 cachedrev = self._revisioncache[1] | 2594 cachedrev = self._revisioncache[1] |
2593 | 2595 |
2594 if rev is None: | 2596 if rev is None: |
2595 rev = self.rev(node) | 2597 rev = self.rev(node) |
2596 | 2598 |
2597 chain, stopped = self._deltachain(rev, stoprev=cachedrev) | 2599 chain, stopped = self._inner._deltachain(rev, stoprev=cachedrev) |
2598 if stopped: | 2600 if stopped: |
2599 basetext = self._revisioncache[2] | 2601 basetext = self._revisioncache[2] |
2600 | 2602 |
2601 # drop cache to save memory, the caller is expected to | 2603 # drop cache to save memory, the caller is expected to |
2602 # update self._revisioncache after validating the text | 2604 # update self._revisioncache after validating the text |