--- a/mercurial/debugcommands.py Tue Sep 19 01:24:10 2023 +0200
+++ b/mercurial/debugcommands.py Tue Sep 19 01:53:03 2023 +0200
@@ -753,6 +753,24 @@
[],
_('restrict processing to these revlog revisions'),
),
+ (
+ b'',
+ b'size-info',
+ True,
+ _('compute information related to deltas size'),
+ ),
+ (
+ b'',
+ b'dist-info',
+ True,
+ _('compute information related to base distance'),
+ ),
+ (
+ b'',
+ b'sparse-info',
+ True,
+ _('compute information related to sparse read'),
+ ),
]
+ cmdutil.debugrevlogopts
+ cmdutil.formatteropts,
@@ -767,8 +785,10 @@
:``rev``: revision number
:``p1``: parent 1 revision number (for reference)
:``p2``: parent 2 revision number (for reference)
+
:``chainid``: delta chain identifier (numbered by unique base)
:``chainlen``: delta chain length to this revision
+
:``prevrev``: previous revision in delta chain
:``deltatype``: role of delta / how it was computed
- base: a full snapshot
@@ -781,11 +801,13 @@
(when p2 has empty delta
- prev: a delta against the previous revision
- other: a delta against an arbitrary revision
+
:``compsize``: compressed size of revision
:``uncompsize``: uncompressed size of revision
:``chainsize``: total size of compressed revisions in chain
:``chainratio``: total chain size divided by uncompressed revision size
(new delta chains typically start at ratio 2.00)
+
:``lindist``: linear distance from base revision in delta chain to end
of this revision
:``extradist``: total size of revisions not part of this delta chain from
@@ -804,18 +826,64 @@
:``readdensity``: density of useful bytes in the data read from the disk
:``srchunks``: in how many data hunks the whole revision would be read
+ It is possible to select the information to be computed, this can provide a
+ noticeable speedup to the command in some cases.
+
+ Always computed:
+
+ - ``rev``
+ - ``p1``
+ - ``p2``
+ - ``chainid``
+ - ``chainlen``
+ - ``prevrev``
+ - ``deltatype``
+
+ Computed with --no-size-info
+
+ - ``compsize``
+ - ``uncompsize``
+ - ``chainsize``
+ - ``chainratio``
+
+ Computed with --no-dist-info
+
+ - ``lindist``
+ - ``extradist``
+ - ``extraratio``
+
+ Skipped with --no-sparse-info
+
+ - ``readsize``
+ - ``largestblock``
+ - ``readdensity``
+ - ``srchunks``
+
+ --
+
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]
+
+ size_info = opts.pop('size_info', True)
+ dist_info = opts.pop('dist_info', True)
+ sparse_info = opts.pop('sparse_info', True)
+
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, revs=revs)
+ lines = revlog_debug.debug_delta_chain(
+ revlog,
+ revs=revs,
+ size_info=size_info,
+ dist_info=dist_info,
+ sparse_info=sparse_info,
+ )
# first entry is the header
header = next(lines)
fm.plain(header)
--- a/mercurial/revlogutils/debug.py Tue Sep 19 01:24:10 2023 +0200
+++ b/mercurial/revlogutils/debug.py Tue Sep 19 01:53:03 2023 +0200
@@ -798,10 +798,24 @@
chain_size += e[constants.ENTRY_DATA_COMPRESSED_LENGTH]
self._chain_size_cache[rev] = chain_size
- return p1, p2, compsize, uncompsize, deltatype, chain, chain_size
+ return {
+ 'p1': p1,
+ 'p2': p2,
+ 'compressed_size': compsize,
+ 'uncompressed_size': uncompsize,
+ 'deltatype': deltatype,
+ 'chain': chain,
+ 'chain_size': chain_size,
+ }
-def debug_delta_chain(revlog, revs=None):
+def debug_delta_chain(
+ revlog,
+ revs=None,
+ size_info=True,
+ dist_info=True,
+ sparse_info=True,
+):
auditor = DeltaChainAuditor(revlog)
r = revlog
start = r.start
@@ -809,12 +823,20 @@
withsparseread = revlog.data_config.with_sparse_read
header = (
- b' rev p1 p2 chain# chainlen prev delta '
- b'size rawsize chainsize ratio lindist extradist '
- b'extraratio'
+ b' rev'
+ b' p1'
+ b' p2'
+ b' chain#'
+ b' chainlen'
+ b' prev'
+ b' delta'
)
- if withsparseread:
- header += b' readsize largestblk rddensity srchunks'
+ if size_info:
+ header += b' size' b' rawsize' b' chainsize' b' ratio'
+ if dist_info:
+ header += b' lindist' b' extradist' b' extraratio'
+ if withsparseread and sparse_info:
+ header += b' readsize' b' largestblk' b' rddensity' b' srchunks'
header += b'\n'
yield header
@@ -826,12 +848,16 @@
chainbases = {}
for rev in all_revs:
- p1, p2, comp, uncomp, deltatype, chain, chainsize = auditor.revinfo(rev)
+ info = auditor.revinfo(rev)
+ comp = info['compressed_size']
+ uncomp = info['uncompressed_size']
+ chain = info['chain']
chainbase = chain[0]
chainid = chainbases.setdefault(chainbase, len(chainbases) + 1)
basestart = start(chainbase)
revstart = start(rev)
lineardist = revstart + comp - basestart
+ chainsize = info['chain_size']
extradist = lineardist - chainsize
try:
prevrev = chain[-2]
@@ -851,21 +877,31 @@
# label, display-format, data-key, value
entry = [
(b'rev', b'%7d', 'rev', rev),
- (b'p1', b'%7d', 'p1', p1),
- (b'p2', b'%7d', 'p2', p2),
+ (b'p1', b'%7d', 'p1', info['p1']),
+ (b'p2', b'%7d', 'p2', info['p2']),
(b'chainid', b'%7d', 'chainid', chainid),
(b'chainlen', b'%8d', 'chainlen', len(chain)),
(b'prevrev', b'%8d', 'prevrev', prevrev),
- (b'deltatype', b'%7s', 'deltatype', deltatype),
- (b'compsize', b'%10d', 'compsize', comp),
- (b'uncompsize', b'%10d', 'uncompsize', uncomp),
- (b'chainsize', b'%10d', 'chainsize', chainsize),
- (b'chainratio', b'%9.5f', 'chainratio', chainratio),
- (b'lindist', b'%9d', 'lindist', lineardist),
- (b'extradist', b'%9d', 'extradist', extradist),
- (b'extraratio', b'%10.5f', 'extraratio', extraratio),
+ (b'deltatype', b'%7s', 'deltatype', info['deltatype']),
]
- if withsparseread:
+ if size_info:
+ entry.extend(
+ [
+ (b'compsize', b'%10d', 'compsize', comp),
+ (b'uncompsize', b'%10d', 'uncompsize', uncomp),
+ (b'chainsize', b'%10d', 'chainsize', chainsize),
+ (b'chainratio', b'%9.5f', 'chainratio', chainratio),
+ ]
+ )
+ if dist_info:
+ entry.extend(
+ [
+ (b'lindist', b'%9d', 'lindist', lineardist),
+ (b'extradist', b'%9d', 'extradist', extradist),
+ (b'extraratio', b'%10.5f', 'extraratio', extraratio),
+ ]
+ )
+ if withsparseread and sparse_info:
readsize = 0
largestblock = 0
srchunks = 0
--- a/tests/test-completion.t Tue Sep 19 01:24:10 2023 +0200
+++ b/tests/test-completion.t Tue Sep 19 01:53:03 2023 +0200
@@ -296,7 +296,7 @@
debugdag: tags, branches, dots, spaces
debugdata: changelog, manifest, dir
debugdate: extended
- debugdeltachain: rev, changelog, manifest, dir, template
+ debugdeltachain: rev, size-info, dist-info, sparse-info, 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