##// END OF EJS Templates
bisect: report "both good and bad" as such, not as "not directly related"
Mads Kiilerich -
r20094:06ef32c3 stable
parent child Browse files
Show More
@@ -1,258 +1,259 b''
1 # changelog bisection for mercurial
1 # changelog bisection for mercurial
2 #
2 #
3 # Copyright 2007 Matt Mackall
3 # Copyright 2007 Matt Mackall
4 # Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org>
4 # Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org>
5 #
5 #
6 # Inspired by git bisect, extension skeleton taken from mq.py.
6 # Inspired by git bisect, extension skeleton taken from mq.py.
7 #
7 #
8 # This software may be used and distributed according to the terms of the
8 # This software may be used and distributed according to the terms of the
9 # GNU General Public License version 2 or any later version.
9 # GNU General Public License version 2 or any later version.
10
10
11 import os, error
11 import os, error
12 from i18n import _
12 from i18n import _
13 from node import short, hex
13 from node import short, hex
14 import util
14 import util
15
15
16 def bisect(changelog, state):
16 def bisect(changelog, state):
17 """find the next node (if any) for testing during a bisect search.
17 """find the next node (if any) for testing during a bisect search.
18 returns a (nodes, number, good) tuple.
18 returns a (nodes, number, good) tuple.
19
19
20 'nodes' is the final result of the bisect if 'number' is 0.
20 'nodes' is the final result of the bisect if 'number' is 0.
21 Otherwise 'number' indicates the remaining possible candidates for
21 Otherwise 'number' indicates the remaining possible candidates for
22 the search and 'nodes' contains the next bisect target.
22 the search and 'nodes' contains the next bisect target.
23 'good' is True if bisect is searching for a first good changeset, False
23 'good' is True if bisect is searching for a first good changeset, False
24 if searching for a first bad one.
24 if searching for a first bad one.
25 """
25 """
26
26
27 clparents = changelog.parentrevs
27 clparents = changelog.parentrevs
28 skip = set([changelog.rev(n) for n in state['skip']])
28 skip = set([changelog.rev(n) for n in state['skip']])
29
29
30 def buildancestors(bad, good):
30 def buildancestors(bad, good):
31 # only the earliest bad revision matters
31 # only the earliest bad revision matters
32 badrev = min([changelog.rev(n) for n in bad])
32 badrev = min([changelog.rev(n) for n in bad])
33 goodrevs = [changelog.rev(n) for n in good]
33 goodrevs = [changelog.rev(n) for n in good]
34 goodrev = min(goodrevs)
34 goodrev = min(goodrevs)
35 # build visit array
35 # build visit array
36 ancestors = [None] * (len(changelog) + 1) # an extra for [-1]
36 ancestors = [None] * (len(changelog) + 1) # an extra for [-1]
37
37
38 # set nodes descended from goodrevs
38 # set nodes descended from goodrevs
39 for rev in goodrevs:
39 for rev in goodrevs:
40 ancestors[rev] = []
40 ancestors[rev] = []
41 for rev in changelog.revs(goodrev + 1):
41 for rev in changelog.revs(goodrev + 1):
42 for prev in clparents(rev):
42 for prev in clparents(rev):
43 if ancestors[prev] == []:
43 if ancestors[prev] == []:
44 ancestors[rev] = []
44 ancestors[rev] = []
45
45
46 # clear good revs from array
46 # clear good revs from array
47 for rev in goodrevs:
47 for rev in goodrevs:
48 ancestors[rev] = None
48 ancestors[rev] = None
49 for rev in changelog.revs(len(changelog), goodrev):
49 for rev in changelog.revs(len(changelog), goodrev):
50 if ancestors[rev] is None:
50 if ancestors[rev] is None:
51 for prev in clparents(rev):
51 for prev in clparents(rev):
52 ancestors[prev] = None
52 ancestors[prev] = None
53
53
54 if ancestors[badrev] is None:
54 if ancestors[badrev] is None:
55 return badrev, None
55 return badrev, None
56 return badrev, ancestors
56 return badrev, ancestors
57
57
58 good = False
58 good = False
59 badrev, ancestors = buildancestors(state['bad'], state['good'])
59 badrev, ancestors = buildancestors(state['bad'], state['good'])
60 if not ancestors: # looking for bad to good transition?
60 if not ancestors: # looking for bad to good transition?
61 good = True
61 good = True
62 badrev, ancestors = buildancestors(state['good'], state['bad'])
62 badrev, ancestors = buildancestors(state['good'], state['bad'])
63 bad = changelog.node(badrev)
63 bad = changelog.node(badrev)
64 if not ancestors: # now we're confused
64 if not ancestors: # now we're confused
65 if len(state['bad']) == 1 and len(state['good']) == 1:
65 if (len(state['bad']) == 1 and len(state['good']) == 1 and
66 state['bad'] != state['good']):
66 raise util.Abort(_("starting revisions are not directly related"))
67 raise util.Abort(_("starting revisions are not directly related"))
67 raise util.Abort(_("inconsistent state, %s:%s is good and bad")
68 raise util.Abort(_("inconsistent state, %s:%s is good and bad")
68 % (badrev, short(bad)))
69 % (badrev, short(bad)))
69
70
70 # build children dict
71 # build children dict
71 children = {}
72 children = {}
72 visit = util.deque([badrev])
73 visit = util.deque([badrev])
73 candidates = []
74 candidates = []
74 while visit:
75 while visit:
75 rev = visit.popleft()
76 rev = visit.popleft()
76 if ancestors[rev] == []:
77 if ancestors[rev] == []:
77 candidates.append(rev)
78 candidates.append(rev)
78 for prev in clparents(rev):
79 for prev in clparents(rev):
79 if prev != -1:
80 if prev != -1:
80 if prev in children:
81 if prev in children:
81 children[prev].append(rev)
82 children[prev].append(rev)
82 else:
83 else:
83 children[prev] = [rev]
84 children[prev] = [rev]
84 visit.append(prev)
85 visit.append(prev)
85
86
86 candidates.sort()
87 candidates.sort()
87 # have we narrowed it down to one entry?
88 # have we narrowed it down to one entry?
88 # or have all other possible candidates besides 'bad' have been skipped?
89 # or have all other possible candidates besides 'bad' have been skipped?
89 tot = len(candidates)
90 tot = len(candidates)
90 unskipped = [c for c in candidates if (c not in skip) and (c != badrev)]
91 unskipped = [c for c in candidates if (c not in skip) and (c != badrev)]
91 if tot == 1 or not unskipped:
92 if tot == 1 or not unskipped:
92 return ([changelog.node(rev) for rev in candidates], 0, good)
93 return ([changelog.node(rev) for rev in candidates], 0, good)
93 perfect = tot // 2
94 perfect = tot // 2
94
95
95 # find the best node to test
96 # find the best node to test
96 best_rev = None
97 best_rev = None
97 best_len = -1
98 best_len = -1
98 poison = set()
99 poison = set()
99 for rev in candidates:
100 for rev in candidates:
100 if rev in poison:
101 if rev in poison:
101 # poison children
102 # poison children
102 poison.update(children.get(rev, []))
103 poison.update(children.get(rev, []))
103 continue
104 continue
104
105
105 a = ancestors[rev] or [rev]
106 a = ancestors[rev] or [rev]
106 ancestors[rev] = None
107 ancestors[rev] = None
107
108
108 x = len(a) # number of ancestors
109 x = len(a) # number of ancestors
109 y = tot - x # number of non-ancestors
110 y = tot - x # number of non-ancestors
110 value = min(x, y) # how good is this test?
111 value = min(x, y) # how good is this test?
111 if value > best_len and rev not in skip:
112 if value > best_len and rev not in skip:
112 best_len = value
113 best_len = value
113 best_rev = rev
114 best_rev = rev
114 if value == perfect: # found a perfect candidate? quit early
115 if value == perfect: # found a perfect candidate? quit early
115 break
116 break
116
117
117 if y < perfect and rev not in skip: # all downhill from here?
118 if y < perfect and rev not in skip: # all downhill from here?
118 # poison children
119 # poison children
119 poison.update(children.get(rev, []))
120 poison.update(children.get(rev, []))
120 continue
121 continue
121
122
122 for c in children.get(rev, []):
123 for c in children.get(rev, []):
123 if ancestors[c]:
124 if ancestors[c]:
124 ancestors[c] = list(set(ancestors[c] + a))
125 ancestors[c] = list(set(ancestors[c] + a))
125 else:
126 else:
126 ancestors[c] = a + [c]
127 ancestors[c] = a + [c]
127
128
128 assert best_rev is not None
129 assert best_rev is not None
129 best_node = changelog.node(best_rev)
130 best_node = changelog.node(best_rev)
130
131
131 return ([best_node], tot, good)
132 return ([best_node], tot, good)
132
133
133
134
134 def load_state(repo):
135 def load_state(repo):
135 state = {'current': [], 'good': [], 'bad': [], 'skip': []}
136 state = {'current': [], 'good': [], 'bad': [], 'skip': []}
136 if os.path.exists(repo.join("bisect.state")):
137 if os.path.exists(repo.join("bisect.state")):
137 for l in repo.opener("bisect.state"):
138 for l in repo.opener("bisect.state"):
138 kind, node = l[:-1].split()
139 kind, node = l[:-1].split()
139 node = repo.lookup(node)
140 node = repo.lookup(node)
140 if kind not in state:
141 if kind not in state:
141 raise util.Abort(_("unknown bisect kind %s") % kind)
142 raise util.Abort(_("unknown bisect kind %s") % kind)
142 state[kind].append(node)
143 state[kind].append(node)
143 return state
144 return state
144
145
145
146
146 def save_state(repo, state):
147 def save_state(repo, state):
147 f = repo.opener("bisect.state", "w", atomictemp=True)
148 f = repo.opener("bisect.state", "w", atomictemp=True)
148 wlock = repo.wlock()
149 wlock = repo.wlock()
149 try:
150 try:
150 for kind in sorted(state):
151 for kind in sorted(state):
151 for node in state[kind]:
152 for node in state[kind]:
152 f.write("%s %s\n" % (kind, hex(node)))
153 f.write("%s %s\n" % (kind, hex(node)))
153 f.close()
154 f.close()
154 finally:
155 finally:
155 wlock.release()
156 wlock.release()
156
157
157 def get(repo, status):
158 def get(repo, status):
158 """
159 """
159 Return a list of revision(s) that match the given status:
160 Return a list of revision(s) that match the given status:
160
161
161 - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
162 - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
162 - ``goods``, ``bads`` : csets topologically good/bad
163 - ``goods``, ``bads`` : csets topologically good/bad
163 - ``range`` : csets taking part in the bisection
164 - ``range`` : csets taking part in the bisection
164 - ``pruned`` : csets that are goods, bads or skipped
165 - ``pruned`` : csets that are goods, bads or skipped
165 - ``untested`` : csets whose fate is yet unknown
166 - ``untested`` : csets whose fate is yet unknown
166 - ``ignored`` : csets ignored due to DAG topology
167 - ``ignored`` : csets ignored due to DAG topology
167 - ``current`` : the cset currently being bisected
168 - ``current`` : the cset currently being bisected
168 """
169 """
169 state = load_state(repo)
170 state = load_state(repo)
170 if status in ('good', 'bad', 'skip', 'current'):
171 if status in ('good', 'bad', 'skip', 'current'):
171 return map(repo.changelog.rev, state[status])
172 return map(repo.changelog.rev, state[status])
172 else:
173 else:
173 # In the following sets, we do *not* call 'bisect()' with more
174 # In the following sets, we do *not* call 'bisect()' with more
174 # than one level of recursion, because that can be very, very
175 # than one level of recursion, because that can be very, very
175 # time consuming. Instead, we always develop the expression as
176 # time consuming. Instead, we always develop the expression as
176 # much as possible.
177 # much as possible.
177
178
178 # 'range' is all csets that make the bisection:
179 # 'range' is all csets that make the bisection:
179 # - have a good ancestor and a bad descendant, or conversely
180 # - have a good ancestor and a bad descendant, or conversely
180 # that's because the bisection can go either way
181 # that's because the bisection can go either way
181 range = '( bisect(bad)::bisect(good) | bisect(good)::bisect(bad) )'
182 range = '( bisect(bad)::bisect(good) | bisect(good)::bisect(bad) )'
182
183
183 _t = repo.revs('bisect(good)::bisect(bad)')
184 _t = repo.revs('bisect(good)::bisect(bad)')
184 # The sets of topologically good or bad csets
185 # The sets of topologically good or bad csets
185 if len(_t) == 0:
186 if len(_t) == 0:
186 # Goods are topologically after bads
187 # Goods are topologically after bads
187 goods = 'bisect(good)::' # Pruned good csets
188 goods = 'bisect(good)::' # Pruned good csets
188 bads = '::bisect(bad)' # Pruned bad csets
189 bads = '::bisect(bad)' # Pruned bad csets
189 else:
190 else:
190 # Goods are topologically before bads
191 # Goods are topologically before bads
191 goods = '::bisect(good)' # Pruned good csets
192 goods = '::bisect(good)' # Pruned good csets
192 bads = 'bisect(bad)::' # Pruned bad csets
193 bads = 'bisect(bad)::' # Pruned bad csets
193
194
194 # 'pruned' is all csets whose fate is already known: good, bad, skip
195 # 'pruned' is all csets whose fate is already known: good, bad, skip
195 skips = 'bisect(skip)' # Pruned skipped csets
196 skips = 'bisect(skip)' # Pruned skipped csets
196 pruned = '( (%s) | (%s) | (%s) )' % (goods, bads, skips)
197 pruned = '( (%s) | (%s) | (%s) )' % (goods, bads, skips)
197
198
198 # 'untested' is all cset that are- in 'range', but not in 'pruned'
199 # 'untested' is all cset that are- in 'range', but not in 'pruned'
199 untested = '( (%s) - (%s) )' % (range, pruned)
200 untested = '( (%s) - (%s) )' % (range, pruned)
200
201
201 # 'ignored' is all csets that were not used during the bisection
202 # 'ignored' is all csets that were not used during the bisection
202 # due to DAG topology, but may however have had an impact.
203 # due to DAG topology, but may however have had an impact.
203 # E.g., a branch merged between bads and goods, but whose branch-
204 # E.g., a branch merged between bads and goods, but whose branch-
204 # point is out-side of the range.
205 # point is out-side of the range.
205 iba = '::bisect(bad) - ::bisect(good)' # Ignored bads' ancestors
206 iba = '::bisect(bad) - ::bisect(good)' # Ignored bads' ancestors
206 iga = '::bisect(good) - ::bisect(bad)' # Ignored goods' ancestors
207 iga = '::bisect(good) - ::bisect(bad)' # Ignored goods' ancestors
207 ignored = '( ( (%s) | (%s) ) - (%s) )' % (iba, iga, range)
208 ignored = '( ( (%s) | (%s) ) - (%s) )' % (iba, iga, range)
208
209
209 if status == 'range':
210 if status == 'range':
210 return repo.revs(range)
211 return repo.revs(range)
211 elif status == 'pruned':
212 elif status == 'pruned':
212 return repo.revs(pruned)
213 return repo.revs(pruned)
213 elif status == 'untested':
214 elif status == 'untested':
214 return repo.revs(untested)
215 return repo.revs(untested)
215 elif status == 'ignored':
216 elif status == 'ignored':
216 return repo.revs(ignored)
217 return repo.revs(ignored)
217 elif status == "goods":
218 elif status == "goods":
218 return repo.revs(goods)
219 return repo.revs(goods)
219 elif status == "bads":
220 elif status == "bads":
220 return repo.revs(bads)
221 return repo.revs(bads)
221 else:
222 else:
222 raise error.ParseError(_('invalid bisect state'))
223 raise error.ParseError(_('invalid bisect state'))
223
224
224 def label(repo, node):
225 def label(repo, node):
225 rev = repo.changelog.rev(node)
226 rev = repo.changelog.rev(node)
226
227
227 # Try explicit sets
228 # Try explicit sets
228 if rev in get(repo, 'good'):
229 if rev in get(repo, 'good'):
229 # i18n: bisect changeset status
230 # i18n: bisect changeset status
230 return _('good')
231 return _('good')
231 if rev in get(repo, 'bad'):
232 if rev in get(repo, 'bad'):
232 # i18n: bisect changeset status
233 # i18n: bisect changeset status
233 return _('bad')
234 return _('bad')
234 if rev in get(repo, 'skip'):
235 if rev in get(repo, 'skip'):
235 # i18n: bisect changeset status
236 # i18n: bisect changeset status
236 return _('skipped')
237 return _('skipped')
237 if rev in get(repo, 'untested') or rev in get(repo, 'current'):
238 if rev in get(repo, 'untested') or rev in get(repo, 'current'):
238 # i18n: bisect changeset status
239 # i18n: bisect changeset status
239 return _('untested')
240 return _('untested')
240 if rev in get(repo, 'ignored'):
241 if rev in get(repo, 'ignored'):
241 # i18n: bisect changeset status
242 # i18n: bisect changeset status
242 return _('ignored')
243 return _('ignored')
243
244
244 # Try implicit sets
245 # Try implicit sets
245 if rev in get(repo, 'goods'):
246 if rev in get(repo, 'goods'):
246 # i18n: bisect changeset status
247 # i18n: bisect changeset status
247 return _('good (implicit)')
248 return _('good (implicit)')
248 if rev in get(repo, 'bads'):
249 if rev in get(repo, 'bads'):
249 # i18n: bisect changeset status
250 # i18n: bisect changeset status
250 return _('bad (implicit)')
251 return _('bad (implicit)')
251
252
252 return None
253 return None
253
254
254 def shortlabel(label):
255 def shortlabel(label):
255 if label:
256 if label:
256 return label[0].upper()
257 return label[0].upper()
257
258
258 return None
259 return None
@@ -1,571 +1,571 b''
1 $ hg init
1 $ hg init
2
2
3
3
4 committing changes
4 committing changes
5
5
6 $ count=0
6 $ count=0
7 $ echo > a
7 $ echo > a
8 $ while test $count -lt 32 ; do
8 $ while test $count -lt 32 ; do
9 > echo 'a' >> a
9 > echo 'a' >> a
10 > test $count -eq 0 && hg add
10 > test $count -eq 0 && hg add
11 > hg ci -m "msg $count" -d "$count 0"
11 > hg ci -m "msg $count" -d "$count 0"
12 > count=`expr $count + 1`
12 > count=`expr $count + 1`
13 > done
13 > done
14 adding a
14 adding a
15
15
16
16
17 $ hg log
17 $ hg log
18 changeset: 31:58c80a7c8a40
18 changeset: 31:58c80a7c8a40
19 tag: tip
19 tag: tip
20 user: test
20 user: test
21 date: Thu Jan 01 00:00:31 1970 +0000
21 date: Thu Jan 01 00:00:31 1970 +0000
22 summary: msg 31
22 summary: msg 31
23
23
24 changeset: 30:ed2d2f24b11c
24 changeset: 30:ed2d2f24b11c
25 user: test
25 user: test
26 date: Thu Jan 01 00:00:30 1970 +0000
26 date: Thu Jan 01 00:00:30 1970 +0000
27 summary: msg 30
27 summary: msg 30
28
28
29 changeset: 29:b5bd63375ab9
29 changeset: 29:b5bd63375ab9
30 user: test
30 user: test
31 date: Thu Jan 01 00:00:29 1970 +0000
31 date: Thu Jan 01 00:00:29 1970 +0000
32 summary: msg 29
32 summary: msg 29
33
33
34 changeset: 28:8e0c2264c8af
34 changeset: 28:8e0c2264c8af
35 user: test
35 user: test
36 date: Thu Jan 01 00:00:28 1970 +0000
36 date: Thu Jan 01 00:00:28 1970 +0000
37 summary: msg 28
37 summary: msg 28
38
38
39 changeset: 27:288867a866e9
39 changeset: 27:288867a866e9
40 user: test
40 user: test
41 date: Thu Jan 01 00:00:27 1970 +0000
41 date: Thu Jan 01 00:00:27 1970 +0000
42 summary: msg 27
42 summary: msg 27
43
43
44 changeset: 26:3efc6fd51aeb
44 changeset: 26:3efc6fd51aeb
45 user: test
45 user: test
46 date: Thu Jan 01 00:00:26 1970 +0000
46 date: Thu Jan 01 00:00:26 1970 +0000
47 summary: msg 26
47 summary: msg 26
48
48
49 changeset: 25:02a84173a97a
49 changeset: 25:02a84173a97a
50 user: test
50 user: test
51 date: Thu Jan 01 00:00:25 1970 +0000
51 date: Thu Jan 01 00:00:25 1970 +0000
52 summary: msg 25
52 summary: msg 25
53
53
54 changeset: 24:10e0acd3809e
54 changeset: 24:10e0acd3809e
55 user: test
55 user: test
56 date: Thu Jan 01 00:00:24 1970 +0000
56 date: Thu Jan 01 00:00:24 1970 +0000
57 summary: msg 24
57 summary: msg 24
58
58
59 changeset: 23:5ec79163bff4
59 changeset: 23:5ec79163bff4
60 user: test
60 user: test
61 date: Thu Jan 01 00:00:23 1970 +0000
61 date: Thu Jan 01 00:00:23 1970 +0000
62 summary: msg 23
62 summary: msg 23
63
63
64 changeset: 22:06c7993750ce
64 changeset: 22:06c7993750ce
65 user: test
65 user: test
66 date: Thu Jan 01 00:00:22 1970 +0000
66 date: Thu Jan 01 00:00:22 1970 +0000
67 summary: msg 22
67 summary: msg 22
68
68
69 changeset: 21:e5db6aa3fe2a
69 changeset: 21:e5db6aa3fe2a
70 user: test
70 user: test
71 date: Thu Jan 01 00:00:21 1970 +0000
71 date: Thu Jan 01 00:00:21 1970 +0000
72 summary: msg 21
72 summary: msg 21
73
73
74 changeset: 20:7128fb4fdbc9
74 changeset: 20:7128fb4fdbc9
75 user: test
75 user: test
76 date: Thu Jan 01 00:00:20 1970 +0000
76 date: Thu Jan 01 00:00:20 1970 +0000
77 summary: msg 20
77 summary: msg 20
78
78
79 changeset: 19:52798545b482
79 changeset: 19:52798545b482
80 user: test
80 user: test
81 date: Thu Jan 01 00:00:19 1970 +0000
81 date: Thu Jan 01 00:00:19 1970 +0000
82 summary: msg 19
82 summary: msg 19
83
83
84 changeset: 18:86977a90077e
84 changeset: 18:86977a90077e
85 user: test
85 user: test
86 date: Thu Jan 01 00:00:18 1970 +0000
86 date: Thu Jan 01 00:00:18 1970 +0000
87 summary: msg 18
87 summary: msg 18
88
88
89 changeset: 17:03515f4a9080
89 changeset: 17:03515f4a9080
90 user: test
90 user: test
91 date: Thu Jan 01 00:00:17 1970 +0000
91 date: Thu Jan 01 00:00:17 1970 +0000
92 summary: msg 17
92 summary: msg 17
93
93
94 changeset: 16:a2e6ea4973e9
94 changeset: 16:a2e6ea4973e9
95 user: test
95 user: test
96 date: Thu Jan 01 00:00:16 1970 +0000
96 date: Thu Jan 01 00:00:16 1970 +0000
97 summary: msg 16
97 summary: msg 16
98
98
99 changeset: 15:e7fa0811edb0
99 changeset: 15:e7fa0811edb0
100 user: test
100 user: test
101 date: Thu Jan 01 00:00:15 1970 +0000
101 date: Thu Jan 01 00:00:15 1970 +0000
102 summary: msg 15
102 summary: msg 15
103
103
104 changeset: 14:ce8f0998e922
104 changeset: 14:ce8f0998e922
105 user: test
105 user: test
106 date: Thu Jan 01 00:00:14 1970 +0000
106 date: Thu Jan 01 00:00:14 1970 +0000
107 summary: msg 14
107 summary: msg 14
108
108
109 changeset: 13:9d7d07bc967c
109 changeset: 13:9d7d07bc967c
110 user: test
110 user: test
111 date: Thu Jan 01 00:00:13 1970 +0000
111 date: Thu Jan 01 00:00:13 1970 +0000
112 summary: msg 13
112 summary: msg 13
113
113
114 changeset: 12:1941b52820a5
114 changeset: 12:1941b52820a5
115 user: test
115 user: test
116 date: Thu Jan 01 00:00:12 1970 +0000
116 date: Thu Jan 01 00:00:12 1970 +0000
117 summary: msg 12
117 summary: msg 12
118
118
119 changeset: 11:7b4cd9578619
119 changeset: 11:7b4cd9578619
120 user: test
120 user: test
121 date: Thu Jan 01 00:00:11 1970 +0000
121 date: Thu Jan 01 00:00:11 1970 +0000
122 summary: msg 11
122 summary: msg 11
123
123
124 changeset: 10:7c5eff49a6b6
124 changeset: 10:7c5eff49a6b6
125 user: test
125 user: test
126 date: Thu Jan 01 00:00:10 1970 +0000
126 date: Thu Jan 01 00:00:10 1970 +0000
127 summary: msg 10
127 summary: msg 10
128
128
129 changeset: 9:eb44510ef29a
129 changeset: 9:eb44510ef29a
130 user: test
130 user: test
131 date: Thu Jan 01 00:00:09 1970 +0000
131 date: Thu Jan 01 00:00:09 1970 +0000
132 summary: msg 9
132 summary: msg 9
133
133
134 changeset: 8:453eb4dba229
134 changeset: 8:453eb4dba229
135 user: test
135 user: test
136 date: Thu Jan 01 00:00:08 1970 +0000
136 date: Thu Jan 01 00:00:08 1970 +0000
137 summary: msg 8
137 summary: msg 8
138
138
139 changeset: 7:03750880c6b5
139 changeset: 7:03750880c6b5
140 user: test
140 user: test
141 date: Thu Jan 01 00:00:07 1970 +0000
141 date: Thu Jan 01 00:00:07 1970 +0000
142 summary: msg 7
142 summary: msg 7
143
143
144 changeset: 6:a3d5c6fdf0d3
144 changeset: 6:a3d5c6fdf0d3
145 user: test
145 user: test
146 date: Thu Jan 01 00:00:06 1970 +0000
146 date: Thu Jan 01 00:00:06 1970 +0000
147 summary: msg 6
147 summary: msg 6
148
148
149 changeset: 5:7874a09ea728
149 changeset: 5:7874a09ea728
150 user: test
150 user: test
151 date: Thu Jan 01 00:00:05 1970 +0000
151 date: Thu Jan 01 00:00:05 1970 +0000
152 summary: msg 5
152 summary: msg 5
153
153
154 changeset: 4:9b2ba8336a65
154 changeset: 4:9b2ba8336a65
155 user: test
155 user: test
156 date: Thu Jan 01 00:00:04 1970 +0000
156 date: Thu Jan 01 00:00:04 1970 +0000
157 summary: msg 4
157 summary: msg 4
158
158
159 changeset: 3:b53bea5e2fcb
159 changeset: 3:b53bea5e2fcb
160 user: test
160 user: test
161 date: Thu Jan 01 00:00:03 1970 +0000
161 date: Thu Jan 01 00:00:03 1970 +0000
162 summary: msg 3
162 summary: msg 3
163
163
164 changeset: 2:db07c04beaca
164 changeset: 2:db07c04beaca
165 user: test
165 user: test
166 date: Thu Jan 01 00:00:02 1970 +0000
166 date: Thu Jan 01 00:00:02 1970 +0000
167 summary: msg 2
167 summary: msg 2
168
168
169 changeset: 1:5cd978ea5149
169 changeset: 1:5cd978ea5149
170 user: test
170 user: test
171 date: Thu Jan 01 00:00:01 1970 +0000
171 date: Thu Jan 01 00:00:01 1970 +0000
172 summary: msg 1
172 summary: msg 1
173
173
174 changeset: 0:b99c7b9c8e11
174 changeset: 0:b99c7b9c8e11
175 user: test
175 user: test
176 date: Thu Jan 01 00:00:00 1970 +0000
176 date: Thu Jan 01 00:00:00 1970 +0000
177 summary: msg 0
177 summary: msg 0
178
178
179
179
180 $ hg up -C
180 $ hg up -C
181 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
181 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
182
182
183 bisect test
183 bisect test
184
184
185 $ hg bisect -r
185 $ hg bisect -r
186 $ hg bisect -b
186 $ hg bisect -b
187 $ hg summary
187 $ hg summary
188 parent: 31:58c80a7c8a40 tip
188 parent: 31:58c80a7c8a40 tip
189 msg 31
189 msg 31
190 branch: default
190 branch: default
191 commit: (clean)
191 commit: (clean)
192 update: (current)
192 update: (current)
193 $ hg bisect -g 1
193 $ hg bisect -g 1
194 Testing changeset 16:a2e6ea4973e9 (30 changesets remaining, ~4 tests)
194 Testing changeset 16:a2e6ea4973e9 (30 changesets remaining, ~4 tests)
195 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
195 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 $ hg bisect -g
196 $ hg bisect -g
197 Testing changeset 23:5ec79163bff4 (15 changesets remaining, ~3 tests)
197 Testing changeset 23:5ec79163bff4 (15 changesets remaining, ~3 tests)
198 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
198 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
199
199
200 skip
200 skip
201
201
202 $ hg bisect -s
202 $ hg bisect -s
203 Testing changeset 24:10e0acd3809e (15 changesets remaining, ~3 tests)
203 Testing changeset 24:10e0acd3809e (15 changesets remaining, ~3 tests)
204 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
204 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
205 $ hg bisect -g
205 $ hg bisect -g
206 Testing changeset 27:288867a866e9 (7 changesets remaining, ~2 tests)
206 Testing changeset 27:288867a866e9 (7 changesets remaining, ~2 tests)
207 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
207 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
208 $ hg bisect -g
208 $ hg bisect -g
209 Testing changeset 29:b5bd63375ab9 (4 changesets remaining, ~2 tests)
209 Testing changeset 29:b5bd63375ab9 (4 changesets remaining, ~2 tests)
210 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
210 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
211 $ hg bisect -b
211 $ hg bisect -b
212 Testing changeset 28:8e0c2264c8af (2 changesets remaining, ~1 tests)
212 Testing changeset 28:8e0c2264c8af (2 changesets remaining, ~1 tests)
213 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
213 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
214 $ hg bisect -g
214 $ hg bisect -g
215 The first bad revision is:
215 The first bad revision is:
216 changeset: 29:b5bd63375ab9
216 changeset: 29:b5bd63375ab9
217 user: test
217 user: test
218 date: Thu Jan 01 00:00:29 1970 +0000
218 date: Thu Jan 01 00:00:29 1970 +0000
219 summary: msg 29
219 summary: msg 29
220
220
221
221
222 mark revsets instead of single revs
222 mark revsets instead of single revs
223
223
224 $ hg bisect -r
224 $ hg bisect -r
225 $ hg bisect -b "0::3"
225 $ hg bisect -b "0::3"
226 $ hg bisect -s "13::16"
226 $ hg bisect -s "13::16"
227 $ hg bisect -g "26::tip"
227 $ hg bisect -g "26::tip"
228 Testing changeset 12:1941b52820a5 (23 changesets remaining, ~4 tests)
228 Testing changeset 12:1941b52820a5 (23 changesets remaining, ~4 tests)
229 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
229 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
230 $ cat .hg/bisect.state
230 $ cat .hg/bisect.state
231 bad b99c7b9c8e11558adef3fad9af211c58d46f325b
231 bad b99c7b9c8e11558adef3fad9af211c58d46f325b
232 bad 5cd978ea51499179507ee7b6f340d2dbaa401185
232 bad 5cd978ea51499179507ee7b6f340d2dbaa401185
233 bad db07c04beaca44cf24832541e7f4a2346a95275b
233 bad db07c04beaca44cf24832541e7f4a2346a95275b
234 bad b53bea5e2fcb30d3e00bd3409507a5659ce0fd8b
234 bad b53bea5e2fcb30d3e00bd3409507a5659ce0fd8b
235 current 1941b52820a544549596820a8ae006842b0e2c64
235 current 1941b52820a544549596820a8ae006842b0e2c64
236 good 3efc6fd51aeb8594398044c6c846ca59ae021203
236 good 3efc6fd51aeb8594398044c6c846ca59ae021203
237 good 288867a866e9adb7a29880b66936c874b80f4651
237 good 288867a866e9adb7a29880b66936c874b80f4651
238 good 8e0c2264c8af790daf3585ada0669d93dee09c83
238 good 8e0c2264c8af790daf3585ada0669d93dee09c83
239 good b5bd63375ab9a290419f2024b7f4ee9ea7ce90a8
239 good b5bd63375ab9a290419f2024b7f4ee9ea7ce90a8
240 good ed2d2f24b11c368fa8aa0da9f4e1db580abade59
240 good ed2d2f24b11c368fa8aa0da9f4e1db580abade59
241 good 58c80a7c8a4025a94cedaf7b4a4e3124e8909a96
241 good 58c80a7c8a4025a94cedaf7b4a4e3124e8909a96
242 skip 9d7d07bc967ca98ad0600c24953fd289ad5fa991
242 skip 9d7d07bc967ca98ad0600c24953fd289ad5fa991
243 skip ce8f0998e922c179e80819d5066fbe46e2998784
243 skip ce8f0998e922c179e80819d5066fbe46e2998784
244 skip e7fa0811edb063f6319531f0d0a865882138e180
244 skip e7fa0811edb063f6319531f0d0a865882138e180
245 skip a2e6ea4973e9196ddd3386493b0c214b41fd97d3
245 skip a2e6ea4973e9196ddd3386493b0c214b41fd97d3
246
246
247 bisect reverse test
247 bisect reverse test
248
248
249 $ hg bisect -r
249 $ hg bisect -r
250 $ hg bisect -b null
250 $ hg bisect -b null
251 $ hg bisect -g tip
251 $ hg bisect -g tip
252 Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
252 Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
253 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
253 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 $ hg bisect -g
254 $ hg bisect -g
255 Testing changeset 7:03750880c6b5 (16 changesets remaining, ~4 tests)
255 Testing changeset 7:03750880c6b5 (16 changesets remaining, ~4 tests)
256 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
256 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
257
257
258 skip
258 skip
259
259
260 $ hg bisect -s
260 $ hg bisect -s
261 Testing changeset 6:a3d5c6fdf0d3 (16 changesets remaining, ~4 tests)
261 Testing changeset 6:a3d5c6fdf0d3 (16 changesets remaining, ~4 tests)
262 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
262 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
263 $ hg bisect -g
263 $ hg bisect -g
264 Testing changeset 2:db07c04beaca (7 changesets remaining, ~2 tests)
264 Testing changeset 2:db07c04beaca (7 changesets remaining, ~2 tests)
265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 $ hg bisect -g
266 $ hg bisect -g
267 Testing changeset 0:b99c7b9c8e11 (3 changesets remaining, ~1 tests)
267 Testing changeset 0:b99c7b9c8e11 (3 changesets remaining, ~1 tests)
268 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
268 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
269 $ hg bisect -b
269 $ hg bisect -b
270 Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
270 Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
271 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
271 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
272 $ hg bisect -g
272 $ hg bisect -g
273 The first good revision is:
273 The first good revision is:
274 changeset: 1:5cd978ea5149
274 changeset: 1:5cd978ea5149
275 user: test
275 user: test
276 date: Thu Jan 01 00:00:01 1970 +0000
276 date: Thu Jan 01 00:00:01 1970 +0000
277 summary: msg 1
277 summary: msg 1
278
278
279
279
280 $ hg bisect -r
280 $ hg bisect -r
281 $ hg bisect -g tip
281 $ hg bisect -g tip
282 $ hg bisect -b tip
282 $ hg bisect -b tip
283 abort: starting revisions are not directly related
283 abort: inconsistent state, 31:58c80a7c8a40 is good and bad
284 [255]
284 [255]
285
285
286 $ hg bisect -r
286 $ hg bisect -r
287 $ hg bisect -g null
287 $ hg bisect -g null
288 $ hg bisect -bU tip
288 $ hg bisect -bU tip
289 Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
289 Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
290 $ hg id
290 $ hg id
291 5cd978ea5149
291 5cd978ea5149
292
292
293
293
294 Issue1228: hg bisect crashes when you skip the last rev in bisection
294 Issue1228: hg bisect crashes when you skip the last rev in bisection
295 Issue1182: hg bisect exception
295 Issue1182: hg bisect exception
296
296
297 $ hg bisect -r
297 $ hg bisect -r
298 $ hg bisect -b 4
298 $ hg bisect -b 4
299 $ hg bisect -g 0
299 $ hg bisect -g 0
300 Testing changeset 2:db07c04beaca (4 changesets remaining, ~2 tests)
300 Testing changeset 2:db07c04beaca (4 changesets remaining, ~2 tests)
301 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
301 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
302 $ hg bisect -s
302 $ hg bisect -s
303 Testing changeset 1:5cd978ea5149 (4 changesets remaining, ~2 tests)
303 Testing changeset 1:5cd978ea5149 (4 changesets remaining, ~2 tests)
304 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
304 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
305 $ hg bisect -s
305 $ hg bisect -s
306 Testing changeset 3:b53bea5e2fcb (4 changesets remaining, ~2 tests)
306 Testing changeset 3:b53bea5e2fcb (4 changesets remaining, ~2 tests)
307 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
307 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
308 $ hg bisect -s
308 $ hg bisect -s
309 Due to skipped revisions, the first bad revision could be any of:
309 Due to skipped revisions, the first bad revision could be any of:
310 changeset: 1:5cd978ea5149
310 changeset: 1:5cd978ea5149
311 user: test
311 user: test
312 date: Thu Jan 01 00:00:01 1970 +0000
312 date: Thu Jan 01 00:00:01 1970 +0000
313 summary: msg 1
313 summary: msg 1
314
314
315 changeset: 2:db07c04beaca
315 changeset: 2:db07c04beaca
316 user: test
316 user: test
317 date: Thu Jan 01 00:00:02 1970 +0000
317 date: Thu Jan 01 00:00:02 1970 +0000
318 summary: msg 2
318 summary: msg 2
319
319
320 changeset: 3:b53bea5e2fcb
320 changeset: 3:b53bea5e2fcb
321 user: test
321 user: test
322 date: Thu Jan 01 00:00:03 1970 +0000
322 date: Thu Jan 01 00:00:03 1970 +0000
323 summary: msg 3
323 summary: msg 3
324
324
325 changeset: 4:9b2ba8336a65
325 changeset: 4:9b2ba8336a65
326 user: test
326 user: test
327 date: Thu Jan 01 00:00:04 1970 +0000
327 date: Thu Jan 01 00:00:04 1970 +0000
328 summary: msg 4
328 summary: msg 4
329
329
330
330
331
331
332 reproduce non converging bisect, issue1182
332 reproduce non converging bisect, issue1182
333
333
334 $ hg bisect -r
334 $ hg bisect -r
335 $ hg bisect -g 0
335 $ hg bisect -g 0
336 $ hg bisect -b 2
336 $ hg bisect -b 2
337 Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
337 Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
338 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
338 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
339 $ hg bisect -s
339 $ hg bisect -s
340 Due to skipped revisions, the first bad revision could be any of:
340 Due to skipped revisions, the first bad revision could be any of:
341 changeset: 1:5cd978ea5149
341 changeset: 1:5cd978ea5149
342 user: test
342 user: test
343 date: Thu Jan 01 00:00:01 1970 +0000
343 date: Thu Jan 01 00:00:01 1970 +0000
344 summary: msg 1
344 summary: msg 1
345
345
346 changeset: 2:db07c04beaca
346 changeset: 2:db07c04beaca
347 user: test
347 user: test
348 date: Thu Jan 01 00:00:02 1970 +0000
348 date: Thu Jan 01 00:00:02 1970 +0000
349 summary: msg 2
349 summary: msg 2
350
350
351
351
352
352
353 test no action
353 test no action
354
354
355 $ hg bisect -r
355 $ hg bisect -r
356 $ hg bisect
356 $ hg bisect
357 abort: cannot bisect (no known good revisions)
357 abort: cannot bisect (no known good revisions)
358 [255]
358 [255]
359
359
360
360
361 reproduce AssertionError, issue1445
361 reproduce AssertionError, issue1445
362
362
363 $ hg bisect -r
363 $ hg bisect -r
364 $ hg bisect -b 6
364 $ hg bisect -b 6
365 $ hg bisect -g 0
365 $ hg bisect -g 0
366 Testing changeset 3:b53bea5e2fcb (6 changesets remaining, ~2 tests)
366 Testing changeset 3:b53bea5e2fcb (6 changesets remaining, ~2 tests)
367 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
367 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
368 $ hg bisect -s
368 $ hg bisect -s
369 Testing changeset 2:db07c04beaca (6 changesets remaining, ~2 tests)
369 Testing changeset 2:db07c04beaca (6 changesets remaining, ~2 tests)
370 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
370 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
371 $ hg bisect -s
371 $ hg bisect -s
372 Testing changeset 4:9b2ba8336a65 (6 changesets remaining, ~2 tests)
372 Testing changeset 4:9b2ba8336a65 (6 changesets remaining, ~2 tests)
373 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
373 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
374 $ hg bisect -s
374 $ hg bisect -s
375 Testing changeset 1:5cd978ea5149 (6 changesets remaining, ~2 tests)
375 Testing changeset 1:5cd978ea5149 (6 changesets remaining, ~2 tests)
376 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
376 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
377 $ hg bisect -s
377 $ hg bisect -s
378 Testing changeset 5:7874a09ea728 (6 changesets remaining, ~2 tests)
378 Testing changeset 5:7874a09ea728 (6 changesets remaining, ~2 tests)
379 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
379 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
380 $ hg bisect -g
380 $ hg bisect -g
381 The first bad revision is:
381 The first bad revision is:
382 changeset: 6:a3d5c6fdf0d3
382 changeset: 6:a3d5c6fdf0d3
383 user: test
383 user: test
384 date: Thu Jan 01 00:00:06 1970 +0000
384 date: Thu Jan 01 00:00:06 1970 +0000
385 summary: msg 6
385 summary: msg 6
386
386
387 $ hg log -r "bisect(good)"
387 $ hg log -r "bisect(good)"
388 changeset: 0:b99c7b9c8e11
388 changeset: 0:b99c7b9c8e11
389 user: test
389 user: test
390 date: Thu Jan 01 00:00:00 1970 +0000
390 date: Thu Jan 01 00:00:00 1970 +0000
391 summary: msg 0
391 summary: msg 0
392
392
393 changeset: 5:7874a09ea728
393 changeset: 5:7874a09ea728
394 user: test
394 user: test
395 date: Thu Jan 01 00:00:05 1970 +0000
395 date: Thu Jan 01 00:00:05 1970 +0000
396 summary: msg 5
396 summary: msg 5
397
397
398 $ hg log -r "bisect(bad)"
398 $ hg log -r "bisect(bad)"
399 changeset: 6:a3d5c6fdf0d3
399 changeset: 6:a3d5c6fdf0d3
400 user: test
400 user: test
401 date: Thu Jan 01 00:00:06 1970 +0000
401 date: Thu Jan 01 00:00:06 1970 +0000
402 summary: msg 6
402 summary: msg 6
403
403
404 $ hg log -r "bisect(current)"
404 $ hg log -r "bisect(current)"
405 changeset: 5:7874a09ea728
405 changeset: 5:7874a09ea728
406 user: test
406 user: test
407 date: Thu Jan 01 00:00:05 1970 +0000
407 date: Thu Jan 01 00:00:05 1970 +0000
408 summary: msg 5
408 summary: msg 5
409
409
410 $ hg log -r "bisect(skip)"
410 $ hg log -r "bisect(skip)"
411 changeset: 1:5cd978ea5149
411 changeset: 1:5cd978ea5149
412 user: test
412 user: test
413 date: Thu Jan 01 00:00:01 1970 +0000
413 date: Thu Jan 01 00:00:01 1970 +0000
414 summary: msg 1
414 summary: msg 1
415
415
416 changeset: 2:db07c04beaca
416 changeset: 2:db07c04beaca
417 user: test
417 user: test
418 date: Thu Jan 01 00:00:02 1970 +0000
418 date: Thu Jan 01 00:00:02 1970 +0000
419 summary: msg 2
419 summary: msg 2
420
420
421 changeset: 3:b53bea5e2fcb
421 changeset: 3:b53bea5e2fcb
422 user: test
422 user: test
423 date: Thu Jan 01 00:00:03 1970 +0000
423 date: Thu Jan 01 00:00:03 1970 +0000
424 summary: msg 3
424 summary: msg 3
425
425
426 changeset: 4:9b2ba8336a65
426 changeset: 4:9b2ba8336a65
427 user: test
427 user: test
428 date: Thu Jan 01 00:00:04 1970 +0000
428 date: Thu Jan 01 00:00:04 1970 +0000
429 summary: msg 4
429 summary: msg 4
430
430
431
431
432 test legacy bisected() keyword
432 test legacy bisected() keyword
433
433
434 $ hg log -r "bisected(bad)"
434 $ hg log -r "bisected(bad)"
435 changeset: 6:a3d5c6fdf0d3
435 changeset: 6:a3d5c6fdf0d3
436 user: test
436 user: test
437 date: Thu Jan 01 00:00:06 1970 +0000
437 date: Thu Jan 01 00:00:06 1970 +0000
438 summary: msg 6
438 summary: msg 6
439
439
440
440
441 $ set +e
441 $ set +e
442
442
443 test invalid command
443 test invalid command
444 assuming that the shell returns 127 if command not found ...
444 assuming that the shell returns 127 if command not found ...
445
445
446 $ hg bisect -r
446 $ hg bisect -r
447 $ hg bisect --command 'exit 127'
447 $ hg bisect --command 'exit 127'
448 abort: failed to execute exit 127
448 abort: failed to execute exit 127
449 [255]
449 [255]
450
450
451
451
452 test bisecting command
452 test bisecting command
453
453
454 $ cat > script.py <<EOF
454 $ cat > script.py <<EOF
455 > #!/usr/bin/env python
455 > #!/usr/bin/env python
456 > import sys
456 > import sys
457 > from mercurial import ui, hg
457 > from mercurial import ui, hg
458 > repo = hg.repository(ui.ui(), '.')
458 > repo = hg.repository(ui.ui(), '.')
459 > if repo['.'].rev() < 6:
459 > if repo['.'].rev() < 6:
460 > sys.exit(1)
460 > sys.exit(1)
461 > EOF
461 > EOF
462 $ chmod +x script.py
462 $ chmod +x script.py
463 $ hg bisect -r
463 $ hg bisect -r
464 $ hg bisect --good tip
464 $ hg bisect --good tip
465 $ hg bisect --bad 0
465 $ hg bisect --bad 0
466 Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
466 Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
467 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
467 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
468 $ hg bisect --command "python \"$TESTTMP/script.py\" and some parameters"
468 $ hg bisect --command "python \"$TESTTMP/script.py\" and some parameters"
469 changeset 15:e7fa0811edb0: good
469 changeset 15:e7fa0811edb0: good
470 changeset 7:03750880c6b5: good
470 changeset 7:03750880c6b5: good
471 changeset 3:b53bea5e2fcb: bad
471 changeset 3:b53bea5e2fcb: bad
472 changeset 5:7874a09ea728: bad
472 changeset 5:7874a09ea728: bad
473 changeset 6:a3d5c6fdf0d3: good
473 changeset 6:a3d5c6fdf0d3: good
474 The first good revision is:
474 The first good revision is:
475 changeset: 6:a3d5c6fdf0d3
475 changeset: 6:a3d5c6fdf0d3
476 user: test
476 user: test
477 date: Thu Jan 01 00:00:06 1970 +0000
477 date: Thu Jan 01 00:00:06 1970 +0000
478 summary: msg 6
478 summary: msg 6
479
479
480
480
481
481
482 test bisecting via a command without updating the working dir, and
482 test bisecting via a command without updating the working dir, and
483 ensure that the bisect state file is updated before running a test
483 ensure that the bisect state file is updated before running a test
484 command
484 command
485
485
486 $ hg update null
486 $ hg update null
487 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
487 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
488 $ cat > script.sh <<'EOF'
488 $ cat > script.sh <<'EOF'
489 > #!/bin/sh
489 > #!/bin/sh
490 > test -n "$HG_NODE" || (echo HG_NODE missing; exit 127)
490 > test -n "$HG_NODE" || (echo HG_NODE missing; exit 127)
491 > current="`hg log -r \"bisect(current)\" --template {node}`"
491 > current="`hg log -r \"bisect(current)\" --template {node}`"
492 > test "$current" = "$HG_NODE" || (echo current is bad: $current; exit 127)
492 > test "$current" = "$HG_NODE" || (echo current is bad: $current; exit 127)
493 > rev="`hg log -r $HG_NODE --template {rev}`"
493 > rev="`hg log -r $HG_NODE --template {rev}`"
494 > test "$rev" -ge 6
494 > test "$rev" -ge 6
495 > EOF
495 > EOF
496 $ chmod +x script.sh
496 $ chmod +x script.sh
497 $ hg bisect -r
497 $ hg bisect -r
498 $ hg bisect --good tip --noupdate
498 $ hg bisect --good tip --noupdate
499 $ hg bisect --bad 0 --noupdate
499 $ hg bisect --bad 0 --noupdate
500 Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
500 Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
501 $ hg bisect --command "sh \"$TESTTMP/script.sh\" and some params" --noupdate
501 $ hg bisect --command "sh \"$TESTTMP/script.sh\" and some params" --noupdate
502 changeset 15:e7fa0811edb0: good
502 changeset 15:e7fa0811edb0: good
503 changeset 7:03750880c6b5: good
503 changeset 7:03750880c6b5: good
504 changeset 3:b53bea5e2fcb: bad
504 changeset 3:b53bea5e2fcb: bad
505 changeset 5:7874a09ea728: bad
505 changeset 5:7874a09ea728: bad
506 changeset 6:a3d5c6fdf0d3: good
506 changeset 6:a3d5c6fdf0d3: good
507 The first good revision is:
507 The first good revision is:
508 changeset: 6:a3d5c6fdf0d3
508 changeset: 6:a3d5c6fdf0d3
509 user: test
509 user: test
510 date: Thu Jan 01 00:00:06 1970 +0000
510 date: Thu Jan 01 00:00:06 1970 +0000
511 summary: msg 6
511 summary: msg 6
512
512
513
513
514 ensure that we still don't have a working dir
514 ensure that we still don't have a working dir
515
515
516 $ hg parents
516 $ hg parents
517
517
518
518
519 Check that bisect does not break on obsolete changesets
519 Check that bisect does not break on obsolete changesets
520 =========================================================
520 =========================================================
521
521
522 $ cat > ${TESTTMP}/obs.py << EOF
522 $ cat > ${TESTTMP}/obs.py << EOF
523 > import mercurial.obsolete
523 > import mercurial.obsolete
524 > mercurial.obsolete._enabled = True
524 > mercurial.obsolete._enabled = True
525 > EOF
525 > EOF
526 $ echo '[extensions]' >> $HGRCPATH
526 $ echo '[extensions]' >> $HGRCPATH
527 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
527 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
528
528
529 tip is obsolete
529 tip is obsolete
530 ---------------------
530 ---------------------
531
531
532 $ hg debugobsolete `hg id --debug -i -r tip`
532 $ hg debugobsolete `hg id --debug -i -r tip`
533 $ hg bisect --reset
533 $ hg bisect --reset
534 $ hg bisect --good 15
534 $ hg bisect --good 15
535 $ hg bisect --bad 30
535 $ hg bisect --bad 30
536 Testing changeset 22:06c7993750ce (15 changesets remaining, ~3 tests)
536 Testing changeset 22:06c7993750ce (15 changesets remaining, ~3 tests)
537 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
537 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
538 $ hg bisect --command true
538 $ hg bisect --command true
539 changeset 22:06c7993750ce: good
539 changeset 22:06c7993750ce: good
540 changeset 26:3efc6fd51aeb: good
540 changeset 26:3efc6fd51aeb: good
541 changeset 28:8e0c2264c8af: good
541 changeset 28:8e0c2264c8af: good
542 changeset 29:b5bd63375ab9: good
542 changeset 29:b5bd63375ab9: good
543 The first bad revision is:
543 The first bad revision is:
544 changeset: 30:ed2d2f24b11c
544 changeset: 30:ed2d2f24b11c
545 tag: tip
545 tag: tip
546 user: test
546 user: test
547 date: Thu Jan 01 00:00:30 1970 +0000
547 date: Thu Jan 01 00:00:30 1970 +0000
548 summary: msg 30
548 summary: msg 30
549
549
550
550
551 Changeset in the bad:good range is obsolete
551 Changeset in the bad:good range is obsolete
552 ---------------------------------------------
552 ---------------------------------------------
553
553
554 $ hg up 30
554 $ hg up 30
555 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
555 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
556 $ echo 'a' >> a
556 $ echo 'a' >> a
557 $ hg ci -m "msg 32" -d "32 0"
557 $ hg ci -m "msg 32" -d "32 0"
558 $ hg bisect --reset
558 $ hg bisect --reset
559 $ hg bisect --good .
559 $ hg bisect --good .
560 $ hg bisect --bad 25
560 $ hg bisect --bad 25
561 Testing changeset 28:8e0c2264c8af (6 changesets remaining, ~2 tests)
561 Testing changeset 28:8e0c2264c8af (6 changesets remaining, ~2 tests)
562 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
562 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
563 $ hg bisect --command true
563 $ hg bisect --command true
564 changeset 28:8e0c2264c8af: good
564 changeset 28:8e0c2264c8af: good
565 changeset 26:3efc6fd51aeb: good
565 changeset 26:3efc6fd51aeb: good
566 The first good revision is:
566 The first good revision is:
567 changeset: 26:3efc6fd51aeb
567 changeset: 26:3efc6fd51aeb
568 user: test
568 user: test
569 date: Thu Jan 01 00:00:26 1970 +0000
569 date: Thu Jan 01 00:00:26 1970 +0000
570 summary: msg 26
570 summary: msg 26
571
571
General Comments 0
You need to be logged in to leave comments. Login now