comparison mercurial/commands.py @ 45993: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 89a2afe31e82
children b86608e97fa8
comparison
equal deleted inserted replaced
45992:7d3c51c728c9 45993:c3d0b3c29ec4
905 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 905 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
906 ) 906 )
907 def bisect( 907 def bisect(
908 ui, 908 ui,
909 repo, 909 repo,
910 rev=None, 910 positional_1=None,
911 extra=None, 911 positional_2=None,
912 command=None, 912 command=None,
913 reset=None, 913 reset=None,
914 good=None, 914 good=None,
915 bad=None, 915 bad=None,
916 skip=None, 916 skip=None,
996 996
997 See :hg:`help revisions.bisect` for more about the `bisect()` predicate. 997 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
998 998
999 Returns 0 on success. 999 Returns 0 on success.
1000 """ 1000 """
1001 rev = []
1001 # backward compatibility 1002 # backward compatibility
1002 if rev in (b"good", b"bad", b"reset", b"init"): 1003 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1003 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n")) 1004 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1004 cmd, rev, extra = rev, extra, None 1005 cmd = positional_1
1006 rev.append(positional_2)
1005 if cmd == b"good": 1007 if cmd == b"good":
1006 good = True 1008 good = True
1007 elif cmd == b"bad": 1009 elif cmd == b"bad":
1008 bad = True 1010 bad = True
1009 else: 1011 else:
1010 reset = True 1012 reset = True
1011 elif extra: 1013 elif positional_2:
1012 raise error.InputError(_(b'incompatible arguments')) 1014 raise error.InputError(_(b'incompatible arguments'))
1015 elif positional_1 is not None:
1016 rev.append(positional_1)
1013 1017
1014 incompatibles = { 1018 incompatibles = {
1015 b'--bad': bad, 1019 b'--bad': bad,
1016 b'--command': bool(command), 1020 b'--command': bool(command),
1017 b'--extend': extend, 1021 b'--extend': extend,
1031 hbisect.resetstate(repo) 1035 hbisect.resetstate(repo)
1032 return 1036 return
1033 1037
1034 state = hbisect.load_state(repo) 1038 state = hbisect.load_state(repo)
1035 1039
1040 if rev:
1041 nodes = [repo[i].node() for i in scmutil.revrange(repo, rev)]
1042 else:
1043 nodes = [repo.lookup(b'.')]
1044
1036 # update state 1045 # update state
1037 if good or bad or skip: 1046 if good or bad or skip:
1038 if rev:
1039 nodes = [repo[i].node() for i in scmutil.revrange(repo, [rev])]
1040 else:
1041 nodes = [repo.lookup(b'.')]
1042 if good: 1047 if good:
1043 state[b'good'] += nodes 1048 state[b'good'] += nodes
1044 elif bad: 1049 elif bad:
1045 state[b'bad'] += nodes 1050 state[b'bad'] += nodes
1046 elif skip: 1051 elif skip:
1074 else: 1079 else:
1075 node, p2 = repo.dirstate.parents() 1080 node, p2 = repo.dirstate.parents()
1076 if p2 != nullid: 1081 if p2 != nullid:
1077 raise error.StateError(_(b'current bisect revision is a merge')) 1082 raise error.StateError(_(b'current bisect revision is a merge'))
1078 if rev: 1083 if rev:
1079 node = repo[scmutil.revsingle(repo, rev, node)].node() 1084 if not nodes:
1085 raise error.Abort(_(b'empty revision set'))
1086 node = repo[nodes.last()].node()
1080 with hbisect.restore_state(repo, state, node): 1087 with hbisect.restore_state(repo, state, node):
1081 while changesets: 1088 while changesets:
1082 # update state 1089 # update state
1083 state[b'current'] = [node] 1090 state[b'current'] = [node]
1084 hbisect.save_state(repo, state) 1091 hbisect.save_state(repo, state)