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 [<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"
38 test -s "$GIT_DIR/BISECT_START" ||
{
40 gettext "You need to start by \"git bisect start\"" &&
45 # TRANSLATORS: Make sure to include [Y] and [n] in your
46 # translation. The program will only accept English input
48 gettext "Do you want me to do it for you [Y/n]? " >&2
65 head=$
(GIT_DIR
="$GIT_DIR" git symbolic-ref
-q HEAD
) ||
66 head=$
(GIT_DIR
="$GIT_DIR" git rev-parse
--verify HEAD
) ||
67 die
"$(gettext "Bad HEAD
- I need a HEAD
")"
70 # Check if we are bisecting.
73 if test -s "$GIT_DIR/BISECT_START"
75 # Reset to the rev from where we started.
76 start_head
=$
(cat "$GIT_DIR/BISECT_START")
77 git checkout
"$start_head" -- ||
exit
79 # Get rev from where we start.
82 # This error message should only be triggered by
83 # cogito usage, and cogito users should understand
84 # it relates to cg-seek.
85 [ -s "$GIT_DIR/head-name" ] &&
86 die
"$(gettext "won
't bisect on seeked tree")"
87 start_head="${head#refs/heads/}"
90 die "$(gettext "Bad HEAD - strange symbolic ref")"
96 # Get rid of any old bisect state.
98 bisect_clean_state || exit
101 # Check for one bad and then some good revisions.
105 case "$arg" in --) has_double_dash=1; break ;; esac
107 orig_args=$(git rev-parse --sq-quote "$@")
110 while [ $# -gt 0 ]; do
118 rev=$(git rev-parse -q --verify "$arg^{commit}") || {
119 test $has_double_dash -eq 1 &&
120 die "$(eval_gettext "'\
$arg' does not appear to be a valid revision")"
124 0) state='bad
' ; bad_seen=1 ;;
127 eval="$eval bisect_write '$state' '$rev' 'nolog
'; "
135 # In case of mistaken revs or checkout error, or signals received,
136 # "bisect_auto_next" below may exit or misbehave.
137 # We have to trap this to be able to clean up using
138 # "bisect_clean_state".
140 trap 'bisect_clean_state
' 0
141 trap 'exit 255' 1 2 3 15
144 # Write new start state.
146 echo "$start_head" >"$GIT_DIR/BISECT_START" &&
147 git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
149 echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
151 # Check if we can proceed to the next bisect state.
164 good|skip) tag="$state"-"$rev" ;;
165 *) die "$(eval_gettext "Bad bisect_write argument: \$state")" ;;
167 git update-ref "refs/bisect/$tag" "$rev" || exit
168 echo "# $state: $(git show-branch $rev)" >>"$GIT_DIR/BISECT_LOG"
169 test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
173 test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
174 test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
177 check_expected_revs() {
179 if ! is_expected_rev "$_rev"; then
180 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
181 rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
193 revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
195 revs=$(git rev-parse --sq-quote "$arg") ;;
199 eval bisect_state 'skip
' $all
207 die "$(gettext "Please call 'bisect_state
' with at least one argument.")" ;;
209 rev=$(git rev-parse --verify HEAD) ||
210 die "$(gettext "Bad rev input: HEAD")"
211 bisect_write "$state" "$rev"
212 check_expected_revs "$rev" ;;
218 sha=$(git rev-parse --verify "$rev^{commit}") ||
219 die "$(eval_gettext "Bad rev input: \$rev")"
220 eval="$eval bisect_write '$state' '$sha'; "
223 check_expected_revs "$@" ;;
225 die "$(gettext "'git bisect bad
' can take only one argument.")" ;;
232 bisect_next_check() {
233 missing_good= missing_bad=
234 git show-ref -q --verify refs/bisect/bad || missing_bad=t
235 test -n "$(git for-each-ref "refs/bisect/good-*")" || missing_good=t
237 case "$missing_good,$missing_bad,$1" in
239 : have both good and bad - ok
242 # do not have both but not asked to fail - just report.
246 # have bad but not good. we could bisect although
247 # this is less optimum.
249 gettext "Warning: bisecting only with a bad commit." &&
254 # TRANSLATORS: Make sure to include [Y] and [n] in your
255 # translation. The program will only accept English input
257 gettext "Are you sure [Y/n]? " >&2
259 case "$yesno" in [Nn]*) exit 1 ;; esac
261 : bisect without good...
265 if test -s "$GIT_DIR/BISECT_START"
268 gettext "You need to give me at least one good and one bad revisions.
269 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
274 gettext "You need to start by \"git bisect start\".
275 You then need to give me at least one good and one bad revisions.
276 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
285 bisect_next_check && bisect_next || :
289 case "$#" in 0) ;; *) usage ;; esac
291 bisect_next_check good
293 # Perform all bisection computation, display and checkout
294 git bisect--helper --next-all
297 # Check if we should exit because bisection is finished
298 test $res -eq 10 && exit 0
300 # Check for an error in the bisection process
301 test $res -ne 0 && exit $res
307 bisect_next_check fail
311 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
312 type gitk >/dev/null 2>&1; then
320 -*) set git log "$@" ;;
325 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
329 test -s "$GIT_DIR/BISECT_START" || {
330 gettext "We are not bisecting."; echo
334 0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
335 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
337 die "$(eval_gettext "'\
$invalid' is not a valid commit")"
343 if git checkout "$branch" -- ; then
346 die "$(eval_gettext "Could not check out original HEAD '\
$branch'.
347 Try 'git bisect
reset <commit
>'.")"
351 bisect_clean_state() {
352 # There may be some refs packed during bisection.
353 git for-each-ref --format='%(refname
) %(objectname
)' refs/bisect/\* |
356 git update-ref -d $ref $hash || exit
358 rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
359 rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
360 rm -f "$GIT_DIR/BISECT_LOG" &&
361 rm -f "$GIT_DIR/BISECT_NAMES" &&
362 rm -f "$GIT_DIR/BISECT_RUN" &&
363 # Cleanup head-name if it got left by an old version of git-bisect
364 rm -f "$GIT_DIR/head-name" &&
366 rm -f "$GIT_DIR/BISECT_START"
371 test "$#" -eq 1 || die "$(gettext "No logfile given")"
372 test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
374 while read git bisect command rev
376 test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
377 if test "$git" = "git-bisect"; then
383 cmd="bisect_start $rev"
386 bisect_write "$command" "$rev" ;;
388 die "$(gettext "?? what are you talking about?")" ;;
395 bisect_next_check fail
400 eval_gettext "running \$command"; echo
404 # Check for really bad run error.
405 if [ $res -lt 0 -o $res -ge 128 ]; then
407 eval_gettext "bisect run failed:
408 exit code \$res from '\
$command' is < 0 or >= 128" &&
414 # Find current state depending on run success or failure.
415 # A special exit code of 125 means cannot test.
416 if [ $res -eq 125 ]; then
418 elif [ $res -gt 0 ]; then
424 # We have to use a subshell because "bisect_state" can exit.
425 ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
428 cat "$GIT_DIR/BISECT_RUN"
430 if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
433 gettext "bisect run cannot continue any more" &&
439 if [ $res -ne 0 ]; then
441 eval_gettext "bisect run failed:
442 'bisect_state \
$state' exited with error code \$res" &&
448 if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null; then
449 gettext "bisect run success"; echo
457 test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
458 cat "$GIT_DIR/BISECT_LOG"
473 bisect_state "$cmd" "$@" ;;
477 # Not sure we want "next" at the UI level anymore.
480 bisect_visualize "$@" ;;
484 bisect_replay "$@" ;;