Mercurial > hg
annotate hgext/hbisect.py @ 5771:9d3f49f52a4a
bisect: stop early if we find a perfect candidate
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 31 Dec 2007 18:20:34 -0600 |
parents | f5b858fc8067 |
children | 4c46636eafe5 |
rev | line source |
---|---|
1855
0ba9dee8cfbd
Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1854
diff
changeset
|
1 # bisect extension for mercurial |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
2 # |
1861
65949d1c9bf7
Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1856
diff
changeset
|
3 # Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
65949d1c9bf7
Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1856
diff
changeset
|
4 # Inspired by git bisect, extension skeleton taken from mq.py. |
65949d1c9bf7
Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1856
diff
changeset
|
5 # |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms |
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
7 # of the GNU General Public License, incorporated herein by reference. |
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
8 |
3891 | 9 from mercurial.i18n import _ |
5731
19691160d7f5
bisect: remove unused imports
Matt Mackall <mpm@selenic.com>
parents:
5730
diff
changeset
|
10 from mercurial import hg, util, cmdutil |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
11 import os |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
12 |
5737 | 13 def _bisect(changelog, state): |
14 clparents = changelog.parentrevs | |
15 # only the earliest bad revision matters | |
16 badrev = min([changelog.rev(n) for n in state['bad']]) | |
17 bad = changelog.node(badrev) | |
5770
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
18 skip = dict.fromkeys([changelog.rev(n) for n in state['skip']]) |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
19 |
5737 | 20 # build ancestors array |
21 ancestors = [[]] * (changelog.count() + 1) # an extra for [-1] | |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
22 |
5737 | 23 # clear good revs from array |
24 for node in state['good']: | |
25 ancestors[changelog.rev(node)] = None | |
26 for rev in xrange(changelog.count(), -1, -1): | |
27 if ancestors[rev] is None: | |
28 for prev in clparents(rev): | |
29 ancestors[prev] = None | |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
30 |
5737 | 31 if ancestors[badrev] is None: |
32 raise util.Abort(_("Inconsistent state, %s:%s is good and bad") | |
33 % (badrev, hg.short(bad))) | |
5723
e3b09819496b
bisect: switch to rev-based calculation
Matt Mackall <mpm@selenic.com>
parents:
5722
diff
changeset
|
34 |
5768
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
35 # build children dict |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
36 children = {} |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
37 visit = [badrev] |
5769
49809f4a38d8
bisect: calculate candidate set while finding children
Matt Mackall <mpm@selenic.com>
parents:
5768
diff
changeset
|
38 candidates = [] |
5768
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
39 while visit: |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
40 rev = visit.pop(0) |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
41 if ancestors[rev] == []: |
5769
49809f4a38d8
bisect: calculate candidate set while finding children
Matt Mackall <mpm@selenic.com>
parents:
5768
diff
changeset
|
42 candidates.append(rev) |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
43 for prev in clparents(rev): |
5768
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
44 if prev != -1: |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
45 if prev in children: |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
46 children[prev].append(rev) |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
47 else: |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
48 children[prev] = [rev] |
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
49 visit.append(prev) |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
50 |
5769
49809f4a38d8
bisect: calculate candidate set while finding children
Matt Mackall <mpm@selenic.com>
parents:
5768
diff
changeset
|
51 candidates.sort() |
5770
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
52 # have we narrowed it down to one entry? |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
53 tot = len(candidates) |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
54 if tot == 1: |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
55 return (bad, 0) |
5771
9d3f49f52a4a
bisect: stop early if we find a perfect candidate
Matt Mackall <mpm@selenic.com>
parents:
5770
diff
changeset
|
56 perfect = tot / 2 |
5769
49809f4a38d8
bisect: calculate candidate set while finding children
Matt Mackall <mpm@selenic.com>
parents:
5768
diff
changeset
|
57 |
5770
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
58 # find the best node to test |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
59 best_rev = None |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
60 best_len = -1 |
5769
49809f4a38d8
bisect: calculate candidate set while finding children
Matt Mackall <mpm@selenic.com>
parents:
5768
diff
changeset
|
61 for rev in candidates: |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
62 l = ancestors[rev] |
5770
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
63 ancestors[rev] = None |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
64 if l != None: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
65 if not l: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
66 a = [rev] |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
67 elif len(l) == 1: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
68 a = l[0] + [rev] |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
69 else: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
70 a = {} |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
71 for s in l: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
72 a.update(dict.fromkeys(s)) |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
73 a[rev] = None |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
74 a = a.keys() |
5768
78d14403bdc7
bisect: use a dict for children
Matt Mackall <mpm@selenic.com>
parents:
5767
diff
changeset
|
75 for c in children.get(rev, []): |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
76 if ancestors[c]: |
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
77 ancestors[c].append(a) |
5726
19cbe2aea2bc
bisect: switch individual ancestor lists from dict to list
Matt Mackall <mpm@selenic.com>
parents:
5725
diff
changeset
|
78 else: |
5767
dd5f8ed31057
bisect: propagate ancestor lists directly to children
Matt Mackall <mpm@selenic.com>
parents:
5766
diff
changeset
|
79 ancestors[c] = [a] |
5770
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
80 if n in skip: |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
81 continue |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
82 a = len(a) # number of ancestors |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
83 b = tot - a # number of non-ancestors |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
84 value = min(a, b) # how good is this test? |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
85 if value > best_len: |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
86 best_len = value |
f5b858fc8067
bisect: find best node in ancestor collection pass
Matt Mackall <mpm@selenic.com>
parents:
5769
diff
changeset
|
87 best_rev = rev |
5771
9d3f49f52a4a
bisect: stop early if we find a perfect candidate
Matt Mackall <mpm@selenic.com>
parents:
5770
diff
changeset
|
88 if value == perfect: # found a perfect candidate? quit early |
9d3f49f52a4a
bisect: stop early if we find a perfect candidate
Matt Mackall <mpm@selenic.com>
parents:
5770
diff
changeset
|
89 break |
5734
944b231fa0e7
bisect: move reporting out of core bisect function
Matt Mackall <mpm@selenic.com>
parents:
5733
diff
changeset
|
90 |
5737 | 91 assert best_rev is not None |
92 best_node = changelog.node(best_rev) | |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
93 |
5737 | 94 return (best_node, tot) |
5733 | 95 |
5737 | 96 def bisect(ui, repo, rev=None, extra=None, |
5766
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
97 reset=None, good=None, bad=None, skip=None, noupdate=None): |
5729
73646515c435
bisect: slightly improve the help message
Matt Mackall <mpm@selenic.com>
parents:
5728
diff
changeset
|
98 """Subdivision search of changesets |
4390
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
99 |
5729
73646515c435
bisect: slightly improve the help message
Matt Mackall <mpm@selenic.com>
parents:
5728
diff
changeset
|
100 This extension helps to find changesets which introduce problems. |
73646515c435
bisect: slightly improve the help message
Matt Mackall <mpm@selenic.com>
parents:
5728
diff
changeset
|
101 To use, mark the earliest changeset you know exhibits the problem |
4390
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
102 as bad, then mark the latest changeset which is free from the problem |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
103 as good. Bisect will update your working directory to a revision for |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
104 testing. Once you have performed tests, mark the working directory |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
105 as bad or good and bisect will either update to another candidate |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
106 changeset or announce that it has found the bad revision. |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
107 |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
108 Note: bisect expects bad revisions to be descendants of good revisions. |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
109 If you are looking for the point at which a problem was fixed, then make |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
110 the problem-free state "bad" and the problematic state "good." |
052062b98f26
Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents:
3891
diff
changeset
|
111 |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
112 """ |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
113 # backward compatibility |
5737 | 114 if rev in "good bad reset init".split(): |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
115 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n")) |
5737 | 116 cmd, rev, extra = rev, extra, None |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
117 if cmd == "good": |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
118 good = True |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
119 elif cmd == "bad": |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
120 bad = True |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
121 else: |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
122 reset = True |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
123 elif extra or good + bad + skip + reset > 1: |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
124 raise util.Abort("Incompatible arguments") |
1855
0ba9dee8cfbd
Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1854
diff
changeset
|
125 |
5737 | 126 if reset: |
127 p = repo.join("bisect.state") | |
128 if os.path.exists(p): | |
129 os.unlink(p) | |
130 return | |
131 | |
132 # load state | |
133 state = {'good': [], 'bad': [], 'skip': []} | |
134 if os.path.exists(repo.join("bisect.state")): | |
135 for l in repo.opener("bisect.state"): | |
136 kind, node = l[:-1].split() | |
137 node = repo.lookup(node) | |
138 if kind not in state: | |
139 raise util.Abort(_("unknown bisect kind %s") % kind) | |
140 state[kind].append(node) | |
141 | |
142 # update state | |
143 node = repo.lookup(rev or '.') | |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
144 if good: |
5737 | 145 state['good'].append(node) |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
146 elif bad: |
5737 | 147 state['bad'].append(node) |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
148 elif skip: |
5737 | 149 state['skip'].append(node) |
150 | |
151 # save state | |
5738
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
152 f = repo.opener("bisect.state", "w", atomictemp=True) |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
153 wlock = repo.wlock() |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
154 try: |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
155 for kind in state: |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
156 for node in state[kind]: |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
157 f.write("%s %s\n" % (kind, hg.hex(node))) |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
158 f.rename() |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
159 finally: |
2a54e2b177b6
bisect: use proper locking when updating bisect.state
Matt Mackall <mpm@selenic.com>
parents:
5737
diff
changeset
|
160 del wlock |
5737 | 161 |
162 if not state['good'] or not state['bad']: | |
163 return | |
164 | |
165 # actually bisect | |
166 node, changesets = _bisect(repo.changelog, state) | |
167 if changesets == 0: | |
168 ui.write(_("The first bad revision is:\n")) | |
169 displayer = cmdutil.show_changeset(ui, repo, {}) | |
170 displayer.show(changenode=node) | |
171 elif node is not None: | |
172 # compute the approximate number of remaining tests | |
173 tests, size = 0, 2 | |
174 while size <= changesets: | |
175 tests, size = tests + 1, size * 2 | |
176 rev = repo.changelog.rev(node) | |
177 ui.write(_("Testing changeset %s:%s " | |
178 "(%s changesets remaining, ~%s tests)\n") | |
179 % (rev, hg.short(node), changesets, tests)) | |
5766
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
180 if not noupdate: |
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
181 cmdutil.bail_if_changed(repo) |
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
182 return hg.clean(repo, node) |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
183 |
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
184 cmdtable = { |
5737 | 185 "bisect": (bisect, |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
186 [('r', 'reset', False, _('reset bisect state')), |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
187 ('g', 'good', False, _('mark changeset good')), |
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
188 ('b', 'bad', False, _('mark changeset bad')), |
5766
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
189 ('s', 'skip', False, _('skip testing changeset')), |
23caedc5a28f
bisect: add noupdate option
Matt Mackall <mpm@selenic.com>
parents:
5738
diff
changeset
|
190 ('U', 'noupdate', False, _('do not update to target'))], |
5735
9079081b8982
bisect: use more standard command syntax and help
Matt Mackall <mpm@selenic.com>
parents:
5734
diff
changeset
|
191 _("hg bisect [-gbsr] [REV]")) |
1367
a7678cbd7c28
bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
192 } |