3 USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
4 LONG_USAGE='git bisect help
5 print this long help message.
6 git bisect start [--no-checkout] [<bad> [<good>...]] [--] [<pathspec>...]
7 reset bisect state and start bisection.
9 mark <rev> a known-bad revision.
10 git bisect good [<rev>...]
11 mark <rev>... known-good revisions.
12 git bisect skip [(<rev>|<range>)...]
13 mark <rev>... untestable revisions.
15 find next bisection to test and check it out.
16 git bisect reset [<commit>]
17 finish bisection search and go back to commit.
19 show bisect status in gitk.
20 git bisect replay <logfile>
24 git bisect run <cmd>...
25 use <cmd>... to automatically bisect.
27 Please use "git help bisect" to get the full man page.'
33 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
34 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
38 if test -f "$GIT_DIR/BISECT_HEAD"
47 test -s "$GIT_DIR/BISECT_START" || {
49 gettext "You need to start by \"git bisect start\"" &&
54 # TRANSLATORS: Make sure to include [Y] and [n] in your
55 # translation. The program will only accept English input
57 gettext "Do you want me to do it for you [Y/n]? " >&2
72 # Check for one bad and then some good revisions.
76 case "$arg" in --) has_double_dash=1; break ;; esac
78 orig_args=$(git rev-parse --sq-quote "$@")
81 if test "z$(git rev-parse --is-bare-repository)" != zfalse
87 while [ $# -gt 0 ]; do
98 die "$(eval_gettext "unrecognised option: '\$arg'")" ;;
100 rev=$(git rev-parse -q --verify "$arg^{commit}") || {
101 test $has_double_dash -eq 1 &&
102 die "$(eval_gettext "'\$arg' does not appear to be a valid revision")"
106 0) state='bad' ; bad_seen=1 ;;
109 eval="$eval bisect_write '$state' '$rev' 'nolog' &&"
118 head=$(GIT_DIR="$GIT_DIR" git symbolic-ref -q HEAD) ||
119 head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) ||
120 die "$(gettext "Bad HEAD - I need a HEAD")"
123 # Check if we are bisecting.
126 if test -s "$GIT_DIR/BISECT_START"
128 # Reset to the rev from where we started.
129 start_head=$(cat "$GIT_DIR/BISECT_START")
130 if test "z$mode" != "z--no-checkout"
132 git checkout "$start_head" --
135 # Get rev from where we start.
138 # This error message should only be triggered by
139 # cogito usage, and cogito users should understand
140 # it relates to cg-seek.
141 [ -s "$GIT_DIR/head-name" ] &&
142 die "$(gettext "won't bisect on seeked tree")"
143 start_head="${head#refs/heads/}"
146 die "$(gettext "Bad HEAD - strange symbolic ref")"
152 # Get rid of any old bisect state.
154 bisect_clean_state || exit
158 # In case of mistaken revs or checkout error, or signals received,
159 # "bisect_auto_next" below may exit or misbehave.
160 # We have to trap this to be able to clean up using
161 # "bisect_clean_state".
163 trap 'bisect_clean_state' 0
164 trap 'exit 255' 1 2 3 15
167 # Write new start state.
169 echo "$start_head" >"$GIT_DIR/BISECT_START" && {
170 test "z$mode" != "z--no-checkout" ||
171 git update-ref --no-deref BISECT_HEAD "$start_head"
173 git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
175 echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
177 # Check if we can proceed to the next bisect state.
190 good|skip) tag="$state"-"$rev" ;;
191 *) die "$(eval_gettext "Bad bisect_write argument: \$state")" ;;
193 git update-ref "refs/bisect/$tag" "$rev" || exit
194 echo "# $state: $(git show-branch $rev)" >>"$GIT_DIR/BISECT_LOG"
195 test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
199 test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
200 test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
203 check_expected_revs() {
205 if ! is_expected_rev "$_rev"
207 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
208 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
220 revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
222 revs=$(git rev-parse --sq-quote "$arg") ;;
226 eval bisect_state 'skip' $all
234 die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;;
236 rev=$(git rev-parse --verify $(bisect_head)) ||
237 die "$(gettext "Bad rev input: $(bisect_head)")"
238 bisect_write "$state" "$rev"
239 check_expected_revs "$rev" ;;
245 sha=$(git rev-parse --verify "$rev^{commit}") ||
246 die "$(eval_gettext "Bad rev input: \$rev")"
247 eval="$eval bisect_write '$state' '$sha'; "
250 check_expected_revs "$@" ;;
252 die "$(gettext "'git bisect bad' can take only one argument.")" ;;
259 bisect_next_check() {
260 missing_good= missing_bad=
261 git show-ref -q --verify refs/bisect/bad || missing_bad=t
262 test -n "$(git for-each-ref "refs/bisect/good-*")" || missing_good=t
264 case "$missing_good,$missing_bad,$1" in
266 : have both good and bad - ok
269 # do not have both but not asked to fail - just report.
273 # have bad but not good. we could bisect although
274 # this is less optimum.
276 gettext "Warning: bisecting only with a bad commit." &&
281 # TRANSLATORS: Make sure to include [Y] and [n] in your
282 # translation. The program will only accept English input
284 gettext "Are you sure [Y/n]? " >&2
286 case "$yesno" in [Nn]*) exit 1 ;; esac
288 : bisect without good...
292 if test -s "$GIT_DIR/BISECT_START"
295 gettext "You need to give me at least one good and one bad revisions.
296 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
301 gettext "You need to start by \"git bisect start\".
302 You then need to give me at least one good and one bad revisions.
303 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
312 bisect_next_check && bisect_next || :
316 case "$#" in 0) ;; *) usage ;; esac
318 bisect_next_check good
320 # Perform all bisection computation, display and checkout
321 git bisect--helper --next-all $(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
324 # Check if we should exit because bisection is finished
325 test $res -eq 10 && exit 0
327 # Check for an error in the bisection process
328 test $res -ne 0 && exit $res
334 bisect_next_check fail
338 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
339 type gitk >/dev/null 2>&1
348 -*) set git log "$@" ;;
353 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
357 test -s "$GIT_DIR/BISECT_START" || {
358 gettext "We are not bisecting."; echo
362 0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
363 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
365 die "$(eval_gettext "'\$invalid' is not a valid commit")"
372 if ! test -f "$GIT_DIR/BISECT_HEAD" && ! git checkout "$branch" --
374 die "$(eval_gettext "Could not check out original HEAD '\$branch'.
375 Try 'git bisect reset <commit>'.")"
380 bisect_clean_state() {
381 # There may be some refs packed during bisection.
382 git for-each-ref --format='%(refname) %(objectname)' refs/bisect/\* |
385 git update-ref -d $ref $hash || exit
387 rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
388 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
389 rm -f "$GIT_DIR/BISECT_LOG" &&
390 rm -f "$GIT_DIR/BISECT_NAMES" &&
391 rm -f "$GIT_DIR/BISECT_RUN" &&
392 # Cleanup head-name if it got left by an old version of git-bisect
393 rm -f "$GIT_DIR/head-name" &&
394 git update-ref -d --no-deref BISECT_HEAD &&
395 # clean up BISECT_START last
396 rm -f "$GIT_DIR/BISECT_START"
401 test "$#" -eq 1 || die "$(gettext "No logfile given")"
402 test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
404 while read git bisect command rev
406 test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
407 if test "$git" = "git-bisect"
414 cmd="bisect_start $rev"
417 bisect_write "$command" "$rev" ;;
419 die "$(gettext "?? what are you talking about?")" ;;
426 bisect_next_check fail
431 eval_gettext "running \$command"; echo
435 # Check for really bad run error.
436 if [ $res -lt 0 -o $res -ge 128 ]
439 eval_gettext "bisect run failed:
440 exit code \$res from '\$command' is < 0 or >= 128" &&
446 # Find current state depending on run success or failure.
447 # A special exit code of 125 means cannot test.
458 # We have to use a subshell because "bisect_state" can exit.
459 ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
462 cat "$GIT_DIR/BISECT_RUN"
464 if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
468 gettext "bisect run cannot continue any more" &&
477 eval_gettext "bisect run failed:
478 'bisect_state \$state' exited with error code \$res" &&
484 if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null
486 gettext "bisect run success"; echo
494 test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
495 cat "$GIT_DIR/BISECT_LOG"
510 bisect_state "$cmd" "$@" ;;
514 # Not sure we want "next" at the UI level anymore.
517 bisect_visualize "$@" ;;
521 bisect_replay "$@" ;;