Mercurial > public > mercurial-scm > hg-stable
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) |