changeset 51072:810446d2d5ef

debug-delta-chaing: add a parameter to select revision to look at This allows for much faster runtime when we are interrested in some revisions only.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 19 Sep 2023 01:24:10 +0200
parents 793a058f64bd
children 752e380c5702
files mercurial/debugcommands.py mercurial/revlogutils/debug.py tests/test-completion.t
diffstat 3 files changed, 24 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/debugcommands.py	Mon Sep 18 23:37:06 2023 +0200
+++ b/mercurial/debugcommands.py	Tue Sep 19 01:24:10 2023 +0200
@@ -746,7 +746,16 @@
 
 @command(
     b'debugdeltachain',
-    cmdutil.debugrevlogopts + cmdutil.formatteropts,
+    [
+        (
+            b'r',
+            b'rev',
+            [],
+            _('restrict processing to these revlog revisions'),
+        ),
+    ]
+    + cmdutil.debugrevlogopts
+    + cmdutil.formatteropts,
     _(b'-c|-m|FILE'),
     optionalrepo=True,
 )
@@ -797,12 +806,16 @@
 
     The sparse read can be enabled with experimental.sparse-read = True
     """
+    revs = None
+    revs_opt = opts.pop('rev', [])
+    if revs_opt:
+        revs = [int(r) for r in revs_opt]
     revlog = cmdutil.openrevlog(
         repo, b'debugdeltachain', file_, pycompat.byteskwargs(opts)
     )
     fm = ui.formatter(b'debugdeltachain', pycompat.byteskwargs(opts))
 
-    lines = revlog_debug.debug_delta_chain(revlog)
+    lines = revlog_debug.debug_delta_chain(revlog, revs=revs)
     # first entry is the header
     header = next(lines)
     fm.plain(header)
--- a/mercurial/revlogutils/debug.py	Mon Sep 18 23:37:06 2023 +0200
+++ b/mercurial/revlogutils/debug.py	Tue Sep 19 01:24:10 2023 +0200
@@ -801,7 +801,7 @@
         return p1, p2, compsize, uncompsize, deltatype, chain, chain_size
 
 
-def debug_delta_chain(revlog):
+def debug_delta_chain(revlog, revs=None):
     auditor = DeltaChainAuditor(revlog)
     r = revlog
     start = r.start
@@ -818,8 +818,14 @@
     header += b'\n'
     yield header
 
+    if revs is None:
+        all_revs = iter(r)
+    else:
+        revlog_size = len(r)
+        all_revs = sorted(rev for rev in revs if rev < revlog_size)
+
     chainbases = {}
-    for rev in r:
+    for rev in all_revs:
         p1, p2, comp, uncomp, deltatype, chain, chainsize = auditor.revinfo(rev)
         chainbase = chain[0]
         chainid = chainbases.setdefault(chainbase, len(chainbases) + 1)
--- a/tests/test-completion.t	Mon Sep 18 23:37:06 2023 +0200
+++ b/tests/test-completion.t	Tue Sep 19 01:24:10 2023 +0200
@@ -296,7 +296,7 @@
   debugdag: tags, branches, dots, spaces
   debugdata: changelog, manifest, dir
   debugdate: extended
-  debugdeltachain: changelog, manifest, dir, template
+  debugdeltachain: rev, changelog, manifest, dir, template
   debugdirstateignorepatternshash: 
   debugdirstate: nodates, dates, datesort, docket, all
   debugdiscovery: old, nonheads, rev, seed, local-as-revs, remote-as-revs, ssh, remotecmd, insecure, template