mercurial/debugcommands.py
branchstable
changeset 50317 af776c3d5c3e
parent 50113 dae8dda6f582
child 50421 ed052780ad5e
child 50686 a45460e235a2
--- a/mercurial/debugcommands.py	Mon Mar 20 11:52:17 2023 +0100
+++ b/mercurial/debugcommands.py	Tue Mar 21 15:44:38 2023 +0000
@@ -803,11 +803,12 @@
     # security to avoid crash on corrupted revlogs
     total_revs = len(index)
 
+    chain_size_cache = {}
+
     def revinfo(rev):
         e = index[rev]
         compsize = e[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH]
         uncompsize = e[revlog_constants.ENTRY_DATA_UNCOMPRESSED_LENGTH]
-        chainsize = 0
 
         base = e[revlog_constants.ENTRY_DELTA_BASE]
         p1 = e[revlog_constants.ENTRY_PARENT_1]
@@ -870,11 +871,17 @@
                 deltatype = b'prev'
 
         chain = r._deltachain(rev)[0]
-        for iterrev in chain:
-            e = index[iterrev]
-            chainsize += e[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH]
-
-        return p1, p2, compsize, uncompsize, deltatype, chain, chainsize
+        chain_size = 0
+        for iter_rev in reversed(chain):
+            cached = chain_size_cache.get(iter_rev)
+            if cached is not None:
+                chain_size += cached
+                break
+            e = index[iter_rev]
+            chain_size += e[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH]
+        chain_size_cache[rev] = chain_size
+
+        return p1, p2, compsize, uncompsize, deltatype, chain, chain_size
 
     fm = ui.formatter(b'debugdeltachain', opts)