Mercurial > hg
annotate tests/bruterebase.py @ 49014:5a24bb7f4ed7
subsetmaker: use SortedSet for the scratch variant
This provides a massive speedup on wide repository with many heads. For example
on mozilla-try, this move from un-usable slow to fairly instant.
Differential Revision: https://phab.mercurial-scm.org/D12395
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sun, 13 Mar 2022 16:24:01 +0100 |
parents | 6000f5b25c9b |
children | 56f98406831b |
rev | line source |
---|---|
33708 | 1 # bruterebase.py - brute force rebase testing |
2 # | |
3 # Copyright 2017 Facebook, Inc. | |
4 # | |
5 # This software may be used and distributed according to the terms of the | |
6 # GNU General Public License version 2 or any later version. | |
7 | |
8 | |
9 from mercurial import ( | |
10 error, | |
11 registrar, | |
12 revsetlang, | |
13 ) | |
14 | |
15 from hgext import rebase | |
16 | |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
17 try: |
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
18 xrange |
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
19 except NameError: |
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
20 xrange = range |
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
21 |
33708 | 22 cmdtable = {} |
23 command = registrar.command(cmdtable) | |
24 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39683
diff
changeset
|
25 |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
26 @command(b'debugbruterebase') |
33708 | 27 def debugbruterebase(ui, repo, source, dest): |
28 """for every non-empty subset of source, run rebase -r subset -d dest | |
29 | |
30 Print one line summary for each subset. Assume obsstore is enabled. | |
31 """ | |
32 srevs = list(repo.revs(source)) | |
33 | |
34 with repo.wlock(), repo.lock(): | |
35 repolen = len(repo) | |
36 cl = repo.changelog | |
37 | |
38 def getdesc(rev): | |
39 result = cl.changelogrevision(rev).description | |
40 if rev >= repolen: | |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
41 result += b"'" |
33708 | 42 return result |
43 | |
44 for i in xrange(1, 2 ** len(srevs)): | |
45 subset = [rev for j, rev in enumerate(srevs) if i & (1 << j) != 0] | |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
46 spec = revsetlang.formatspec(b'%ld', subset) |
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
47 tr = repo.transaction(b'rebase') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39683
diff
changeset
|
48 tr._report = lambda x: 0 # hide "transaction abort" |
33708 | 49 |
47437
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
50 with ui.silent(): |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
51 try: |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
52 rebase.rebase(ui, repo, dest=dest, rev=[spec]) |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
53 except error.Abort as ex: |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
54 summary = b'ABORT: %s' % ex.message |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
55 except Exception as ex: |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
56 summary = b'CRASH: %s' % ex |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
57 else: |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
58 # short summary about new nodes |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
59 cl = repo.changelog |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
60 descs = [] |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
61 for rev in xrange(repolen, len(repo)): |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
62 desc = b'%s:' % getdesc(rev) |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
63 for prev in cl.parentrevs(rev): |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
64 if prev > -1: |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
65 desc += getdesc(prev) |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
66 descs.append(desc) |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
67 descs.sort() |
7a430116f639
ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents:
45682
diff
changeset
|
68 summary = b' '.join(descs) |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
69 repo.vfs.tryunlink(b'rebasestate') |
33708 | 70 |
34204
bab82c43c065
bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents:
33708
diff
changeset
|
71 subsetdesc = b''.join(getdesc(rev) for rev in subset) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39683
diff
changeset
|
72 ui.write(b'%s: %s\n' % (subsetdesc.rjust(len(srevs)), summary)) |
33708 | 73 tr.abort() |