annotate tests/test-state-extension.t @ 51108:0250e45040f1

revlog: add a small cache of unfiltered chunk This can provides a massive boost to the reading of multiple revision and the computation of a valid delta chain. This greatly help operation like `hg log --patch`, delta computation (helping pull/unbundle), linkrev adjustment (helping copy tracing). A first round of benchmark for `hg log --patch --limit 1000` shows improvement in the 10-20% range on "small" repository like pypy or mercurial and large improvements (about 33%) for more complex ones like netbeans and mozilla's. These speeds up are consistent with the improvement to `hg pull` (from a server sending poor deltas) I saw benchmarking this last year. Further benchmark will be run during the freeze. I added some configuration in the experimental space to be able to further test the effect of various tuning for now. This feature should fit well in the "usage/resource profile" configuration that we should land next cycle. When it does not provides a benefit the overhead of the cache seem to be around 2%, a small price for the big improvement. In addition I believe we could shave most of this overhead with a more efficent lru implementation.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 27 Oct 2023 08:54:41 +0200
parents 21733e8c924f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
1 Test extension of unfinished states support.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
2 $ mkdir chainify
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
3 $ cd chainify
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
4 $ cat >> chainify.py <<EOF
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
5 > from mercurial import cmdutil, error, extensions, exthelper, node, scmutil, state
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
6 > from hgext import rebase
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
7 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
8 > eh = exthelper.exthelper()
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
9 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
10 > extsetup = eh.finalextsetup
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
11 > cmdtable = eh.cmdtable
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
12 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
13 > # Rebase calls addunfinished in uisetup, so we have to call it in extsetup.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
14 > # Ideally there'd by an 'extensions.afteruisetup()' just like
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
15 > # 'extensions.afterloaded()' to allow nesting multiple commands.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
16 > @eh.extsetup
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
17 > def _extsetup(ui):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
18 > state.addunfinished(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
19 > b'chainify',
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
20 > b'chainify.state',
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
21 > continueflag=True,
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
22 > childopnames=[b'rebase'])
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
23 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
24 > def _node(repo, arg):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
25 > return node.hex(scmutil.revsingle(repo, arg).node())
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
26 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
27 > @eh.command(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
28 > b'chainify',
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
29 > [(b'r', b'revs', [], b'revs to chain', b'REV'),
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
30 > (b'', b'continue', False, b'continue op')],
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
31 > b'chainify [-r REV] +',
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
32 > inferrepo=True)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
33 > def chainify(ui, repo, **opts):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
34 > """Rebases r1, r2, r3, etc. into a chain."""
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
35 > with repo.wlock(), repo.lock():
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
36 > cmdstate = state.cmdstate(repo, b'chainify.state')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
37 > if opts['continue']:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
38 > if not cmdstate.exists():
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
39 > raise error.Abort(b'no chainify in progress')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
40 > else:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
41 > cmdutil.checkunfinished(repo)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
42 > data = {
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
43 > b'tip': _node(repo, opts['revs'][0]),
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
44 > b'revs': b','.join(_node(repo, r) for r in opts['revs'][1:]),
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
45 > }
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
46 > cmdstate.save(1, data)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
47 >
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
48 > data = cmdstate.read()
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
49 > while data[b'revs']:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
50 > tip = data[b'tip']
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
51 > revs = data[b'revs'].split(b',')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
52 > with state.delegating(repo, b'chainify', b'rebase'):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
53 > ui.status(b'rebasing %s onto %s\n' % (revs[0][:12], tip[:12]))
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
54 > if state.ischildunfinished(repo, b'chainify', b'rebase'):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
55 > rc = state.continuechild(ui, repo, b'chainify', b'rebase')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
56 > else:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
57 > rc = rebase.rebase(ui, repo, rev=[revs[0]], dest=tip)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
58 > if rc and rc != 0:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
59 > raise error.Abort(b'rebase failed (rc: %d)' % rc)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
60 > data[b'tip'] = _node(repo, b'tip')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
61 > data[b'revs'] = b','.join(revs[1:])
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
62 > cmdstate.save(1, data)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
63 > cmdstate.delete()
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
64 > ui.status(b'done chainifying\n')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
65 > EOF
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
66
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
67 $ chainifypath=`pwd`/chainify.py
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
68 $ echo '[extensions]' >> $HGRCPATH
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
69 $ echo "chainify = $chainifypath" >> $HGRCPATH
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
70 $ echo "rebase =" >> $HGRCPATH
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
71
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
72 $ cd $TESTTMP
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
73 $ hg init a
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
74 $ cd a
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
75 $ echo base > base.txt
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
76 $ hg commit -Aqm 'base commit'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
77 $ echo foo > file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
78 $ hg commit -Aqm 'add file'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
79 $ hg co -q ".^"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
80 $ echo bar > file2
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
81 $ hg commit -Aqm 'add other file'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
82 $ hg co -q ".^"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
83 $ echo foo2 > file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
84 $ hg commit -Aqm 'add conflicting file'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
85 $ hg co -q ".^"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
86 $ hg log --graph --template '{rev} {files}'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
87 o 3 file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
88 |
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
89 | o 2 file2
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
90 |/
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
91 | o 1 file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
92 |/
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
93 @ 0 base.txt
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
94
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
95 $ hg chainify -r 8430cfdf77c2 -r f8596309dff8 -r a858b338b3e9
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
96 rebasing f8596309dff8 onto 8430cfdf77c2
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
97 rebasing 2:f8596309dff8 "add other file"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
98 saved backup bundle to $TESTTMP/* (glob)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
99 rebasing a858b338b3e9 onto 83c722183a8e
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
100 rebasing 2:a858b338b3e9 "add conflicting file"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
101 merging file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
102 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
103 unresolved conflicts (see 'hg resolve', then 'hg chainify --continue')
45826
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45171
diff changeset
104 [240]
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
105 $ hg status --config commands.status.verbose=True
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
106 M file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
107 ? file1.orig
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
108 # The repository is in an unfinished *chainify* state.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
109
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
110 # Unresolved merge conflicts:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
111 #
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
112 # file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
113 #
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
114 # To mark files as resolved: hg resolve --mark FILE
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
115
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
116 # To continue: hg chainify --continue
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
117 # To abort: hg chainify --abort
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
118
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
119 $ echo foo3 > file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
120 $ hg resolve --mark file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
121 (no more unresolved files)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
122 continue: hg chainify --continue
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
123 $ hg chainify --continue
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
124 rebasing a858b338b3e9 onto 83c722183a8e
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
125 rebasing 2:a858b338b3e9 "add conflicting file"
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
126 saved backup bundle to $TESTTMP/* (glob)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
127 done chainifying
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
128 $ hg log --graph --template '{rev} {files}'
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
129 o 3 file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
130 |
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
131 o 2 file2
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
132 |
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
133 o 1 file1
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
134 |
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
135 @ 0 base.txt
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
diff changeset
136