Show More
@@ -0,0 +1,77 b'' | |||
|
1 | Force revlog max inline value to be smaller than default | |
|
2 | ||
|
3 | $ mkdir $TESTTMP/ext | |
|
4 | $ cat << EOF > $TESTTMP/ext/small_inline.py | |
|
5 | > from mercurial import revlog | |
|
6 | > revlog._maxinline = 8 | |
|
7 | > EOF | |
|
8 | ||
|
9 | $ cat << EOF >> $HGRCPATH | |
|
10 | > [extensions] | |
|
11 | > small_inline=$TESTTMP/ext/small_inline.py | |
|
12 | > EOF | |
|
13 | ||
|
14 | $ hg init repo | |
|
15 | $ cd repo | |
|
16 | ||
|
17 | Try on an empty repository | |
|
18 | ||
|
19 | $ hg debug-revlog-stats | |
|
20 | rev-count data-size inl type target | |
|
21 | 0 0 yes changelog | |
|
22 | 0 0 yes manifest | |
|
23 | ||
|
24 | $ mkdir folder | |
|
25 | $ touch a b folder/c folder/d | |
|
26 | $ hg commit -Aqm 0 | |
|
27 | $ echo "text" > a | |
|
28 | $ hg rm b | |
|
29 | $ echo "longer string" > folder/d | |
|
30 | $ hg commit -Aqm 1 | |
|
31 | ||
|
32 | Differences in data size observed with pure is due to different compression | |
|
33 | algorithms | |
|
34 | ||
|
35 | $ hg debug-revlog-stats | |
|
36 | rev-count data-size inl type target | |
|
37 | 2 138 no changelog (no-pure !) | |
|
38 | 2 137 no changelog (pure !) | |
|
39 | 2 177 no manifest (no-pure !) | |
|
40 | 2 168 no manifest (pure !) | |
|
41 | 2 6 yes file a | |
|
42 | 1 0 yes file b | |
|
43 | 1 0 yes file folder/c | |
|
44 | 2 15 no file folder/d | |
|
45 | ||
|
46 | Test 'changelog' command argument | |
|
47 | ||
|
48 | $ hg debug-revlog-stats -c | |
|
49 | rev-count data-size inl type target | |
|
50 | 2 138 no changelog (no-pure !) | |
|
51 | 2 137 no changelog (pure !) | |
|
52 | ||
|
53 | Test 'manifest' command argument | |
|
54 | ||
|
55 | $ hg debug-revlog-stats -m | |
|
56 | rev-count data-size inl type target | |
|
57 | 2 177 no manifest (no-pure !) | |
|
58 | 2 168 no manifest (pure !) | |
|
59 | ||
|
60 | Test 'file' command argument | |
|
61 | ||
|
62 | $ hg debug-revlog-stats -f | |
|
63 | rev-count data-size inl type target | |
|
64 | 2 6 yes file a | |
|
65 | 1 0 yes file b | |
|
66 | 1 0 yes file folder/c | |
|
67 | 2 15 no file folder/d | |
|
68 | ||
|
69 | Test multiple command arguments | |
|
70 | ||
|
71 | $ hg debug-revlog-stats -cm | |
|
72 | rev-count data-size inl type target | |
|
73 | 2 138 no changelog (no-pure !) | |
|
74 | 2 137 no changelog (pure !) | |
|
75 | 2 177 no manifest (no-pure !) | |
|
76 | 2 168 no manifest (pure !) | |
|
77 |
@@ -3809,6 +3809,33 b' def debugshell(ui, repo):' | |||
|
3809 | 3809 | |
|
3810 | 3810 | |
|
3811 | 3811 | @command( |
|
3812 | b'debug-revlog-stats', | |
|
3813 | [ | |
|
3814 | (b'c', b'changelog', None, _(b'Display changelog statistics')), | |
|
3815 | (b'm', b'manifest', None, _(b'Display manifest statistics')), | |
|
3816 | (b'f', b'filelogs', None, _(b'Display filelogs statistics')), | |
|
3817 | ] | |
|
3818 | + cmdutil.formatteropts, | |
|
3819 | ) | |
|
3820 | def debug_revlog_stats(ui, repo, **opts): | |
|
3821 | """display statistics about revlogs in the store""" | |
|
3822 | opts = pycompat.byteskwargs(opts) | |
|
3823 | changelog = opts[b"changelog"] | |
|
3824 | manifest = opts[b"manifest"] | |
|
3825 | filelogs = opts[b"filelogs"] | |
|
3826 | ||
|
3827 | if changelog is None and manifest is None and filelogs is None: | |
|
3828 | changelog = True | |
|
3829 | manifest = True | |
|
3830 | filelogs = True | |
|
3831 | ||
|
3832 | repo = repo.unfiltered() | |
|
3833 | fm = ui.formatter(b'debug-revlog-stats', opts) | |
|
3834 | revlog_debug.debug_revlog_stats(repo, fm, changelog, manifest, filelogs) | |
|
3835 | fm.end() | |
|
3836 | ||
|
3837 | ||
|
3838 | @command( | |
|
3812 | 3839 | b'debugsuccessorssets', |
|
3813 | 3840 | [(b'', b'closest', False, _(b'return closest successors sets only'))], |
|
3814 | 3841 | _(b'[REV]'), |
@@ -661,3 +661,61 b' def debug_delta_find(ui, revlog, rev, ba' | |||
|
661 | 661 | |
|
662 | 662 | fh = revlog._datafp() |
|
663 | 663 | deltacomputer.finddeltainfo(revinfo, fh, target_rev=rev) |
|
664 | ||
|
665 | ||
|
666 | def _get_revlogs(repo, changelog: bool, manifest: bool, filelogs: bool): | |
|
667 | """yield revlogs from this repository""" | |
|
668 | if changelog: | |
|
669 | yield repo.changelog | |
|
670 | ||
|
671 | if manifest: | |
|
672 | # XXX: Handle tree manifest | |
|
673 | root_mf = repo.manifestlog.getstorage(b'') | |
|
674 | assert not root_mf._treeondisk | |
|
675 | yield root_mf._revlog | |
|
676 | ||
|
677 | if filelogs: | |
|
678 | files = set() | |
|
679 | for rev in repo: | |
|
680 | ctx = repo[rev] | |
|
681 | files |= set(ctx.files()) | |
|
682 | ||
|
683 | for f in sorted(files): | |
|
684 | yield repo.file(f)._revlog | |
|
685 | ||
|
686 | ||
|
687 | def debug_revlog_stats( | |
|
688 | repo, fm, changelog: bool, manifest: bool, filelogs: bool | |
|
689 | ): | |
|
690 | """Format revlog statistics for debugging purposes | |
|
691 | ||
|
692 | fm: the output formatter. | |
|
693 | """ | |
|
694 | fm.plain(b'rev-count data-size inl type target \n') | |
|
695 | ||
|
696 | for rlog in _get_revlogs(repo, changelog, manifest, filelogs): | |
|
697 | fm.startitem() | |
|
698 | nb_rev = len(rlog) | |
|
699 | inline = rlog._inline | |
|
700 | data_size = rlog._get_data_offset(nb_rev - 1) | |
|
701 | ||
|
702 | target = rlog.target | |
|
703 | revlog_type = b'unknown' | |
|
704 | revlog_target = b'' | |
|
705 | if target[0] == constants.KIND_CHANGELOG: | |
|
706 | revlog_type = b'changelog' | |
|
707 | elif target[0] == constants.KIND_MANIFESTLOG: | |
|
708 | revlog_type = b'manifest' | |
|
709 | revlog_target = target[1] | |
|
710 | elif target[0] == constants.KIND_FILELOG: | |
|
711 | revlog_type = b'file' | |
|
712 | revlog_target = target[1] | |
|
713 | ||
|
714 | fm.write(b'revlog.rev-count', b'%9d', nb_rev) | |
|
715 | fm.write(b'revlog.data-size', b'%12d', data_size) | |
|
716 | ||
|
717 | fm.write(b'revlog.inline', b' %-3s', b'yes' if inline else b'no') | |
|
718 | fm.write(b'revlog.type', b' %-9s', revlog_type) | |
|
719 | fm.write(b'revlog.target', b' %s', revlog_target) | |
|
720 | ||
|
721 | fm.plain(b'\n') |
@@ -77,6 +77,7 b' Show debug commands if there are no othe' | |||
|
77 | 77 | debug-delta-find |
|
78 | 78 | debug-repair-issue6528 |
|
79 | 79 | debug-revlog-index |
|
80 | debug-revlog-stats | |
|
80 | 81 | debugancestor |
|
81 | 82 | debugantivirusrunning |
|
82 | 83 | debugapplystreamclonebundle |
@@ -271,6 +272,7 b' Show all commands + options' | |||
|
271 | 272 | debug-delta-find: changelog, manifest, dir, template, source |
|
272 | 273 | debug-repair-issue6528: to-report, from-report, paranoid, dry-run |
|
273 | 274 | debug-revlog-index: changelog, manifest, dir, template |
|
275 | debug-revlog-stats: changelog, manifest, filelogs, template | |
|
274 | 276 | debugancestor: |
|
275 | 277 | debugantivirusrunning: |
|
276 | 278 | debugapplystreamclonebundle: |
@@ -985,6 +985,8 b' Test list of internal help commands' | |||
|
985 | 985 | details. |
|
986 | 986 | debug-revlog-index |
|
987 | 987 | dump index data for a revlog |
|
988 | debug-revlog-stats | |
|
989 | display statistics about revlogs in the store | |
|
988 | 990 | debugancestor |
|
989 | 991 | find the ancestor revision of two revisions in a given index |
|
990 | 992 | debugantivirusrunning |
General Comments 0
You need to be logged in to leave comments.
Login now