hbisect: add two new revset descriptions: 'goods' and 'bads'
author"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat, 24 Sep 2011 01:32:50 +0200
changeset 15153 fa0a464e4ca5
parent 15151 0d4f6e843b05
child 15154 aa2e908c521e
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>
mercurial/hbisect.py
mercurial/revset.py
tests/test-bisect2.t
--- 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)'