annotate tests/bruterebase.py @ 40093:726cfc47f17a

contrib: add an utility module to parse test scripts This patch centralizes the logic to pick up code fragments embedded in *.t script, in order to: - apply checking with patterns in check-code.py on such embedded code fragments Now, check-code.py completely ignores embedded code fragments. I'll post another patch series to check them. - replace similar code path in contrib/import-checker.py Current import-checker.py has problems below. Fixing each of them is a little difficult, because parsing logic and pattern strings are tightly coupled. - overlook (or mis-detect) the end of inline script in doctest style 8a8dd6e4a97a fixed a part of this issue, but not enough. - it overlooks inline script in doctest style at the end of file (and ignores invalid un-closed heredoc at the end of file, too) - it overlooks code fragment in styles below - "python <<EOF" (heredoc should be "cat > file <<EOF" style) - "cat > foobar.py << ANYLIMIT" (limit mark should be "EOF") - "cat << EOF > foobar.py" (filename should be placed before limit mark) - "cat >> foobar.py << EOF" (appending is ignored) - it is not extensible for other than python code fragments (e.g. shell script, hgrc file, and so on) This new module can detect python code fragments in styles below: - inline script in doctest style (starting by " >>> " line) - python invocation with heredoc script ("python <<EOF") - python script in heredoc style (redirected into ".py" file) As an example of extensibility of new module, this patch also contains implementation to pick up code fragment below. This will be useful to add additional restriction for them, for example. - shell script in heredoc style (redirected into ".sh" file) - hgrc configuration in heredoc style (redirected into hgrc or $HGRCPATH)
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Thu, 23 Aug 2018 12:25:54 +0900
parents 337d6e0fd9c9
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
1 # bruterebase.py - brute force rebase testing
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
2 #
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
3 # Copyright 2017 Facebook, Inc.
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
4 #
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
7
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
8 from __future__ import absolute_import
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
9
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
10 from mercurial import (
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
11 error,
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
12 registrar,
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
13 revsetlang,
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
14 )
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
15
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
16 from hgext import rebase
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
17
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
18 try:
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
19 xrange
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
20 except NameError:
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
21 xrange = range
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
22
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
23 cmdtable = {}
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
24 command = registrar.command(cmdtable)
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
25
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
26 @command(b'debugbruterebase')
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
27 def debugbruterebase(ui, repo, source, dest):
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
28 """for every non-empty subset of source, run rebase -r subset -d dest
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
29
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
30 Print one line summary for each subset. Assume obsstore is enabled.
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
31 """
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
32 srevs = list(repo.revs(source))
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
33
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
34 with repo.wlock(), repo.lock():
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
35 repolen = len(repo)
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
36 cl = repo.changelog
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
37
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
38 def getdesc(rev):
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
39 result = cl.changelogrevision(rev).description
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
40 if rev >= repolen:
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
41 result += b"'"
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
42 return result
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
43
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
44 for i in xrange(1, 2 ** len(srevs)):
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
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')
39683
337d6e0fd9c9 transaction: make report a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36479
diff changeset
48 tr._report = lambda x: 0 # hide "transaction abort"
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
49
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
50 ui.pushbuffer()
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
51 try:
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
52 rebase.rebase(ui, repo, dest=dest, rev=[spec])
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
53 except error.Abort as ex:
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
54 summary = b'ABORT: %s' % ex
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
55 except Exception as ex:
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
56 summary = b'CRASH: %s' % ex
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
57 else:
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
58 # short summary about new nodes
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
59 cl = repo.changelog
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
60 descs = []
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
61 for rev in xrange(repolen, len(repo)):
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
62 desc = b'%s:' % getdesc(rev)
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
63 for prev in cl.parentrevs(rev):
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
64 if prev > -1:
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
65 desc += getdesc(prev)
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
66 descs.append(desc)
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
67 descs.sort()
36479
3b98ffd2dde3 py3: add a missing b'' in tests/bruterebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34204
diff changeset
68 summary = b' '.join(descs)
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
69 ui.popbuffer()
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
70 repo.vfs.tryunlink(b'rebasestate')
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
71
34204
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
72 subsetdesc = b''.join(getdesc(rev) for rev in subset)
bab82c43c065 bruterebase: port to python 3
Augie Fackler <raf@durin42.com>
parents: 33708
diff changeset
73 ui.write((b'%s: %s\n') % (subsetdesc.rjust(len(srevs)), summary))
33708
71b77b61ed60 test-rebase: add a brute force test
Jun Wu <quark@fb.com>
parents:
diff changeset
74 tr.abort()