[PATCH] Fix bisection terminating condition
[git.git] / git-bisect-script
index 2233b41..649b702 100755 (executable)
@@ -58,7 +58,7 @@ bisect_start() {
 bisect_bad() {
        bisect_autostart
         case "$#" in 0 | 1) ;; *) usage ;; esac
-       rev=$(git-rev-parse --revs-only --verify --default HEAD "$@") || exit
+       rev=$(git-rev-parse --verify --default HEAD "$@") || exit
        echo "$rev" > "$GIT_DIR/refs/bisect/bad"
        bisect_auto_next
 }
@@ -67,7 +67,7 @@ bisect_good() {
        bisect_autostart
         case "$#" in
        0)    revs=$(git-rev-parse --verify HEAD) || exit ;;
-       *)    revs=$(git-rev-parse --revs-only "$@") || exit ;;
+       *)    revs=$(git-rev-parse --revs-only --no-flags "$@") || exit ;;
        esac
        for rev in $revs
        do
@@ -105,12 +105,16 @@ bisect_next() {
        good=$(git-rev-parse --sq --revs-only --not \
                $(cd "$GIT_DIR" && ls refs/bisect/good-*)) &&
        rev=$(eval "git-rev-list --bisect $good $bad") || exit
-       nr=$(eval "git-rev-list $rev $good" | wc -l) || exit
-       if [ "$nr" -le "1" ]; then
-           echo "$bad is first bad commit"
-           git-diff-tree --pretty $bad
+       if [ -z "$rev" ]; then
+           echo "$bad was both good and bad"
+           exit 1
+       fi
+       if [ "$rev" = "$bad" ]; then
+           echo "$rev is first bad commit"
+           git-diff-tree --pretty $rev
            exit 0
        fi
+       nr=$(eval "git-rev-list $rev $good" | wc -l) || exit
        echo "Bisecting: $nr revisions left to test after this"
        echo "$rev" > "$GIT_DIR/refs/heads/new-bisect"
        git checkout new-bisect || exit