debug-delta-find: add a --source option
This will help us to understand the delta-find operation in different
situations.
--- a/mercurial/debugcommands.py Wed Nov 02 09:34:03 2022 -0400
+++ b/mercurial/debugcommands.py Fri Nov 04 19:38:47 2022 -0400
@@ -59,6 +59,7 @@
localrepo,
lock as lockmod,
logcmdutil,
+ mdiff,
mergestate as mergestatemod,
metadata,
obsolete,
@@ -990,17 +991,29 @@
@command(
b'debug-delta-find',
- cmdutil.debugrevlogopts + cmdutil.formatteropts,
+ cmdutil.debugrevlogopts
+ + cmdutil.formatteropts
+ + [
+ (
+ b'',
+ b'source',
+ b'full',
+ _(b'input data feed to the process (full, storage, p1, p2, prev)'),
+ ),
+ ],
_(b'-c|-m|FILE REV'),
optionalrepo=True,
)
-def debugdeltafind(ui, repo, arg_1, arg_2=None, **opts):
+def debugdeltafind(ui, repo, arg_1, arg_2=None, source=b'full', **opts):
"""display the computation to get to a valid delta for storing REV
This command will replay the process used to find the "best" delta to store
a revision and display information about all the steps used to get to that
result.
+ By default, the process is fed with a the full-text for the revision. This
+ can be controlled with the --source flag.
+
The revision use the revision number of the target storage (not changelog
revision number).
@@ -1028,11 +1041,31 @@
p1r, p2r = revlog.parentrevs(rev)
p1 = revlog.node(p1r)
p2 = revlog.node(p2r)
- btext = [revlog.revision(rev)]
+ full_text = revlog.revision(rev)
+ btext = [full_text]
textlen = len(btext[0])
cachedelta = None
flags = revlog.flags(rev)
+ if source != b'full':
+ if source == b'storage':
+ base_rev = revlog.deltaparent(rev)
+ elif source == b'p1':
+ base_rev = p1r
+ elif source == b'p2':
+ base_rev = p2r
+ elif source == b'prev':
+ base_rev = rev - 1
+ else:
+ raise error.InputError(b"invalid --source value: %s" % source)
+
+ if base_rev != nullrev:
+ base_text = revlog.revision(base_rev)
+ delta = mdiff.textdiff(base_text, full_text)
+
+ cachedelta = (base_rev, delta)
+ btext = [None]
+
revinfo = revlogutils.revisioninfo(
node,
p1,
--- a/tests/test-completion.t Wed Nov 02 09:34:03 2022 -0400
+++ b/tests/test-completion.t Fri Nov 04 19:38:47 2022 -0400
@@ -268,7 +268,7 @@
config: untrusted, exp-all-known, edit, local, source, shared, non-shared, global, template
continue: dry-run
copy: forget, after, at-rev, force, include, exclude, dry-run
- debug-delta-find: changelog, manifest, dir, template
+ debug-delta-find: changelog, manifest, dir, template, source
debug-repair-issue6528: to-report, from-report, paranoid, dry-run
debug-revlog-index: changelog, manifest, dir, template
debugancestor:
--- a/tests/test-sparse-revlog.t Wed Nov 02 09:34:03 2022 -0400
+++ b/tests/test-sparse-revlog.t Fri Nov 04 19:38:47 2022 -0400
@@ -191,4 +191,156 @@
DBG-DELTAS-SEARCH: DELTA: length=49132 (BAD)
DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ cat << EOF >>.hg/hgrc
+ > [storage]
+ > revlog.optimize-delta-parent-choice = no
+ > revlog.reuse-external-delta = yes
+ > EOF
+
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --quiet
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --source full
+ DBG-DELTAS-SEARCH: SEARCH rev=4971
+ DBG-DELTAS-SEARCH: ROUND #1 - 2 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4962
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=18296
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=30377
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=16872 (BAD)
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4971
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=19179
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: TOO-HIGH
+ DBG-DELTAS-SEARCH: ROUND #2 - 1 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4930
+ DBG-DELTAS-SEARCH: type=snapshot-3
+ DBG-DELTAS-SEARCH: size=39228
+ DBG-DELTAS-SEARCH: base=4799
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=33050
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=19179 (GOOD)
+ DBG-DELTAS-SEARCH: ROUND #3 - 1 candidates - refine-down
+ DBG-DELTAS-SEARCH: CONTENDER: rev=4930 - length=19179
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4799
+ DBG-DELTAS-SEARCH: type=snapshot-2
+ DBG-DELTAS-SEARCH: size=50213
+ DBG-DELTAS-SEARCH: base=4623
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=82661
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=49132 (BAD)
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --source storage
+ DBG-DELTAS-SEARCH: SEARCH rev=4971
+ DBG-DELTAS-SEARCH: ROUND #1 - 1 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4930
+ DBG-DELTAS-SEARCH: type=snapshot-3
+ DBG-DELTAS-SEARCH: size=39228
+ DBG-DELTAS-SEARCH: base=4799
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=33050
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=19179 (GOOD)
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=1 try-count=1 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --source p1
+ DBG-DELTAS-SEARCH: SEARCH rev=4971
+ DBG-DELTAS-SEARCH: ROUND #1 - 2 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4962
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=18296
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=30377
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=16872 (BAD)
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4971
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=19179
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: TOO-HIGH
+ DBG-DELTAS-SEARCH: ROUND #2 - 1 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4930
+ DBG-DELTAS-SEARCH: type=snapshot-3
+ DBG-DELTAS-SEARCH: size=39228
+ DBG-DELTAS-SEARCH: base=4799
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=33050
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=19179 (GOOD)
+ DBG-DELTAS-SEARCH: ROUND #3 - 1 candidates - refine-down
+ DBG-DELTAS-SEARCH: CONTENDER: rev=4930 - length=19179
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4799
+ DBG-DELTAS-SEARCH: type=snapshot-2
+ DBG-DELTAS-SEARCH: size=50213
+ DBG-DELTAS-SEARCH: base=4623
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=82661
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=49132 (BAD)
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --source p2
+ DBG-DELTAS-SEARCH: SEARCH rev=4971
+ DBG-DELTAS-SEARCH: ROUND #1 - 2 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4962
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=18296
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=30377
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=16872 (BAD)
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4971
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=19179
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: TOO-HIGH
+ DBG-DELTAS-SEARCH: ROUND #2 - 1 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4930
+ DBG-DELTAS-SEARCH: type=snapshot-3
+ DBG-DELTAS-SEARCH: size=39228
+ DBG-DELTAS-SEARCH: base=4799
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=33050
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=19179 (GOOD)
+ DBG-DELTAS-SEARCH: ROUND #3 - 1 candidates - refine-down
+ DBG-DELTAS-SEARCH: CONTENDER: rev=4930 - length=19179
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4799
+ DBG-DELTAS-SEARCH: type=snapshot-2
+ DBG-DELTAS-SEARCH: size=50213
+ DBG-DELTAS-SEARCH: base=4623
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=82661
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=49132 (BAD)
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+ $ hg debug-delta-find SPARSE-REVLOG-TEST-FILE 4971 --source prev
+ DBG-DELTAS-SEARCH: SEARCH rev=4971
+ DBG-DELTAS-SEARCH: ROUND #1 - 2 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4962
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=18296
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=30377
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=16872 (BAD)
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4971
+ DBG-DELTAS-SEARCH: type=snapshot-4
+ DBG-DELTAS-SEARCH: size=19179
+ DBG-DELTAS-SEARCH: base=4930
+ DBG-DELTAS-SEARCH: TOO-HIGH
+ DBG-DELTAS-SEARCH: ROUND #2 - 1 candidates - search-down
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4930
+ DBG-DELTAS-SEARCH: type=snapshot-3
+ DBG-DELTAS-SEARCH: size=39228
+ DBG-DELTAS-SEARCH: base=4799
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=33050
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=19179 (GOOD)
+ DBG-DELTAS-SEARCH: ROUND #3 - 1 candidates - refine-down
+ DBG-DELTAS-SEARCH: CONTENDER: rev=4930 - length=19179
+ DBG-DELTAS-SEARCH: CANDIDATE: rev=4799
+ DBG-DELTAS-SEARCH: type=snapshot-2
+ DBG-DELTAS-SEARCH: size=50213
+ DBG-DELTAS-SEARCH: base=4623
+ DBG-DELTAS-SEARCH: uncompressed-delta-size=82661
+ DBG-DELTAS-SEARCH: delta-search-time=* (glob)
+ DBG-DELTAS-SEARCH: DELTA: length=49132 (BAD)
+ DBG-DELTAS: FILELOG:SPARSE-REVLOG-TEST-FILE: rev=4971: search-rounds=3 try-count=3 - delta-type=snapshot snap-depth=4 - p1-chain-length=15 p2-chain-length=-1 - duration=* (glob)
+
$ cd ..