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"
40 if test -f "$GIT_DIR/BISECT_HEAD"
49 test -s "$GIT_DIR/BISECT_START" ||
{
50 gettextln
"You need to start by \"git bisect start\"" >&2
53 # TRANSLATORS: Make sure to include [Y] and [n] in your
54 # translation. The program will only accept English input
56 gettext "Do you want me to do it for you [Y/n]? " >&2
71 # Check for one bad and then some good revisions.
75 case "$arg" in --) has_double_dash
=1; break ;; esac
77 orig_args
=$
(git rev-parse
--sq-quote "$@")
80 if test "z$(git rev-parse --is-bare-repository)" != zfalse
86 while [ $# -gt 0 ]; do
97 die
"$(eval_gettext "unrecognised option
: '\$arg'")" ;;
99 rev=$
(git rev-parse
-q --verify "$arg^{commit}") ||
{
100 test $has_double_dash -eq 1 &&
101 die
"$(eval_gettext "'\$arg' does not appear to be a valid revision
")"
105 0) state
=$TERM_BAD ; bad_seen
=1 ;;
106 *) state
=$TERM_GOOD ;;
108 eval="$eval bisect_write '$state' '$rev' 'nolog' &&"
117 head=$
(GIT_DIR
="$GIT_DIR" git symbolic-ref
-q HEAD
) ||
118 head=$
(GIT_DIR
="$GIT_DIR" git rev-parse
--verify HEAD
) ||
119 die
"$(gettext "Bad HEAD
- I need a HEAD
")"
122 # Check if we are bisecting.
125 if test -s "$GIT_DIR/BISECT_START"
127 # Reset to the rev from where we started.
128 start_head
=$
(cat "$GIT_DIR/BISECT_START")
129 if test "z$mode" != "z--no-checkout"
131 git checkout
"$start_head" -- ||
132 die
"$(eval_gettext "Checking out
'\$start_head' failed. Try
'git bisect reset <valid-branch>'.
")"
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 cg-seek'ed 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.
192 tag
="$state"-"$rev" ;;
194 die
"$(eval_gettext "Bad bisect_write argument
: \
$state")" ;;
196 git update-ref
"refs/bisect/$tag" "$rev" ||
exit
197 echo "# $state: $(git show-branch $rev)" >>"$GIT_DIR/BISECT_LOG"
198 test -n "$nolog" ||
echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
202 test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
203 test "$1" = $
(cat "$GIT_DIR/BISECT_EXPECTED_REV")
206 check_expected_revs
() {
208 if ! is_expected_rev
"$_rev"
210 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
211 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
223 revs
=$
(git rev-list
"$arg") || die
"$(eval_gettext "Bad
rev input
: \
$arg")" ;;
225 revs
=$
(git rev-parse
--sq-quote "$arg") ;;
229 eval bisect_state
'skip' $all
237 die
"$(gettext "Please call
'bisect_state' with
at least one argument.
")" ;;
238 1,"$TERM_BAD"|
1,"$TERM_GOOD"|
1,skip
)
239 rev=$
(git rev-parse
--verify $
(bisect_head
)) ||
240 die
"$(gettext "Bad
rev input
: $
(bisect_head
)")"
241 bisect_write
"$state" "$rev"
242 check_expected_revs
"$rev" ;;
243 2,"$TERM_BAD"|
*,"$TERM_GOOD"|
*,skip
)
248 sha
=$
(git rev-parse
--verify "$rev^{commit}") ||
249 die
"$(eval_gettext "Bad
rev input
: \
$rev")"
250 hash_list
="$hash_list $sha"
252 for rev in $hash_list
254 bisect_write
"$state" "$rev"
256 check_expected_revs
$hash_list ;;
258 die
"$(eval_gettext "'git bisect \$TERM_BAD' can take only one argument.
")" ;;
265 bisect_next_check
() {
266 missing_good
= missing_bad
=
267 git show-ref
-q --verify refs
/bisect
/$TERM_BAD || missing_bad
=t
268 test -n "$(git for-each-ref "refs
/bisect
/$TERM_GOOD-*")" || missing_good
=t
270 case "$missing_good,$missing_bad,$1" in
272 : have both
$TERM_GOOD and
$TERM_BAD - ok
275 # do not have both but not asked to fail - just report.
279 # have bad but not good. we could bisect although
280 # this is less optimum.
281 eval_gettextln
"Warning: bisecting only with a \$TERM_BAD commit." >&2
284 # TRANSLATORS: Make sure to include [Y] and [n] in your
285 # translation. The program will only accept English input
287 gettext "Are you sure [Y/n]? " >&2
289 case "$yesno" in [Nn
]*) exit 1 ;; esac
291 : bisect without
$TERM_GOOD...
295 if test -s "$GIT_DIR/BISECT_START"
297 gettextln
"You need to give me at least one good and one bad revision.
298 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
300 gettextln
"You need to start by \"git bisect start\".
301 You then need to give me at least one good and one bad revision.
302 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
309 bisect_next_check
&& bisect_next ||
:
313 case "$#" in 0) ;; *) usage
;; esac
315 bisect_next_check
$TERM_GOOD
317 # Perform all bisection computation, display and checkout
318 git bisect--helper
--next-all $
(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
321 # Check if we should exit because bisection is finished
324 bad_rev
=$
(git show-ref
--hash --verify refs
/bisect
/$TERM_BAD)
325 bad_commit
=$
(git show-branch
$bad_rev)
326 echo "# first $TERM_BAD commit: $bad_commit" >>"$GIT_DIR/BISECT_LOG"
330 echo "# only skipped commits left to test" >>"$GIT_DIR/BISECT_LOG"
331 good_revs
=$
(git for-each-ref
--format="%(objectname)" "refs/bisect/$TERM_GOOD-*")
332 for skipped
in $
(git rev-list refs
/bisect
/$TERM_BAD --not $good_revs)
334 skipped_commit
=$
(git show-branch
$skipped)
335 echo "# possible first $TERM_BAD commit: $skipped_commit" >>"$GIT_DIR/BISECT_LOG"
340 # Check for an error in the bisection process
341 test $res -ne 0 && exit $res
347 bisect_next_check fail
351 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
352 type gitk
>/dev
/null
2>&1
361 -*) set git log
"$@" ;;
366 eval '"$@"' --bisect -- $
(cat "$GIT_DIR/BISECT_NAMES")
370 test -s "$GIT_DIR/BISECT_START" ||
{
371 gettextln
"We are not bisecting."
375 0) branch
=$
(cat "$GIT_DIR/BISECT_START") ;;
376 1) git rev-parse
--quiet --verify "$1^{commit}" >/dev
/null ||
{
378 die
"$(eval_gettext "'\$invalid' is not a valid commit
")"
385 if ! test -f "$GIT_DIR/BISECT_HEAD" && ! git checkout
"$branch" --
387 die
"$(eval_gettext "Could not check out original HEAD
'\$branch'.
388 Try
'git bisect reset <commit>'.
")"
393 bisect_clean_state
() {
394 # There may be some refs packed during bisection.
395 git for-each-ref
--format='%(refname) %(objectname)' refs
/bisect
/\
* |
398 git update-ref
-d $ref $hash ||
exit
400 rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
401 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
402 rm -f "$GIT_DIR/BISECT_LOG" &&
403 rm -f "$GIT_DIR/BISECT_NAMES" &&
404 rm -f "$GIT_DIR/BISECT_RUN" &&
405 # Cleanup head-name if it got left by an old version of git-bisect
406 rm -f "$GIT_DIR/head-name" &&
407 git update-ref
-d --no-deref BISECT_HEAD
&&
408 # clean up BISECT_START last
409 rm -f "$GIT_DIR/BISECT_START"
414 test "$#" -eq 1 || die
"$(gettext "No logfile given
")"
415 test -r "$file" || die
"$(eval_gettext "cannot
read \
$file for replaying
")"
417 while read git bisect
command rev
419 test "$git $bisect" = "git bisect" ||
test "$git" = "git-bisect" ||
continue
420 if test "$git" = "git-bisect"
427 cmd
="bisect_start $rev"
429 $TERM_GOOD|
$TERM_BAD|skip
)
430 bisect_write
"$command" "$rev" ;;
432 die
"$(gettext "?? what are you talking about?
")" ;;
439 bisect_next_check fail
444 eval_gettextln
"running \$command"
448 # Check for really bad run error.
449 if [ $res -lt 0 -o $res -ge 128 ]
451 eval_gettextln
"bisect run failed:
452 exit code \$res from '\$command' is < 0 or >= 128" >&2
456 # Find current state depending on run success or failure.
457 # A special exit code of 125 means cannot test.
468 # We have to use a subshell because "bisect_state" can exit.
469 ( bisect_state
$state >"$GIT_DIR/BISECT_RUN" )
472 cat "$GIT_DIR/BISECT_RUN"
474 if sane_grep
"first $TERM_BAD commit could be any of" "$GIT_DIR/BISECT_RUN" \
477 gettextln
"bisect run cannot continue any more" >&2
483 eval_gettextln
"bisect run failed:
484 'bisect_state \$state' exited with error code \$res" >&2
488 if sane_grep
"is the first $TERM_BAD commit" "$GIT_DIR/BISECT_RUN" >/dev
/null
490 gettextln
"bisect run success"
498 test -s "$GIT_DIR/BISECT_LOG" || die
"$(gettext "We are not bisecting.
")"
499 cat "$GIT_DIR/BISECT_LOG"
514 bisect_state
"$cmd" "$@" ;;
518 # Not sure we want "next" at the UI level anymore.
521 bisect_visualize
"$@" ;;
525 bisect_replay
"$@" ;;