pull: handle git-fetch's options as well
[gitweb.git] / git-bisect.sh
index 5fb42917a0a9c498dfc0c661f2f088d231024fd9..ae3fec22c48a296cdc1962def9030aa5bb7ce68a 100755 (executable)
@@ -45,10 +45,7 @@ bisect_head()
 
 bisect_autostart() {
        test -s "$GIT_DIR/BISECT_START" || {
-               (
-                       gettext "You need to start by \"git bisect start\"" &&
-                       echo
-               ) >&2
+               gettextln "You need to start by \"git bisect start\"" >&2
                if test -t 0
                then
                        # TRANSLATORS: Make sure to include [Y] and [n] in your
@@ -130,7 +127,7 @@ bisect_start() {
                if test "z$mode" != "z--no-checkout"
                then
                        git checkout "$start_head" -- ||
-                       die "$(eval_gettext "Checking out '\$start_head' failed. Try 'git bisect reset <validbranch>'.")"
+                       die "$(eval_gettext "Checking out '\$start_head' failed. Try 'git bisect reset <valid-branch>'.")"
                fi
        else
                # Get rev from where we start.
@@ -140,7 +137,7 @@ bisect_start() {
                        # cogito usage, and cogito users should understand
                        # it relates to cg-seek.
                        [ -s "$GIT_DIR/head-name" ] &&
-                               die "$(gettext "won't bisect on seeked tree")"
+                               die "$(gettext "won't bisect on cg-seek'ed tree")"
                        start_head="${head#refs/heads/}"
                        ;;
                *)
@@ -240,15 +237,18 @@ bisect_state() {
                check_expected_revs "$rev" ;;
        2,bad|*,good|*,skip)
                shift
-               eval=''
+               hash_list=''
                for rev in "$@"
                do
                        sha=$(git rev-parse --verify "$rev^{commit}") ||
                                die "$(eval_gettext "Bad rev input: \$rev")"
-                       eval="$eval bisect_write '$state' '$sha'; "
+                       hash_list="$hash_list $sha"
                done
-               eval "$eval"
-               check_expected_revs "$@" ;;
+               for rev in $hash_list
+               do
+                       bisect_write "$state" "$rev"
+               done
+               check_expected_revs $hash_list ;;
        *,bad)
                die "$(gettext "'git bisect bad' can take only one argument.")" ;;
        *)
@@ -273,10 +273,7 @@ bisect_next_check() {
        t,,good)
                # have bad but not good.  we could bisect although
                # this is less optimum.
-               (
-                       gettext "Warning: bisecting only with a bad commit." &&
-                       echo
-               ) >&2
+               gettextln "Warning: bisecting only with a bad commit." >&2
                if test -t 0
                then
                        # TRANSLATORS: Make sure to include [Y] and [n] in your
@@ -292,18 +289,12 @@ bisect_next_check() {
 
                if test -s "$GIT_DIR/BISECT_START"
                then
-                       (
-                               gettext "You need to give me at least one good and one bad revisions.
-(You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
-                               echo
-                       ) >&2
+                       gettextln "You need to give me at least one good and one bad revision.
+(You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
                else
-                       (
-                               gettext "You need to start by \"git bisect start\".
-You then need to give me at least one good and one bad revisions.
-(You can use \"git bisect bad\" and \"git bisect good\" for that.)" &&
-                               echo
-                       ) >&2
+                       gettextln "You need to start by \"git bisect start\".
+You then need to give me at least one good and one bad revision.
+(You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
                fi
                exit 1 ;;
        esac
@@ -323,7 +314,23 @@ bisect_next() {
        res=$?
 
        # Check if we should exit because bisection is finished
-       test $res -eq 10 && exit 0
+       if test $res -eq 10
+       then
+               bad_rev=$(git show-ref --hash --verify refs/bisect/bad)
+               bad_commit=$(git show-branch $bad_rev)
+               echo "# first bad commit: $bad_commit" >>"$GIT_DIR/BISECT_LOG"
+               exit 0
+       elif test $res -eq 2
+       then
+               echo "# only skipped commits left to test" >>"$GIT_DIR/BISECT_LOG"
+               good_revs=$(git for-each-ref --format="%(objectname)" "refs/bisect/good-*")
+               for skipped in $(git rev-list refs/bisect/bad --not $good_revs)
+               do
+                       skipped_commit=$(git show-branch $skipped)
+                       echo "# possible first bad commit: $skipped_commit" >>"$GIT_DIR/BISECT_LOG"
+               done
+               exit $res
+       fi
 
        # Check for an error in the bisection process
        test $res -ne 0 && exit $res
@@ -356,12 +363,12 @@ bisect_visualize() {
 
 bisect_reset() {
        test -s "$GIT_DIR/BISECT_START" || {
-               gettext "We are not bisecting."; echo
+               gettextln "We are not bisecting."
                return
        }
        case "$#" in
        0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
-       1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
+       1) git rev-parse --quiet --verify "$1^{commit}" >/dev/null || {
                        invalid="$1"
                        die "$(eval_gettext "'\$invalid' is not a valid commit")"
                }
@@ -404,7 +411,7 @@ bisect_replay () {
        bisect_reset
        while read git bisect command rev
        do
-               test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
+               test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
                if test "$git" = "git-bisect"
                then
                        rev="$command"
@@ -429,18 +436,15 @@ bisect_run () {
        while true
        do
                command="$@"
-               eval_gettext "running \$command"; echo
+               eval_gettextln "running \$command"
                "$@"
                res=$?
 
                # Check for really bad run error.
                if [ $res -lt 0 -o $res -ge 128 ]
                then
-                       (
-                               eval_gettext "bisect run failed:
-exit code \$res from '\$command' is < 0 or >= 128" &&
-                               echo
-                       ) >&2
+                       eval_gettextln "bisect run failed:
+exit code \$res from '\$command' is < 0 or >= 128" >&2
                        exit $res
                fi
 
@@ -457,34 +461,28 @@ exit code \$res from '\$command' is < 0 or >= 128" &&
                fi
 
                # We have to use a subshell because "bisect_state" can exit.
-               ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
+               ( bisect_state $state >"$GIT_DIR/BISECT_RUN" )
                res=$?
 
                cat "$GIT_DIR/BISECT_RUN"
 
                if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
-                       > /dev/null
+                       >/dev/null
                then
-                       (
-                               gettext "bisect run cannot continue any more" &&
-                               echo
-                       ) >&2
+                       gettextln "bisect run cannot continue any more" >&2
                        exit $res
                fi
 
                if [ $res -ne 0 ]
                then
-                       (
-                               eval_gettext "bisect run failed:
-'bisect_state \$state' exited with error code \$res" &&
-                               echo
-                       ) >&2
+                       eval_gettextln "bisect run failed:
+'bisect_state \$state' exited with error code \$res" >&2
                        exit $res
                fi
 
-               if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null
+               if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" >/dev/null
                then
-                       gettext "bisect run success"; echo
+                       gettextln "bisect run success"
                        exit 0;
                fi