changeset 45978:c3d0b3c29ec4

bisect: refactor to work on a list of revspecs This will allow adding a `--rev` flag that can be passed more than once. Differential Revision: https://phab.mercurial-scm.org/D9372
author Simon Sapin <simon-commits@exyr.org>
date Mon, 23 Nov 2020 12:45:39 +0100
parents 7d3c51c728c9
children 744ea3c4f41b
files mercurial/commands.py
diffstat 1 files changed, 17 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Fri Nov 20 10:35:42 2020 +0100
+++ b/mercurial/commands.py	Mon Nov 23 12:45:39 2020 +0100
@@ -907,8 +907,8 @@
 def bisect(
     ui,
     repo,
-    rev=None,
-    extra=None,
+    positional_1=None,
+    positional_2=None,
     command=None,
     reset=None,
     good=None,
@@ -998,18 +998,22 @@
 
     Returns 0 on success.
     """
+    rev = []
     # backward compatibility
-    if rev in (b"good", b"bad", b"reset", b"init"):
+    if positional_1 in (b"good", b"bad", b"reset", b"init"):
         ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
-        cmd, rev, extra = rev, extra, None
+        cmd = positional_1
+        rev.append(positional_2)
         if cmd == b"good":
             good = True
         elif cmd == b"bad":
             bad = True
         else:
             reset = True
-    elif extra:
+    elif positional_2:
         raise error.InputError(_(b'incompatible arguments'))
+    elif positional_1 is not None:
+        rev.append(positional_1)
 
     incompatibles = {
         b'--bad': bad,
@@ -1033,12 +1037,13 @@
 
     state = hbisect.load_state(repo)
 
+    if rev:
+        nodes = [repo[i].node() for i in scmutil.revrange(repo, rev)]
+    else:
+        nodes = [repo.lookup(b'.')]
+
     # update state
     if good or bad or skip:
-        if rev:
-            nodes = [repo[i].node() for i in scmutil.revrange(repo, [rev])]
-        else:
-            nodes = [repo.lookup(b'.')]
         if good:
             state[b'good'] += nodes
         elif bad:
@@ -1076,7 +1081,9 @@
             if p2 != nullid:
                 raise error.StateError(_(b'current bisect revision is a merge'))
         if rev:
-            node = repo[scmutil.revsingle(repo, rev, node)].node()
+            if not nodes:
+                raise error.Abort(_(b'empty revision set'))
+            node = repo[nodes.last()].node()
         with hbisect.restore_state(repo, state, node):
             while changesets:
                 # update state