]> git.ipfire.org Git - thirdparty/git.git/blobdiff - git-bisect.sh
Merge branch 'pb/ref-filter-with-crlf'
[thirdparty/git.git] / git-bisect.sh
index 2f60fefcfaa12c3a4579818d4cd616232340108f..1f3f6e9fc5684d3e9dd2a0ac0260556955c9fa4b 100755 (executable)
@@ -39,59 +39,6 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 TERM_BAD=bad
 TERM_GOOD=good
 
-bisect_head()
-{
-       if git rev-parse --verify -q BISECT_HEAD > /dev/null
-       then
-               echo BISECT_HEAD
-       else
-               echo HEAD
-       fi
-}
-
-bisect_autostart() {
-       test -s "$GIT_DIR/BISECT_START" || {
-               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
-                       # translation. The program will only accept English input
-                       # at this point.
-                       gettext "Do you want me to do it for you [Y/n]? " >&2
-                       read yesno
-                       case "$yesno" in
-                       [Nn]*)
-                               exit ;;
-                       esac
-                       bisect_start
-               else
-                       exit 1
-               fi
-       }
-}
-
-bisect_start() {
-       git bisect--helper --bisect-start $@ || exit
-
-       #
-       # Change state.
-       # In case of mistaken revs or checkout error, or signals received,
-       # "bisect_auto_next" below may exit or misbehave.
-       # We have to trap this to be able to clean up using
-       # "bisect_clean_state".
-       #
-       trap 'git bisect--helper --bisect-clean-state' 0
-       trap 'exit 255' 1 2 3 15
-
-       #
-       # Check if we can proceed to the next bisect state.
-       #
-       get_terms
-       bisect_auto_next
-
-       trap '-' 0
-}
-
 bisect_skip() {
        all=''
        for arg in "$@"
@@ -104,81 +51,7 @@ bisect_skip() {
                esac
                all="$all $revs"
        done
-       eval bisect_state 'skip' $all
-}
-
-bisect_state() {
-       bisect_autostart
-       state=$1
-       git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD || exit
-       get_terms
-       case "$#,$state" in
-       0,*)
-               die "Please call 'bisect_state' with at least one argument." ;;
-       1,"$TERM_BAD"|1,"$TERM_GOOD"|1,skip)
-               bisected_head=$(bisect_head)
-               rev=$(git rev-parse --verify "$bisected_head") ||
-                       die "$(eval_gettext "Bad rev input: \$bisected_head")"
-               git bisect--helper --bisect-write "$state" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit
-               git bisect--helper --check-expected-revs "$rev" ;;
-       2,"$TERM_BAD"|*,"$TERM_GOOD"|*,skip)
-               shift
-               hash_list=''
-               for rev in "$@"
-               do
-                       sha=$(git rev-parse --verify "$rev^{commit}") ||
-                               die "$(eval_gettext "Bad rev input: \$rev")"
-                       hash_list="$hash_list $sha"
-               done
-               for rev in $hash_list
-               do
-                       git bisect--helper --bisect-write "$state" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit
-               done
-               git bisect--helper --check-expected-revs $hash_list ;;
-       *,"$TERM_BAD")
-               die "$(eval_gettext "'git bisect \$TERM_BAD' can take only one argument.")" ;;
-       *)
-               usage ;;
-       esac
-       bisect_auto_next
-}
-
-bisect_auto_next() {
-       git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD && bisect_next || :
-}
-
-bisect_next() {
-       case "$#" in 0) ;; *) usage ;; esac
-       bisect_autostart
-       git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD $TERM_GOOD|| exit
-
-       # Perform all bisection computation, display and checkout
-       git bisect--helper --next-all
-       res=$?
-
-       # Check if we should exit because bisection is finished
-       if test $res -eq 10
-       then
-               bad_rev=$(git show-ref --hash --verify refs/bisect/$TERM_BAD)
-               bad_commit=$(git show-branch $bad_rev)
-               echo "# first $TERM_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/$TERM_GOOD-*")
-               for skipped in $(git rev-list refs/bisect/$TERM_BAD --not $good_revs)
-               do
-                       skipped_commit=$(git show-branch $skipped)
-                       echo "# possible first $TERM_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
-
-       return 0
+       eval git bisect--helper --bisect-state 'skip' $all
 }
 
 bisect_visualize() {
@@ -223,8 +96,7 @@ bisect_replay () {
                get_terms
                case "$command" in
                start)
-                       cmd="bisect_start $rev $tail"
-                       eval "$cmd" ;;
+                       eval "git bisect--helper --bisect-start $rev $tail" ;;
                "$TERM_GOOD"|"$TERM_BAD"|skip)
                        git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;;
                terms)
@@ -234,7 +106,7 @@ bisect_replay () {
                esac
        done <"$file"
        IFS="$oIFS"
-       bisect_auto_next
+       git bisect--helper --bisect-auto-next || exit
 }
 
 bisect_run () {
@@ -269,8 +141,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
                        state="$TERM_GOOD"
                fi
 
-               # We have to use a subshell because "bisect_state" can exit.
-               ( bisect_state $state >"$GIT_DIR/BISECT_RUN" )
+               git bisect--helper --bisect-state $state >"$GIT_DIR/BISECT_RUN"
                res=$?
 
                cat "$GIT_DIR/BISECT_RUN"
@@ -285,7 +156,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
                if [ $res -ne 0 ]
                then
                        eval_gettextln "bisect run failed:
-'bisect_state \$state' exited with error code \$res" >&2
+'bisect-state \$state' exited with error code \$res" >&2
                        exit $res
                fi
 
@@ -324,14 +195,14 @@ case "$#" in
        help)
                git bisect -h ;;
        start)
-               bisect_start "$@" ;;
+               git bisect--helper --bisect-start "$@" ;;
        bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
-               bisect_state "$cmd" "$@" ;;
+               git bisect--helper --bisect-state "$cmd" "$@" ;;
        skip)
                bisect_skip "$@" ;;
        next)
                # Not sure we want "next" at the UI level anymore.
-               bisect_next "$@" ;;
+               git bisect--helper --bisect-next "$@" || exit ;;
        visualize|view)
                bisect_visualize "$@" ;;
        reset)