172
test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
173
}
174
175
+is_expected_rev() {
176
+ test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
177
+ test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
178
+}
179
+
180
+mark_expected_rev() {
181
+ echo "$1" > "$GIT_DIR/BISECT_EXPECTED_REV"
182
+}
183
+
184
+check_expected_revs() {
185
+ for _rev in "$@"; do
186
+ if ! is_expected_rev "$_rev"; then
187
+ rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
188
+ rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
189
+ return
190
+ fi
191
+ done
192
+}
193
+
194
bisect_state() {
195
bisect_autostart
196
state=$1
200
1,bad|1,good|1,skip)
201
rev=$(git rev-parse --verify HEAD) ||
202
die "Bad rev input: HEAD"
184
- bisect_write "$state" "$rev" ;;
203
+ bisect_write "$state" "$rev"
204
+ check_expected_revs "$rev" ;;
205
2,bad|*,good|*,skip)
206
shift
207
eval=''
211
die "Bad rev input: $rev"
212
eval="$eval bisect_write '$state' '$sha'; "
213
done
194
- eval "$eval" ;;
214
+ eval "$eval"
215
+ check_expected_revs "$@" ;;
216
*,bad)
217
die "'git bisect bad' can take only one argument." ;;
218
*)
342
_rev="$1"
343
_msg="$2"
344
echo "Bisecting: $_msg"
345
+ mark_expected_rev "$_rev"
346
git checkout -q "$_rev" || exit
347
git show-branch "$_rev"
348
}
354
return 1
355
}
356
335
-is_testing_merge_base() {
336
- grep "^testing $1$" "$GIT_DIR/BISECT_MERGE_BASES" >/dev/null 2>&1
337
-}
338
-
339
-mark_testing_merge_base() {
340
- echo "testing $1" >> "$GIT_DIR/BISECT_MERGE_BASES"
341
-}
342
-
357
handle_bad_merge_base() {
358
_badmb="$1"
359
_good="$2"
346
- if is_testing_merge_base "$_badmb"; then
360
+ if is_expected_rev "$_badmb"; then
361
cat >&2 <<EOF
362
The merge base $_badmb is bad.
363
This means the bug has been fixed between $_badmb and [$_good].
397
elif is_among "$_mb" "$_skip"; then
398
handle_skipped_merge_base "$_mb" "$_bad" "$_good"
399
else
386
- mark_testing_merge_base "$_mb"
400
bisect_checkout "$_mb" "a merge base must be tested"
401
checkout_done=1
402
return
405
}
406
407
check_good_are_ancestors_of_bad() {
408
+ test -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
409
+ return
410
+
411
_bad="$1"
412
_good=$(echo $2 | sed -e 's/\^//g')
413
_skip="$3"
417
418
_side=$(git rev-list $_good ^$_bad)
419
if test -n "$_side"; then
404
- check_merge_bases "$_bad" "$_good" "$_skip"
420
+ check_merge_bases "$_bad" "$_good" "$_skip" || return
421
+ test "$checkout_done" -eq "1" && return
422
fi
423
+
424
+ : > "$GIT_DIR/BISECT_ANCESTORS_OK"
425
}
426
427
bisect_next() {
510
do
511
git update-ref -d $ref $hash || exit
512
done
494
- rm -f "$GIT_DIR/BISECT_MERGE_BASES" &&
513
+ rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
514
+ rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
515
rm -f "$GIT_DIR/BISECT_LOG" &&
516
rm -f "$GIT_DIR/BISECT_NAMES" &&
517
rm -f "$GIT_DIR/BISECT_RUN" &&