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.'
34 _x40
='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
35 _x40
="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
39 if test -f "$GIT_DIR/BISECT_HEAD"
48 test -s "$GIT_DIR/BISECT_START" ||
{
50 gettext "You need to start by \"git bisect start\"" &&
55 # TRANSLATORS: Make sure to include [Y] and [n] in your
56 # translation. The program will only accept English input
58 gettext "Do you want me to do it for you [Y/n]? " >&2
73 # Check for one bad and then some good revisions.
77 case "$arg" in --) has_double_dash
=1; break ;; esac
79 orig_args
=$
(git rev-parse
--sq-quote "$@")
83 while [ $# -gt 0 ]; do
94 die
"$(eval_gettext "unrecognised option
: '\$arg'")" ;;
96 rev=$
(git rev-parse
-q --verify "$arg^{commit}") ||
{
97 test $has_double_dash -eq 1 &&
98 die
"$(eval_gettext "'\$arg' does not appear to be a valid revision
")"
102 0) state
='bad' ; bad_seen
=1 ;;
105 eval="$eval bisect_write '$state' '$rev' 'nolog' &&"
114 head=$
(GIT_DIR
="$GIT_DIR" git symbolic-ref
-q HEAD
) ||
115 head=$
(GIT_DIR
="$GIT_DIR" git rev-parse
--verify HEAD
) ||
116 die
"$(gettext "Bad HEAD
- I need a HEAD
")"
119 # Check if we are bisecting.
122 if test -s "$GIT_DIR/BISECT_START"
124 # Reset to the rev from where we started.
125 start_head
=$
(cat "$GIT_DIR/BISECT_START")
126 if test "z$mode" != "z--no-checkout"
128 git checkout
"$start_head" --
131 # Get rev from where we start.
134 # This error message should only be triggered by
135 # cogito usage, and cogito users should understand
136 # it relates to cg-seek.
137 [ -s "$GIT_DIR/head-name" ] &&
138 die
"$(gettext "won
't bisect on seeked tree")"
139 start_head="${head#refs/heads/}"
142 die "$(gettext "Bad HEAD - strange symbolic ref")"
148 # Get rid of any old bisect state.
150 bisect_clean_state || exit
154 # In case of mistaken revs or checkout error, or signals received,
155 # "bisect_auto_next" below may exit or misbehave.
156 # We have to trap this to be able to clean up using
157 # "bisect_clean_state".
159 trap 'bisect_clean_state
' 0
160 trap 'exit 255' 1 2 3 15
163 # Write new start state.
165 echo "$start_head" >"$GIT_DIR/BISECT_START" && {
166 test "z$mode" != "z--no-checkout" ||
167 git update-ref --no-deref BISECT_HEAD "$start_head"
169 git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
171 echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
173 # Check if we can proceed to the next bisect state.
186 good|skip) tag="$state"-"$rev" ;;
187 *) die "$(eval_gettext "Bad bisect_write argument: \$state")" ;;
189 git update-ref "refs/bisect/$tag" "$rev" || exit
190 echo "# $state: $(git show-branch $rev)" >>"$GIT_DIR/BISECT_LOG"
191 test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
195 test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
196 test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
199 check_expected_revs() {
201 if ! is_expected_rev "$_rev"; then
202 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
203 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
215 revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
217 revs=$(git rev-parse --sq-quote "$arg") ;;
221 eval bisect_state 'skip
' $all
229 die "$(gettext "Please call 'bisect_state
' with at least one argument.")" ;;
231 rev=$(git rev-parse --verify $(bisect_head)) ||
232 die "$(gettext "Bad rev input: $(bisect_head)")"
233 bisect_write "$state" "$rev"
234 check_expected_revs "$rev" ;;
240 sha=$(git rev-parse --verify "$rev^{commit}") ||
241 die "$(eval_gettext "Bad rev input: \$rev")"
242 eval="$eval bisect_write '$state' '$sha'; "
245 check_expected_revs "$@" ;;
247 die "$(gettext "'git bisect bad
' can take only one argument.")" ;;
254 bisect_next_check() {
255 missing_good= missing_bad=
256 git show-ref -q --verify refs/bisect/bad || missing_bad=t
257 test -n "$(git for-each-ref "refs/bisect/good-*")" || missing_good=t
259 case "$missing_good,$missing_bad,$1" in
261 : have both good and bad - ok
264 # do not have both but not asked to fail - just report.
268 # have bad but not good. we could bisect although
269 # this is less optimum.
271 gettext "Warning: bisecting only with a bad commit." &&
276 # TRANSLATORS: Make sure to include [Y] and [n] in your
277 # translation. The program will only accept English input
279 gettext "Are you sure [Y/n]? " >&2
281 case "$yesno" in [Nn]*) exit 1 ;; esac
283 : bisect without good...
287 if test -s "$GIT_DIR/BISECT_START"
290 gettext "You need to give me at least one good and one bad revisions.
291 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
296 gettext "You need to start by \"git bisect start\".
297 You then need to give me at least one good and one bad revisions.
298 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
307 bisect_next_check && bisect_next || :
311 case "$#" in 0) ;; *) usage ;; esac
313 bisect_next_check good
315 # Perform all bisection computation, display and checkout
316 git bisect--helper --next-all $(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
319 # Check if we should exit because bisection is finished
320 test $res -eq 10 && exit 0
322 # Check for an error in the bisection process
323 test $res -ne 0 && exit $res
329 bisect_next_check fail
333 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
334 type gitk >/dev/null 2>&1; then
342 -*) set git log "$@" ;;
347 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
351 test -s "$GIT_DIR/BISECT_START" || {
352 gettext "We are not bisecting."; echo
356 0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
357 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
359 die "$(eval_gettext "'\
$invalid' is not a valid commit")"
365 if ! test -f "$GIT_DIR/BISECT_HEAD"
367 if ! git checkout "$branch" --
369 die "$(eval_gettext "Could not check out original HEAD '\
$branch'.
370 Try 'git bisect
reset <commit
>'.")"
376 bisect_clean_state() {
377 # There may be some refs packed during bisection.
378 git for-each-ref --format='%(refname
) %(objectname
)' refs/bisect/\* |
381 git update-ref -d $ref $hash || exit
383 rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
384 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
385 rm -f "$GIT_DIR/BISECT_LOG" &&
386 rm -f "$GIT_DIR/BISECT_NAMES" &&
387 rm -f "$GIT_DIR/BISECT_RUN" &&
388 # Cleanup head-name if it got left by an old version of git-bisect
389 rm -f "$GIT_DIR/head-name" &&
390 git update-ref -d --no-deref BISECT_HEAD &&
391 # clean up BISECT_START last
392 rm -f "$GIT_DIR/BISECT_START"
397 test "$#" -eq 1 || die "$(gettext "No logfile given")"
398 test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
400 while read git bisect command rev
402 test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
403 if test "$git" = "git-bisect"; then
409 cmd="bisect_start $rev"
412 bisect_write "$command" "$rev" ;;
414 die "$(gettext "?? what are you talking about?")" ;;
421 bisect_next_check fail
426 eval_gettext "running \$command"; echo
430 # Check for really bad run error.
431 if [ $res -lt 0 -o $res -ge 128 ]; then
433 eval_gettext "bisect run failed:
434 exit code \$res from '\
$command' is < 0 or >= 128" &&
440 # Find current state depending on run success or failure.
441 # A special exit code of 125 means cannot test.
442 if [ $res -eq 125 ]; then
444 elif [ $res -gt 0 ]; then
450 # We have to use a subshell because "bisect_state" can exit.
451 ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
454 cat "$GIT_DIR/BISECT_RUN"
456 if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
459 gettext "bisect run cannot continue any more" &&
465 if [ $res -ne 0 ]; then
467 eval_gettext "bisect run failed:
468 'bisect_state \
$state' exited with error code \$res" &&
474 if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null; then
475 gettext "bisect run success"; echo
483 test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
484 cat "$GIT_DIR/BISECT_LOG"
499 bisect_state "$cmd" "$@" ;;
503 # Not sure we want "next" at the UI level anymore.
506 bisect_visualize "$@" ;;
510 bisect_replay "$@" ;;