157 def get(repo, status): |
157 def get(repo, status): |
158 """ |
158 """ |
159 Return a list of revision(s) that match the given status: |
159 Return a list of revision(s) that match the given status: |
160 |
160 |
161 - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip |
161 - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip |
162 - ``goods``, ``bads`` : csets topologicaly good/bad |
162 - ``goods``, ``bads`` : csets topologically good/bad |
163 - ``range`` : csets taking part in the bisection |
163 - ``range`` : csets taking part in the bisection |
164 - ``pruned`` : csets that are goods, bads or skipped |
164 - ``pruned`` : csets that are goods, bads or skipped |
165 - ``untested`` : csets whose fate is yet unknown |
165 - ``untested`` : csets whose fate is yet unknown |
166 - ``ignored`` : csets ignored due to DAG topology |
166 - ``ignored`` : csets ignored due to DAG topology |
167 - ``current`` : the cset currently being bisected |
167 - ``current`` : the cset currently being bisected |
168 """ |
168 """ |
169 state = load_state(repo) |
169 state = load_state(repo) |
170 if status in ('good', 'bad', 'skip', 'current'): |
170 if status in ('good', 'bad', 'skip', 'current'): |
171 return map(repo.changelog.rev, state[status]) |
171 return map(repo.changelog.rev, state[status]) |
172 else: |
172 else: |
173 # In the floowing sets, we do *not* call 'bisect()' with more |
173 # In the following sets, we do *not* call 'bisect()' with more |
174 # than one level of recusrsion, because that can be very, very |
174 # than one level of recursion, because that can be very, very |
175 # time consuming. Instead, we always develop the expression as |
175 # time consuming. Instead, we always develop the expression as |
176 # much as possible. |
176 # much as possible. |
177 |
177 |
178 # 'range' is all csets that make the bisection: |
178 # 'range' is all csets that make the bisection: |
179 # - have a good ancestor and a bad descendant, or conversely |
179 # - have a good ancestor and a bad descendant, or conversely |
198 # 'untested' is all cset that are- in 'range', but not in 'pruned' |
198 # 'untested' is all cset that are- in 'range', but not in 'pruned' |
199 untested = '( (%s) - (%s) )' % (range, pruned) |
199 untested = '( (%s) - (%s) )' % (range, pruned) |
200 |
200 |
201 # 'ignored' is all csets that were not used during the bisection |
201 # 'ignored' is all csets that were not used during the bisection |
202 # due to DAG topology, but may however have had an impact. |
202 # due to DAG topology, but may however have had an impact. |
203 # Eg., a branch merged between bads and goods, but whose branch- |
203 # E.g., a branch merged between bads and goods, but whose branch- |
204 # point is out-side of the range. |
204 # point is out-side of the range. |
205 iba = '::bisect(bad) - ::bisect(good)' # Ignored bads' ancestors |
205 iba = '::bisect(bad) - ::bisect(good)' # Ignored bads' ancestors |
206 iga = '::bisect(good) - ::bisect(bad)' # Ignored goods' ancestors |
206 iga = '::bisect(good) - ::bisect(bad)' # Ignored goods' ancestors |
207 ignored = '( ( (%s) | (%s) ) - (%s) )' % (iba, iga, range) |
207 ignored = '( ( (%s) | (%s) ) - (%s) )' % (iba, iga, range) |
208 |
208 |