hbisect: add two new revset descriptions: 'goods' and 'bads'
This patch adds two new revset descriptions:
- 'goods': the list of topologicaly-good csets:
- if good csets are topologically before bad csets, yields '::good'
- else, yields 'good::'
- and conversely for 'bads'
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
--- a/mercurial/hbisect.py Tue Sep 20 15:21:27 2011 +0300
+++ b/mercurial/hbisect.py Sat Sep 24 01:32:50 2011 +0200
@@ -158,9 +158,10 @@
"""
Return a list of revision(s) that match the given status:
- - ``good``, ``bad``, ``skip``: as the names imply
- - ``range`` : all csets taking part in the bisection
- - ``pruned`` : csets that are good, bad or skipped
+ - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
+ - ``goods``, ``bads`` : csets topologicaly good/bad
+ - ``range`` : csets taking part in the bisection
+ - ``pruned`` : csets that are goods, bads or skipped
- ``untested`` : csets whose fate is yet unknown
- ``ignored`` : csets ignored due to DAG topology
"""
@@ -178,16 +179,20 @@
# that's because the bisection can go either way
range = '( bisect(bad)::bisect(good) | bisect(good)::bisect(bad) )'
- # 'pruned' is all csets whose fate is already known:
- # - a good ancestor and a good ascendant, or
- # - a bad ancestor and a bad descendant, or
- # - skipped
- # But in case of irrelevant goods/bads, we also need to
- # include them.
- pg = 'bisect(good)::bisect(good)' # Pruned goods
- pb = 'bisect(bad)::bisect(bad)' # Pruned bads
- ps = 'bisect(skip)' # Pruned skipped
- pruned = '( (%s) | (%s) | (%s) )' % (pg, pb, ps)
+ _t = [c.rev() for c in repo.set('bisect(good)::bisect(bad)')]
+ # The sets of topologically good or bad csets
+ if len(_t) == 0:
+ # Goods are topologically after bads
+ goods = 'bisect(good)::' # Pruned good csets
+ bads = '::bisect(bad)' # Pruned bad csets
+ else:
+ # Goods are topologically before bads
+ goods = '::bisect(good)' # Pruned good csets
+ bads = 'bisect(bad)::' # Pruned bad csets
+
+ # 'pruned' is all csets whose fate is already known: good, bad, skip
+ skips = 'bisect(skip)' # Pruned skipped csets
+ pruned = '( (%s) | (%s) | (%s) )' % (goods, bads, skips)
# 'untested' is all cset that are- in 'range', but not in 'pruned'
untested = '( (%s) - (%s) )' % (range, pruned)
@@ -208,6 +213,10 @@
return [c.rev() for c in repo.set(untested)]
elif status == 'ignored':
return [c.rev() for c in repo.set(ignored)]
+ elif status == "goods":
+ return [c.rev() for c in repo.set(goods)]
+ elif status == "bads":
+ return [c.rev() for c in repo.set(bads)]
else:
raise error.ParseError(_('invalid bisect state'))
--- a/mercurial/revset.py Tue Sep 20 15:21:27 2011 +0300
+++ b/mercurial/revset.py Sat Sep 24 01:32:50 2011 +0200
@@ -237,13 +237,14 @@
def bisect(repo, subset, x):
"""``bisect(string)``
- Changesets marked in the specified bisect status (``good``, ``bad``,
- ``skip``), or any of the meta-status:
+ Changesets marked in the specified bisect status:
- - ``range`` : all csets taking part in the bisection
- - ``pruned`` : csets that are good, bad or skipped
- - ``untested`` : csets whose fate is yet unknown
- - ``ignored`` : csets ignored due to DAG topology
+ - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
+ - ``goods``, ``bads`` : csets topologicaly good/bad
+ - ``range`` : csets taking part in the bisection
+ - ``pruned`` : csets that are goods, bads or skipped
+ - ``untested`` : csets whose fate is yet unknown
+ - ``ignored`` : csets ignored due to DAG topology
"""
status = getstring(x, _("bisect requires a string")).lower()
return [r for r in subset if r in hbisect.get(repo, status)]
--- a/tests/test-bisect2.t Tue Sep 20 15:21:27 2011 +0300
+++ b/tests/test-bisect2.t Sat Sep 24 01:32:50 2011 +0200
@@ -322,9 +322,26 @@
15:857b178a7cf3
16:609d82a7ebae
17:228c06deef46
+ 18:d42e18c7bc9b
$ hg log -q -r 'bisect(untested)'
11:82ca6f06eccd
12:9f259202bbe7
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ $ hg log -q -r 'bisect(bads)'
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
complex bisect test 2 # first good rev is 13
@@ -337,6 +354,7 @@
Testing changeset 10:429fcd26f52d (13 changesets remaining, ~3 tests)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
1:4ca5088da217
6:a214d5d3811a
18:d42e18c7bc9b
@@ -344,6 +362,7 @@
Testing changeset 12:9f259202bbe7 (5 changesets remaining, ~2 tests)
3 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
1:4ca5088da217
2:051e12f87bf1
3:0950834f0a9c
@@ -396,8 +415,10 @@
Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
2 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
1:4ca5088da217
16:609d82a7ebae
+ 17:228c06deef46
$ hg bisect -g # -> update to rev 13
Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
3 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -408,6 +429,7 @@
Testing changeset 12:9f259202bbe7 (8 changesets remaining, ~3 tests)
3 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
1:4ca5088da217
2:051e12f87bf1
3:0950834f0a9c
@@ -417,6 +439,7 @@
10:429fcd26f52d
13:b0a32c86eb31
16:609d82a7ebae
+ 17:228c06deef46
$ hg bisect -g # -> update to rev 9
Testing changeset 9:3c77083deb4a (5 changesets remaining, ~2 tests)
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -484,6 +507,13 @@
Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
8:dab8161ac8fc
9:3c77083deb4a
10:429fcd26f52d
@@ -495,6 +525,13 @@
Testing changeset 16:609d82a7ebae (3 changesets remaining, ~1 tests)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
8:dab8161ac8fc
9:3c77083deb4a
10:429fcd26f52d
@@ -533,6 +570,13 @@
16:609d82a7ebae
17:228c06deef46
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
8:dab8161ac8fc
9:3c77083deb4a
10:429fcd26f52d
@@ -552,6 +596,11 @@
[255]
$ hg log -q -r 'bisect(range)'
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
7:50c76098bbf2
14:faa450606157
$ hg bisect --reset
@@ -594,12 +643,16 @@
16:609d82a7ebae
17:228c06deef46
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
11:82ca6f06eccd
12:9f259202bbe7
13:b0a32c86eb31
15:857b178a7cf3
16:609d82a7ebae
17:228c06deef46
+ 18:d42e18c7bc9b
$ hg log -q -r 'bisect(untested)'
$ hg log -q -r 'bisect(ignored)'
2:051e12f87bf1
@@ -633,6 +686,18 @@
4:5c668c22234f
5:385a529b6670
6:a214d5d3811a
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ $ hg log -q -r 'bisect(bads)'
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
$ hg bisect -b
The first bad revision is:
changeset: 9:3c77083deb4a
@@ -651,6 +716,8 @@
16:609d82a7ebae
17:228c06deef46
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
8:dab8161ac8fc
9:3c77083deb4a
10:429fcd26f52d
@@ -660,6 +727,7 @@
15:857b178a7cf3
16:609d82a7ebae
17:228c06deef46
+ 18:d42e18c7bc9b
$ hg log -q -r 'bisect(untested)'
$ hg log -q -r 'bisect(ignored)'
2:051e12f87bf1
@@ -667,6 +735,20 @@
4:5c668c22234f
5:385a529b6670
6:a214d5d3811a
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ $ hg log -q -r 'bisect(bads)'
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
user adds irrelevant but consistent information (here: -g 2) to bisect state
@@ -698,9 +780,16 @@
12:9f259202bbe7
13:b0a32c86eb31
$ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
2:051e12f87bf1
8:dab8161ac8fc
11:82ca6f06eccd
12:9f259202bbe7
13:b0a32c86eb31
+ 14:faa450606157
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
$ hg log -q -r 'bisect(untested)'