##// END OF EJS Templates
hbisect: do not assume that min(good) is an ancestor of min(bad)...
Alexander Krauss -
r14895:a35d6f82 default
parent child Browse files
Show More
@@ -1,155 +1,156 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
11 import os
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 goodrev
38 # set nodes descended from goodrevs
39 ancestors[goodrev] = []
39 for rev in goodrevs:
40 ancestors[rev] = []
40 for rev in xrange(goodrev + 1, len(changelog)):
41 for rev in xrange(goodrev + 1, len(changelog)):
41 for prev in clparents(rev):
42 for prev in clparents(rev):
42 if ancestors[prev] == []:
43 if ancestors[prev] == []:
43 ancestors[rev] = []
44 ancestors[rev] = []
44
45
45 # clear good revs from array
46 # clear good revs from array
46 for rev in goodrevs:
47 for rev in goodrevs:
47 ancestors[rev] = None
48 ancestors[rev] = None
48 for rev in xrange(len(changelog), goodrev, -1):
49 for rev in xrange(len(changelog), goodrev, -1):
49 if ancestors[rev] is None:
50 if ancestors[rev] is None:
50 for prev in clparents(rev):
51 for prev in clparents(rev):
51 ancestors[prev] = None
52 ancestors[prev] = None
52
53
53 if ancestors[badrev] is None:
54 if ancestors[badrev] is None:
54 return badrev, None
55 return badrev, None
55 return badrev, ancestors
56 return badrev, ancestors
56
57
57 good = False
58 good = False
58 badrev, ancestors = buildancestors(state['bad'], state['good'])
59 badrev, ancestors = buildancestors(state['bad'], state['good'])
59 if not ancestors: # looking for bad to good transition?
60 if not ancestors: # looking for bad to good transition?
60 good = True
61 good = True
61 badrev, ancestors = buildancestors(state['good'], state['bad'])
62 badrev, ancestors = buildancestors(state['good'], state['bad'])
62 bad = changelog.node(badrev)
63 bad = changelog.node(badrev)
63 if not ancestors: # now we're confused
64 if not ancestors: # now we're confused
64 if len(state['bad']) == 1 and len(state['good']) == 1:
65 if len(state['bad']) == 1 and len(state['good']) == 1:
65 raise util.Abort(_("starting revisions are not directly related"))
66 raise util.Abort(_("starting revisions are not directly related"))
66 raise util.Abort(_("inconsistent state, %s:%s is good and bad")
67 raise util.Abort(_("inconsistent state, %s:%s is good and bad")
67 % (badrev, short(bad)))
68 % (badrev, short(bad)))
68
69
69 # build children dict
70 # build children dict
70 children = {}
71 children = {}
71 visit = [badrev]
72 visit = [badrev]
72 candidates = []
73 candidates = []
73 while visit:
74 while visit:
74 rev = visit.pop(0)
75 rev = visit.pop(0)
75 if ancestors[rev] == []:
76 if ancestors[rev] == []:
76 candidates.append(rev)
77 candidates.append(rev)
77 for prev in clparents(rev):
78 for prev in clparents(rev):
78 if prev != -1:
79 if prev != -1:
79 if prev in children:
80 if prev in children:
80 children[prev].append(rev)
81 children[prev].append(rev)
81 else:
82 else:
82 children[prev] = [rev]
83 children[prev] = [rev]
83 visit.append(prev)
84 visit.append(prev)
84
85
85 candidates.sort()
86 candidates.sort()
86 # have we narrowed it down to one entry?
87 # have we narrowed it down to one entry?
87 # or have all other possible candidates besides 'bad' have been skipped?
88 # or have all other possible candidates besides 'bad' have been skipped?
88 tot = len(candidates)
89 tot = len(candidates)
89 unskipped = [c for c in candidates if (c not in skip) and (c != badrev)]
90 unskipped = [c for c in candidates if (c not in skip) and (c != badrev)]
90 if tot == 1 or not unskipped:
91 if tot == 1 or not unskipped:
91 return ([changelog.node(rev) for rev in candidates], 0, good)
92 return ([changelog.node(rev) for rev in candidates], 0, good)
92 perfect = tot // 2
93 perfect = tot // 2
93
94
94 # find the best node to test
95 # find the best node to test
95 best_rev = None
96 best_rev = None
96 best_len = -1
97 best_len = -1
97 poison = set()
98 poison = set()
98 for rev in candidates:
99 for rev in candidates:
99 if rev in poison:
100 if rev in poison:
100 # poison children
101 # poison children
101 poison.update(children.get(rev, []))
102 poison.update(children.get(rev, []))
102 continue
103 continue
103
104
104 a = ancestors[rev] or [rev]
105 a = ancestors[rev] or [rev]
105 ancestors[rev] = None
106 ancestors[rev] = None
106
107
107 x = len(a) # number of ancestors
108 x = len(a) # number of ancestors
108 y = tot - x # number of non-ancestors
109 y = tot - x # number of non-ancestors
109 value = min(x, y) # how good is this test?
110 value = min(x, y) # how good is this test?
110 if value > best_len and rev not in skip:
111 if value > best_len and rev not in skip:
111 best_len = value
112 best_len = value
112 best_rev = rev
113 best_rev = rev
113 if value == perfect: # found a perfect candidate? quit early
114 if value == perfect: # found a perfect candidate? quit early
114 break
115 break
115
116
116 if y < perfect and rev not in skip: # all downhill from here?
117 if y < perfect and rev not in skip: # all downhill from here?
117 # poison children
118 # poison children
118 poison.update(children.get(rev, []))
119 poison.update(children.get(rev, []))
119 continue
120 continue
120
121
121 for c in children.get(rev, []):
122 for c in children.get(rev, []):
122 if ancestors[c]:
123 if ancestors[c]:
123 ancestors[c] = list(set(ancestors[c] + a))
124 ancestors[c] = list(set(ancestors[c] + a))
124 else:
125 else:
125 ancestors[c] = a + [c]
126 ancestors[c] = a + [c]
126
127
127 assert best_rev is not None
128 assert best_rev is not None
128 best_node = changelog.node(best_rev)
129 best_node = changelog.node(best_rev)
129
130
130 return ([best_node], tot, good)
131 return ([best_node], tot, good)
131
132
132
133
133 def load_state(repo):
134 def load_state(repo):
134 state = {'good': [], 'bad': [], 'skip': []}
135 state = {'good': [], 'bad': [], 'skip': []}
135 if os.path.exists(repo.join("bisect.state")):
136 if os.path.exists(repo.join("bisect.state")):
136 for l in repo.opener("bisect.state"):
137 for l in repo.opener("bisect.state"):
137 kind, node = l[:-1].split()
138 kind, node = l[:-1].split()
138 node = repo.lookup(node)
139 node = repo.lookup(node)
139 if kind not in state:
140 if kind not in state:
140 raise util.Abort(_("unknown bisect kind %s") % kind)
141 raise util.Abort(_("unknown bisect kind %s") % kind)
141 state[kind].append(node)
142 state[kind].append(node)
142 return state
143 return state
143
144
144
145
145 def save_state(repo, state):
146 def save_state(repo, state):
146 f = repo.opener("bisect.state", "w", atomictemp=True)
147 f = repo.opener("bisect.state", "w", atomictemp=True)
147 wlock = repo.wlock()
148 wlock = repo.wlock()
148 try:
149 try:
149 for kind in state:
150 for kind in state:
150 for node in state[kind]:
151 for node in state[kind]:
151 f.write("%s %s\n" % (kind, hex(node)))
152 f.write("%s %s\n" % (kind, hex(node)))
152 f.rename()
153 f.rename()
153 finally:
154 finally:
154 wlock.release()
155 wlock.release()
155
156
@@ -1,433 +1,452 b''
1 # The tests in test-bisect are done on a linear history. Here the
1 # The tests in test-bisect are done on a linear history. Here the
2 # following repository history is used for testing:
2 # following repository history is used for testing:
3 #
3 #
4 # 17
4 # 17
5 # |
5 # |
6 # 18 16
6 # 18 16
7 # \ /
7 # \ /
8 # 15
8 # 15
9 # / \
9 # / \
10 # / \
10 # / \
11 # 10 13
11 # 10 13
12 # / \ |
12 # / \ |
13 # / \ | 14
13 # / \ | 14
14 # 7 6 9 12 /
14 # 7 6 9 12 /
15 # \ / \ | |/
15 # \ / \ | |/
16 # 4 \ | 11
16 # 4 \ | 11
17 # \ \ | /
17 # \ \ | /
18 # 3 5 | /
18 # 3 5 | /
19 # \ / |/
19 # \ / |/
20 # 2 8
20 # 2 8
21 # \ /
21 # \ /
22 # 1
22 # 1
23 # |
23 # |
24 # 0
24 # 0
25
25
26 init
26 init
27
27
28 $ hg init
28 $ hg init
29
29
30 committing changes
30 committing changes
31
31
32 $ echo > a
32 $ echo > a
33 $ echo '0' >> a
33 $ echo '0' >> a
34 $ hg add a
34 $ hg add a
35 $ hg ci -m "0" -d "0 0"
35 $ hg ci -m "0" -d "0 0"
36 $ echo '1' >> a
36 $ echo '1' >> a
37 $ hg ci -m "1" -d "1 0"
37 $ hg ci -m "1" -d "1 0"
38 $ echo '2' >> a
38 $ echo '2' >> a
39 $ hg ci -m "2" -d "2 0"
39 $ hg ci -m "2" -d "2 0"
40 $ echo '3' >> a
40 $ echo '3' >> a
41 $ hg ci -m "3" -d "3 0"
41 $ hg ci -m "3" -d "3 0"
42 $ echo '4' >> a
42 $ echo '4' >> a
43 $ hg ci -m "4" -d "4 0"
43 $ hg ci -m "4" -d "4 0"
44
44
45 create branch
45 create branch
46
46
47 $ hg up -r 2
47 $ hg up -r 2
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
49 $ echo '5' >> b
49 $ echo '5' >> b
50 $ hg add b
50 $ hg add b
51 $ hg ci -m "5" -d "5 0"
51 $ hg ci -m "5" -d "5 0"
52 created new head
52 created new head
53
53
54 merge
54 merge
55
55
56 $ hg merge
56 $ hg merge
57 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
57 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
58 (branch merge, don't forget to commit)
58 (branch merge, don't forget to commit)
59 $ hg ci -m "merge 4,5" -d "6 0"
59 $ hg ci -m "merge 4,5" -d "6 0"
60
60
61 create branch
61 create branch
62
62
63 $ hg up -r 4
63 $ hg up -r 4
64 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
64 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
65 $ echo '7' > c
65 $ echo '7' > c
66 $ hg add c
66 $ hg add c
67 $ hg ci -m "7" -d "7 0"
67 $ hg ci -m "7" -d "7 0"
68 created new head
68 created new head
69
69
70 create branch
70 create branch
71
71
72 $ hg up -r 1
72 $ hg up -r 1
73 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
73 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
74 $ echo '8' > d
74 $ echo '8' > d
75 $ hg add d
75 $ hg add d
76 $ hg ci -m "8" -d "8 0"
76 $ hg ci -m "8" -d "8 0"
77 created new head
77 created new head
78 $ echo '9' >> d
78 $ echo '9' >> d
79 $ hg ci -m "9" -d "9 0"
79 $ hg ci -m "9" -d "9 0"
80
80
81 merge
81 merge
82
82
83 $ hg merge -r 6
83 $ hg merge -r 6
84 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
84 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
85 (branch merge, don't forget to commit)
85 (branch merge, don't forget to commit)
86 $ hg ci -m "merge 6,9" -d "10 0"
86 $ hg ci -m "merge 6,9" -d "10 0"
87
87
88 create branch
88 create branch
89
89
90 $ hg up -r 8
90 $ hg up -r 8
91 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
91 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
92 $ echo '11' > e
92 $ echo '11' > e
93 $ hg add e
93 $ hg add e
94 $ hg ci -m "11" -d "11 0"
94 $ hg ci -m "11" -d "11 0"
95 created new head
95 created new head
96 $ echo '12' >> e
96 $ echo '12' >> e
97 $ hg ci -m "12" -d "12 0"
97 $ hg ci -m "12" -d "12 0"
98 $ echo '13' >> e
98 $ echo '13' >> e
99 $ hg ci -m "13" -d "13 0"
99 $ hg ci -m "13" -d "13 0"
100
100
101 create branch
101 create branch
102
102
103 $ hg up -r 11
103 $ hg up -r 11
104 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
104 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
105 $ echo '14' > f
105 $ echo '14' > f
106 $ hg add f
106 $ hg add f
107 $ hg ci -m "14" -d "14 0"
107 $ hg ci -m "14" -d "14 0"
108 created new head
108 created new head
109
109
110 merge
110 merge
111
111
112 $ hg up -r 13 -C
112 $ hg up -r 13 -C
113 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
113 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
114 $ hg merge -r 10
114 $ hg merge -r 10
115 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
115 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
116 (branch merge, don't forget to commit)
116 (branch merge, don't forget to commit)
117 $ hg ci -m "merge 10,13" -d "15 0"
117 $ hg ci -m "merge 10,13" -d "15 0"
118 $ echo '16' >> e
118 $ echo '16' >> e
119 $ hg ci -m "16" -d "16 0"
119 $ hg ci -m "16" -d "16 0"
120 $ echo '17' >> e
120 $ echo '17' >> e
121 $ hg ci -m "17" -d "17 0"
121 $ hg ci -m "17" -d "17 0"
122
122
123 create branch
123 create branch
124
124
125 $ hg up -r 15
125 $ hg up -r 15
126 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
126 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
127 $ echo '18' >> e
127 $ echo '18' >> e
128 $ hg ci -m "18" -d "18 0"
128 $ hg ci -m "18" -d "18 0"
129 created new head
129 created new head
130
130
131 log
131 log
132
132
133 $ hg log
133 $ hg log
134 changeset: 18:d42e18c7bc9b
134 changeset: 18:d42e18c7bc9b
135 tag: tip
135 tag: tip
136 parent: 15:857b178a7cf3
136 parent: 15:857b178a7cf3
137 user: test
137 user: test
138 date: Thu Jan 01 00:00:18 1970 +0000
138 date: Thu Jan 01 00:00:18 1970 +0000
139 summary: 18
139 summary: 18
140
140
141 changeset: 17:228c06deef46
141 changeset: 17:228c06deef46
142 user: test
142 user: test
143 date: Thu Jan 01 00:00:17 1970 +0000
143 date: Thu Jan 01 00:00:17 1970 +0000
144 summary: 17
144 summary: 17
145
145
146 changeset: 16:609d82a7ebae
146 changeset: 16:609d82a7ebae
147 user: test
147 user: test
148 date: Thu Jan 01 00:00:16 1970 +0000
148 date: Thu Jan 01 00:00:16 1970 +0000
149 summary: 16
149 summary: 16
150
150
151 changeset: 15:857b178a7cf3
151 changeset: 15:857b178a7cf3
152 parent: 13:b0a32c86eb31
152 parent: 13:b0a32c86eb31
153 parent: 10:429fcd26f52d
153 parent: 10:429fcd26f52d
154 user: test
154 user: test
155 date: Thu Jan 01 00:00:15 1970 +0000
155 date: Thu Jan 01 00:00:15 1970 +0000
156 summary: merge 10,13
156 summary: merge 10,13
157
157
158 changeset: 14:faa450606157
158 changeset: 14:faa450606157
159 parent: 11:82ca6f06eccd
159 parent: 11:82ca6f06eccd
160 user: test
160 user: test
161 date: Thu Jan 01 00:00:14 1970 +0000
161 date: Thu Jan 01 00:00:14 1970 +0000
162 summary: 14
162 summary: 14
163
163
164 changeset: 13:b0a32c86eb31
164 changeset: 13:b0a32c86eb31
165 user: test
165 user: test
166 date: Thu Jan 01 00:00:13 1970 +0000
166 date: Thu Jan 01 00:00:13 1970 +0000
167 summary: 13
167 summary: 13
168
168
169 changeset: 12:9f259202bbe7
169 changeset: 12:9f259202bbe7
170 user: test
170 user: test
171 date: Thu Jan 01 00:00:12 1970 +0000
171 date: Thu Jan 01 00:00:12 1970 +0000
172 summary: 12
172 summary: 12
173
173
174 changeset: 11:82ca6f06eccd
174 changeset: 11:82ca6f06eccd
175 parent: 8:dab8161ac8fc
175 parent: 8:dab8161ac8fc
176 user: test
176 user: test
177 date: Thu Jan 01 00:00:11 1970 +0000
177 date: Thu Jan 01 00:00:11 1970 +0000
178 summary: 11
178 summary: 11
179
179
180 changeset: 10:429fcd26f52d
180 changeset: 10:429fcd26f52d
181 parent: 9:3c77083deb4a
181 parent: 9:3c77083deb4a
182 parent: 6:a214d5d3811a
182 parent: 6:a214d5d3811a
183 user: test
183 user: test
184 date: Thu Jan 01 00:00:10 1970 +0000
184 date: Thu Jan 01 00:00:10 1970 +0000
185 summary: merge 6,9
185 summary: merge 6,9
186
186
187 changeset: 9:3c77083deb4a
187 changeset: 9:3c77083deb4a
188 user: test
188 user: test
189 date: Thu Jan 01 00:00:09 1970 +0000
189 date: Thu Jan 01 00:00:09 1970 +0000
190 summary: 9
190 summary: 9
191
191
192 changeset: 8:dab8161ac8fc
192 changeset: 8:dab8161ac8fc
193 parent: 1:4ca5088da217
193 parent: 1:4ca5088da217
194 user: test
194 user: test
195 date: Thu Jan 01 00:00:08 1970 +0000
195 date: Thu Jan 01 00:00:08 1970 +0000
196 summary: 8
196 summary: 8
197
197
198 changeset: 7:50c76098bbf2
198 changeset: 7:50c76098bbf2
199 parent: 4:5c668c22234f
199 parent: 4:5c668c22234f
200 user: test
200 user: test
201 date: Thu Jan 01 00:00:07 1970 +0000
201 date: Thu Jan 01 00:00:07 1970 +0000
202 summary: 7
202 summary: 7
203
203
204 changeset: 6:a214d5d3811a
204 changeset: 6:a214d5d3811a
205 parent: 5:385a529b6670
205 parent: 5:385a529b6670
206 parent: 4:5c668c22234f
206 parent: 4:5c668c22234f
207 user: test
207 user: test
208 date: Thu Jan 01 00:00:06 1970 +0000
208 date: Thu Jan 01 00:00:06 1970 +0000
209 summary: merge 4,5
209 summary: merge 4,5
210
210
211 changeset: 5:385a529b6670
211 changeset: 5:385a529b6670
212 parent: 2:051e12f87bf1
212 parent: 2:051e12f87bf1
213 user: test
213 user: test
214 date: Thu Jan 01 00:00:05 1970 +0000
214 date: Thu Jan 01 00:00:05 1970 +0000
215 summary: 5
215 summary: 5
216
216
217 changeset: 4:5c668c22234f
217 changeset: 4:5c668c22234f
218 user: test
218 user: test
219 date: Thu Jan 01 00:00:04 1970 +0000
219 date: Thu Jan 01 00:00:04 1970 +0000
220 summary: 4
220 summary: 4
221
221
222 changeset: 3:0950834f0a9c
222 changeset: 3:0950834f0a9c
223 user: test
223 user: test
224 date: Thu Jan 01 00:00:03 1970 +0000
224 date: Thu Jan 01 00:00:03 1970 +0000
225 summary: 3
225 summary: 3
226
226
227 changeset: 2:051e12f87bf1
227 changeset: 2:051e12f87bf1
228 user: test
228 user: test
229 date: Thu Jan 01 00:00:02 1970 +0000
229 date: Thu Jan 01 00:00:02 1970 +0000
230 summary: 2
230 summary: 2
231
231
232 changeset: 1:4ca5088da217
232 changeset: 1:4ca5088da217
233 user: test
233 user: test
234 date: Thu Jan 01 00:00:01 1970 +0000
234 date: Thu Jan 01 00:00:01 1970 +0000
235 summary: 1
235 summary: 1
236
236
237 changeset: 0:33b1f9bc8bc5
237 changeset: 0:33b1f9bc8bc5
238 user: test
238 user: test
239 date: Thu Jan 01 00:00:00 1970 +0000
239 date: Thu Jan 01 00:00:00 1970 +0000
240 summary: 0
240 summary: 0
241
241
242
242
243 hg up -C
243 hg up -C
244
244
245 $ hg up -C
245 $ hg up -C
246 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
246 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
247
247
248 complex bisect test 1 # first bad rev is 9
248 complex bisect test 1 # first bad rev is 9
249
249
250 $ hg bisect -r
250 $ hg bisect -r
251 $ hg bisect -g 0
251 $ hg bisect -g 0
252 $ hg bisect -b 17 # -> update to rev 6
252 $ hg bisect -b 17 # -> update to rev 6
253 Testing changeset 6:a214d5d3811a (15 changesets remaining, ~3 tests)
253 Testing changeset 6:a214d5d3811a (15 changesets remaining, ~3 tests)
254 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
254 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
255 $ hg bisect -g # -> update to rev 13
255 $ hg bisect -g # -> update to rev 13
256 Testing changeset 13:b0a32c86eb31 (9 changesets remaining, ~3 tests)
256 Testing changeset 13:b0a32c86eb31 (9 changesets remaining, ~3 tests)
257 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
257 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
258 $ hg bisect -s # -> update to rev 10
258 $ hg bisect -s # -> update to rev 10
259 Testing changeset 10:429fcd26f52d (9 changesets remaining, ~3 tests)
259 Testing changeset 10:429fcd26f52d (9 changesets remaining, ~3 tests)
260 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
260 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
261 $ hg bisect -b # -> update to rev 8
261 $ hg bisect -b # -> update to rev 8
262 Testing changeset 8:dab8161ac8fc (3 changesets remaining, ~1 tests)
262 Testing changeset 8:dab8161ac8fc (3 changesets remaining, ~1 tests)
263 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
263 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
264 $ hg bisect -g # -> update to rev 9
264 $ hg bisect -g # -> update to rev 9
265 Testing changeset 9:3c77083deb4a (2 changesets remaining, ~1 tests)
265 Testing changeset 9:3c77083deb4a (2 changesets remaining, ~1 tests)
266 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
267 $ hg bisect -b
267 $ hg bisect -b
268 The first bad revision is:
268 The first bad revision is:
269 changeset: 9:3c77083deb4a
269 changeset: 9:3c77083deb4a
270 user: test
270 user: test
271 date: Thu Jan 01 00:00:09 1970 +0000
271 date: Thu Jan 01 00:00:09 1970 +0000
272 summary: 9
272 summary: 9
273
273
274
274
275 complex bisect test 2 # first good rev is 13
275 complex bisect test 2 # first good rev is 13
276
276
277 $ hg bisect -r
277 $ hg bisect -r
278 $ hg bisect -g 18
278 $ hg bisect -g 18
279 $ hg bisect -b 1 # -> update to rev 6
279 $ hg bisect -b 1 # -> update to rev 6
280 Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
280 Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
281 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
281 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
282 $ hg bisect -s # -> update to rev 10
282 $ hg bisect -s # -> update to rev 10
283 Testing changeset 10:429fcd26f52d (13 changesets remaining, ~3 tests)
283 Testing changeset 10:429fcd26f52d (13 changesets remaining, ~3 tests)
284 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
284 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
285 $ hg bisect -b # -> update to rev 12
285 $ hg bisect -b # -> update to rev 12
286 Testing changeset 12:9f259202bbe7 (5 changesets remaining, ~2 tests)
286 Testing changeset 12:9f259202bbe7 (5 changesets remaining, ~2 tests)
287 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
287 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
288 $ hg bisect -b # -> update to rev 13
288 $ hg bisect -b # -> update to rev 13
289 Testing changeset 13:b0a32c86eb31 (3 changesets remaining, ~1 tests)
289 Testing changeset 13:b0a32c86eb31 (3 changesets remaining, ~1 tests)
290 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
290 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 $ hg bisect -g
291 $ hg bisect -g
292 The first good revision is:
292 The first good revision is:
293 changeset: 13:b0a32c86eb31
293 changeset: 13:b0a32c86eb31
294 user: test
294 user: test
295 date: Thu Jan 01 00:00:13 1970 +0000
295 date: Thu Jan 01 00:00:13 1970 +0000
296 summary: 13
296 summary: 13
297
297
298
298
299 complex bisect test 3
299 complex bisect test 3
300
300
301 first bad rev is 15
301 first bad rev is 15
302 10,9,13 are skipped an might be the first bad revisions as well
302 10,9,13 are skipped an might be the first bad revisions as well
303
303
304 $ hg bisect -r
304 $ hg bisect -r
305 $ hg bisect -g 1
305 $ hg bisect -g 1
306 $ hg bisect -b 16 # -> update to rev 6
306 $ hg bisect -b 16 # -> update to rev 6
307 Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
307 Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
308 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
308 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
309 $ hg bisect -g # -> update to rev 13
309 $ hg bisect -g # -> update to rev 13
310 Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
310 Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
311 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
311 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
312 $ hg bisect -s # -> update to rev 10
312 $ hg bisect -s # -> update to rev 10
313 Testing changeset 10:429fcd26f52d (8 changesets remaining, ~3 tests)
313 Testing changeset 10:429fcd26f52d (8 changesets remaining, ~3 tests)
314 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
314 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
315 $ hg bisect -s # -> update to rev 12
315 $ hg bisect -s # -> update to rev 12
316 Testing changeset 12:9f259202bbe7 (8 changesets remaining, ~3 tests)
316 Testing changeset 12:9f259202bbe7 (8 changesets remaining, ~3 tests)
317 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
317 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
318 $ hg bisect -g # -> update to rev 9
318 $ hg bisect -g # -> update to rev 9
319 Testing changeset 9:3c77083deb4a (5 changesets remaining, ~2 tests)
319 Testing changeset 9:3c77083deb4a (5 changesets remaining, ~2 tests)
320 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
320 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
321 $ hg bisect -s # -> update to rev 15
321 $ hg bisect -s # -> update to rev 15
322 Testing changeset 15:857b178a7cf3 (5 changesets remaining, ~2 tests)
322 Testing changeset 15:857b178a7cf3 (5 changesets remaining, ~2 tests)
323 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
323 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
324 $ hg bisect -b
324 $ hg bisect -b
325 Due to skipped revisions, the first bad revision could be any of:
325 Due to skipped revisions, the first bad revision could be any of:
326 changeset: 9:3c77083deb4a
326 changeset: 9:3c77083deb4a
327 user: test
327 user: test
328 date: Thu Jan 01 00:00:09 1970 +0000
328 date: Thu Jan 01 00:00:09 1970 +0000
329 summary: 9
329 summary: 9
330
330
331 changeset: 10:429fcd26f52d
331 changeset: 10:429fcd26f52d
332 parent: 9:3c77083deb4a
332 parent: 9:3c77083deb4a
333 parent: 6:a214d5d3811a
333 parent: 6:a214d5d3811a
334 user: test
334 user: test
335 date: Thu Jan 01 00:00:10 1970 +0000
335 date: Thu Jan 01 00:00:10 1970 +0000
336 summary: merge 6,9
336 summary: merge 6,9
337
337
338 changeset: 13:b0a32c86eb31
338 changeset: 13:b0a32c86eb31
339 user: test
339 user: test
340 date: Thu Jan 01 00:00:13 1970 +0000
340 date: Thu Jan 01 00:00:13 1970 +0000
341 summary: 13
341 summary: 13
342
342
343 changeset: 15:857b178a7cf3
343 changeset: 15:857b178a7cf3
344 parent: 13:b0a32c86eb31
344 parent: 13:b0a32c86eb31
345 parent: 10:429fcd26f52d
345 parent: 10:429fcd26f52d
346 user: test
346 user: test
347 date: Thu Jan 01 00:00:15 1970 +0000
347 date: Thu Jan 01 00:00:15 1970 +0000
348 summary: merge 10,13
348 summary: merge 10,13
349
349
350
350
351 complex bisect test 4
351 complex bisect test 4
352
352
353 first good revision is 17
353 first good revision is 17
354 15,16 are skipped an might be the first good revisions as well
354 15,16 are skipped an might be the first good revisions as well
355
355
356 $ hg bisect -r
356 $ hg bisect -r
357 $ hg bisect -g 17
357 $ hg bisect -g 17
358 $ hg bisect -b 8 # -> update to rev 10
358 $ hg bisect -b 8 # -> update to rev 10
359 Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
359 Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
360 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
360 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
361 $ hg bisect -b # -> update to rev 13
361 $ hg bisect -b # -> update to rev 13
362 Testing changeset 10:429fcd26f52d (5 changesets remaining, ~2 tests)
362 Testing changeset 10:429fcd26f52d (5 changesets remaining, ~2 tests)
363 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
363 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
364 $ hg bisect -b # -> update to rev 15
364 $ hg bisect -b # -> update to rev 15
365 Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
365 Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
366 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
366 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
367 $ hg bisect -s # -> update to rev 16
367 $ hg bisect -s # -> update to rev 16
368 Testing changeset 16:609d82a7ebae (3 changesets remaining, ~1 tests)
368 Testing changeset 16:609d82a7ebae (3 changesets remaining, ~1 tests)
369 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
369 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
370 $ hg bisect -s
370 $ hg bisect -s
371 Due to skipped revisions, the first good revision could be any of:
371 Due to skipped revisions, the first good revision could be any of:
372 changeset: 15:857b178a7cf3
372 changeset: 15:857b178a7cf3
373 parent: 13:b0a32c86eb31
373 parent: 13:b0a32c86eb31
374 parent: 10:429fcd26f52d
374 parent: 10:429fcd26f52d
375 user: test
375 user: test
376 date: Thu Jan 01 00:00:15 1970 +0000
376 date: Thu Jan 01 00:00:15 1970 +0000
377 summary: merge 10,13
377 summary: merge 10,13
378
378
379 changeset: 16:609d82a7ebae
379 changeset: 16:609d82a7ebae
380 user: test
380 user: test
381 date: Thu Jan 01 00:00:16 1970 +0000
381 date: Thu Jan 01 00:00:16 1970 +0000
382 summary: 16
382 summary: 16
383
383
384 changeset: 17:228c06deef46
384 changeset: 17:228c06deef46
385 user: test
385 user: test
386 date: Thu Jan 01 00:00:17 1970 +0000
386 date: Thu Jan 01 00:00:17 1970 +0000
387 summary: 17
387 summary: 17
388
388
389
389
390 test unrelated revs:
390 test unrelated revs:
391
391
392 $ hg bisect --reset
392 $ hg bisect --reset
393 $ hg bisect -b 7
393 $ hg bisect -b 7
394 $ hg bisect -g 14
394 $ hg bisect -g 14
395 abort: starting revisions are not directly related
395 abort: starting revisions are not directly related
396 [255]
396 [255]
397 $ hg bisect --reset
397 $ hg bisect --reset
398
398
399 end at merge: 17 bad, 11 good (but 9 is first bad)
399 end at merge: 17 bad, 11 good (but 9 is first bad)
400
400
401 $ hg bisect -r
401 $ hg bisect -r
402 $ hg bisect -b 17
402 $ hg bisect -b 17
403 $ hg bisect -g 11
403 $ hg bisect -g 11
404 Testing changeset 13:b0a32c86eb31 (5 changesets remaining, ~2 tests)
404 Testing changeset 13:b0a32c86eb31 (5 changesets remaining, ~2 tests)
405 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
405 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
406 $ hg bisect -g
406 $ hg bisect -g
407 Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
407 Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
408 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
408 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
409 $ hg bisect -b
409 $ hg bisect -b
410 The first bad revision is:
410 The first bad revision is:
411 changeset: 15:857b178a7cf3
411 changeset: 15:857b178a7cf3
412 parent: 13:b0a32c86eb31
412 parent: 13:b0a32c86eb31
413 parent: 10:429fcd26f52d
413 parent: 10:429fcd26f52d
414 user: test
414 user: test
415 date: Thu Jan 01 00:00:15 1970 +0000
415 date: Thu Jan 01 00:00:15 1970 +0000
416 summary: merge 10,13
416 summary: merge 10,13
417
417
418 Not all ancestors of this changeset have been checked.
418 Not all ancestors of this changeset have been checked.
419 Use bisect --extend to continue the bisection from
419 Use bisect --extend to continue the bisection from
420 the common ancestor, dab8161ac8fc.
420 the common ancestor, dab8161ac8fc.
421 $ hg bisect --extend
421 $ hg bisect --extend
422 Extending search to changeset 8:dab8161ac8fc
422 Extending search to changeset 8:dab8161ac8fc
423 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
423 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
424 $ hg bisect -g # dab8161ac8fc
424 $ hg bisect -g # dab8161ac8fc
425 Testing changeset 9:3c77083deb4a (3 changesets remaining, ~1 tests)
425 Testing changeset 9:3c77083deb4a (3 changesets remaining, ~1 tests)
426 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
426 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
427 $ hg bisect -b
427 $ hg bisect -b
428 The first bad revision is:
428 The first bad revision is:
429 changeset: 9:3c77083deb4a
429 changeset: 9:3c77083deb4a
430 user: test
430 user: test
431 date: Thu Jan 01 00:00:09 1970 +0000
431 date: Thu Jan 01 00:00:09 1970 +0000
432 summary: 9
432 summary: 9
433
433
434
435 user adds irrelevant but consistent information (here: -g 2) to bisect state
436
437 $ hg bisect -r
438 $ hg bisect -b 13
439 $ hg bisect -g 8
440 Testing changeset 11:82ca6f06eccd (3 changesets remaining, ~1 tests)
441 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
442 $ hg bisect -g 2
443 Testing changeset 11:82ca6f06eccd (3 changesets remaining, ~1 tests)
444 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
445 $ hg bisect -b
446 The first bad revision is:
447 changeset: 11:82ca6f06eccd
448 parent: 8:dab8161ac8fc
449 user: test
450 date: Thu Jan 01 00:00:11 1970 +0000
451 summary: 11
452
General Comments 0
You need to be logged in to leave comments. Login now