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" -- ||
133 die "$(eval_gettext "Checking out '\$start_head' failed. Try 'git bisect reset <validbranch>'.")"
136 # Get rev from where we start.
139 # This error message should only be triggered by
140 # cogito usage, and cogito users should understand
141 # it relates to cg-seek.
142 [ -s "$GIT_DIR/head-name" ] &&
143 die "$(gettext "won't bisect on seeked tree")"
144 start_head="${head#refs/heads/}"
147 die "$(gettext "Bad HEAD - strange symbolic ref")"
153 # Get rid of any old bisect state.
155 bisect_clean_state || exit
159 # In case of mistaken revs or checkout error, or signals received,
160 # "bisect_auto_next" below may exit or misbehave.
161 # We have to trap this to be able to clean up using
162 # "bisect_clean_state".
164 trap 'bisect_clean_state' 0
165 trap 'exit 255' 1 2 3 15
168 # Write new start state.
170 echo "$start_head" >"$GIT_DIR/BISECT_START" && {
171 test "z$mode" != "z--no-checkout" ||
172 git update-ref --no-deref BISECT_HEAD "$start_head"
174 git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
176 echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
178 # Check if we can proceed to the next bisect state.
191 good|skip) tag="$state"-"$rev" ;;
192 *) die "$(eval_gettext "Bad bisect_write argument: \$state")" ;;
194 git update-ref "refs/bisect/$tag" "$rev" || exit
195 echo "# $state: $(git show-branch $rev)" >>"$GIT_DIR/BISECT_LOG"
196 test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
200 test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
201 test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
204 check_expected_revs() {
206 if ! is_expected_rev "$_rev"
208 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
209 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
221 revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
223 revs=$(git rev-parse --sq-quote "$arg") ;;
227 eval bisect_state 'skip' $all
235 die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;;
237 rev=$(git rev-parse --verify $(bisect_head)) ||
238 die "$(gettext "Bad rev input: $(bisect_head)")"
239 bisect_write "$state" "$rev"
240 check_expected_revs "$rev" ;;
246 sha=$(git rev-parse --verify "$rev^{commit}") ||
247 die "$(eval_gettext "Bad rev input: \$rev")"
248 eval="$eval bisect_write '$state' '$sha'; "
251 check_expected_revs "$@" ;;
253 die "$(gettext "'git bisect bad' can take only one argument.")" ;;
260 bisect_next_check() {
261 missing_good= missing_bad=
262 git show-ref -q --verify refs/bisect/bad || missing_bad=t
263 test -n "$(git for-each-ref "refs/bisect/good-*")" || missing_good=t
265 case "$missing_good,$missing_bad,$1" in
267 : have both good and bad - ok
270 # do not have both but not asked to fail - just report.
274 # have bad but not good. we could bisect although
275 # this is less optimum.
277 gettext "Warning: bisecting only with a bad commit." &&
282 # TRANSLATORS: Make sure to include [Y] and [n] in your
283 # translation. The program will only accept English input
285 gettext "Are you sure [Y/n]? " >&2
287 case "$yesno" in [Nn]*) exit 1 ;; esac
289 : bisect without good...
293 if test -s "$GIT_DIR/BISECT_START"
296 gettext "You need to give me at least one good and one bad revisions.
297 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
302 gettext "You need to start by \"git bisect start\".
303 You then need to give me at least one good and one bad revisions.
304 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
313 bisect_next_check && bisect_next || :
317 case "$#" in 0) ;; *) usage ;; esac
319 bisect_next_check good
321 # Perform all bisection computation, display and checkout
322 git bisect--helper --next-all $(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
325 # Check if we should exit because bisection is finished
326 test $res -eq 10 && exit 0
328 # Check for an error in the bisection process
329 test $res -ne 0 && exit $res
335 bisect_next_check fail
339 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
340 type gitk >/dev/null 2>&1
349 -*) set git log "$@" ;;
354 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
358 test -s "$GIT_DIR/BISECT_START" || {
359 gettext "We are not bisecting."; echo
363 0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
364 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
366 die "$(eval_gettext "'\$invalid' is not a valid commit")"
373 if ! test -f "$GIT_DIR/BISECT_HEAD" && ! git checkout "$branch" --
375 die "$(eval_gettext "Could not check out original HEAD '\$branch'.
376 Try 'git bisect reset <commit>'.")"
381 bisect_clean_state() {
382 # There may be some refs packed during bisection.
383 git for-each-ref --format='%(refname) %(objectname)' refs/bisect/\* |
386 git update-ref -d $ref $hash || exit
388 rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
389 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
390 rm -f "$GIT_DIR/BISECT_LOG" &&
391 rm -f "$GIT_DIR/BISECT_NAMES" &&
392 rm -f "$GIT_DIR/BISECT_RUN" &&
393 # Cleanup head-name if it got left by an old version of git-bisect
394 rm -f "$GIT_DIR/head-name" &&
395 git update-ref -d --no-deref BISECT_HEAD &&
396 # clean up BISECT_START last
397 rm -f "$GIT_DIR/BISECT_START"
402 test "$#" -eq 1 || die "$(gettext "No logfile given")"
403 test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
405 while read git bisect command rev
407 test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
408 if test "$git" = "git-bisect"
415 cmd="bisect_start $rev"
418 bisect_write "$command" "$rev" ;;
420 die "$(gettext "?? what are you talking about?")" ;;
427 bisect_next_check fail
432 eval_gettext "running \$command"; echo
436 # Check for really bad run error.
437 if [ $res -lt 0 -o $res -ge 128 ]
440 eval_gettext "bisect run failed:
441 exit code \$res from '\$command' is < 0 or >= 128" &&
447 # Find current state depending on run success or failure.
448 # A special exit code of 125 means cannot test.
459 # We have to use a subshell because "bisect_state" can exit.
460 ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
463 cat "$GIT_DIR/BISECT_RUN"
465 if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
469 gettext "bisect run cannot continue any more" &&
478 eval_gettext "bisect run failed:
479 'bisect_state \$state' exited with error code \$res" &&
485 if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null
487 gettext "bisect run success"; echo
495 test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
496 cat "$GIT_DIR/BISECT_LOG"
511 bisect_state "$cmd" "$@" ;;
515 # Not sure we want "next" at the UI level anymore.
518 bisect_visualize "$@" ;;
522 bisect_replay "$@" ;;