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"
203 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
204 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
216 revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
218 revs=$(git rev-parse --sq-quote "$arg") ;;
222 eval bisect_state 'skip
' $all
230 die "$(gettext "Please call 'bisect_state
' with at least one argument.")" ;;
232 rev=$(git rev-parse --verify $(bisect_head)) ||
233 die "$(gettext "Bad rev input: $(bisect_head)")"
234 bisect_write "$state" "$rev"
235 check_expected_revs "$rev" ;;
241 sha=$(git rev-parse --verify "$rev^{commit}") ||
242 die "$(eval_gettext "Bad rev input: \$rev")"
243 eval="$eval bisect_write '$state' '$sha'; "
246 check_expected_revs "$@" ;;
248 die "$(gettext "'git bisect bad
' can take only one argument.")" ;;
255 bisect_next_check() {
256 missing_good= missing_bad=
257 git show-ref -q --verify refs/bisect/bad || missing_bad=t
258 test -n "$(git for-each-ref "refs/bisect/good-*")" || missing_good=t
260 case "$missing_good,$missing_bad,$1" in
262 : have both good and bad - ok
265 # do not have both but not asked to fail - just report.
269 # have bad but not good. we could bisect although
270 # this is less optimum.
272 gettext "Warning: bisecting only with a bad commit." &&
277 # TRANSLATORS: Make sure to include [Y] and [n] in your
278 # translation. The program will only accept English input
280 gettext "Are you sure [Y/n]? " >&2
282 case "$yesno" in [Nn]*) exit 1 ;; esac
284 : bisect without good...
288 if test -s "$GIT_DIR/BISECT_START"
291 gettext "You need to give me at least one good and one bad revisions.
292 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
297 gettext "You need to start by \"git bisect start\".
298 You then need to give me at least one good and one bad revisions.
299 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
308 bisect_next_check && bisect_next || :
312 case "$#" in 0) ;; *) usage ;; esac
314 bisect_next_check good
316 # Perform all bisection computation, display and checkout
317 git bisect--helper --next-all $(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
320 # Check if we should exit because bisection is finished
321 test $res -eq 10 && exit 0
323 # Check for an error in the bisection process
324 test $res -ne 0 && exit $res
330 bisect_next_check fail
334 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
335 type gitk >/dev/null 2>&1
344 -*) set git log "$@" ;;
349 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
353 test -s "$GIT_DIR/BISECT_START" || {
354 gettext "We are not bisecting."; echo
358 0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
359 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
361 die "$(eval_gettext "'\
$invalid' is not a valid commit")"
368 if ! test -f "$GIT_DIR/BISECT_HEAD" && ! git checkout "$branch" --
370 die "$(eval_gettext "Could not check out original HEAD '\
$branch'.
371 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"
410 cmd="bisect_start $rev"
413 bisect_write "$command" "$rev" ;;
415 die "$(gettext "?? what are you talking about?")" ;;
422 bisect_next_check fail
427 eval_gettext "running \$command"; echo
431 # Check for really bad run error.
432 if [ $res -lt 0 -o $res -ge 128 ]
435 eval_gettext "bisect run failed:
436 exit code \$res from '\
$command' is < 0 or >= 128" &&
442 # Find current state depending on run success or failure.
443 # A special exit code of 125 means cannot test.
454 # We have to use a subshell because "bisect_state" can exit.
455 ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
458 cat "$GIT_DIR/BISECT_RUN"
460 if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
464 gettext "bisect run cannot continue any more" &&
473 eval_gettext "bisect run failed:
474 'bisect_state \
$state' exited with error code \$res" &&
480 if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null
482 gettext "bisect run success"; echo
490 test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
491 cat "$GIT_DIR/BISECT_LOG"
506 bisect_state "$cmd" "$@" ;;
510 # Not sure we want "next" at the UI level anymore.
513 bisect_visualize "$@" ;;
517 bisect_replay "$@" ;;