Bisect run: "skip" current commit if script exit code is 125.
authorChristian Couder <chriscool@tuxfamily.org>
Fri, 26 Oct 2007 03:39:37 +0000 (05:39 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 27 Oct 2007 06:27:24 +0000 (23:27 -0700)
This is incompatible with previous versions because an exit code
of 125 used to mark current commit as "bad". But hopefully this exit
code is not much used by test scripts or other programs. (126 and 127
are used by POSIX compliant shells to mean "found but not
executable" and "command not found", respectively.)

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-bisect.txt
git-bisect.sh
t/t6030-bisect-porcelain.sh

index 785f38142316299a817afe49f854a3114f03ffa1..4795349c10fd91c330ddde2d8397401be09cc86b 100644 (file)
@@ -182,14 +182,18 @@ $ git bisect run my_script
 ------------
 
 Note that the "run" script (`my_script` in the above example) should
-exit with code 0 in case the current source code is good and with a
-code between 1 and 127 (included) in case the current source code is
-bad.
+exit with code 0 in case the current source code is good.  Exit with a
+code between 1 and 127 (inclusive), except 125, if the current
+source code is bad.
 
 Any other exit code will abort the automatic bisect process. (A
 program that does "exit(-1)" leaves $? = 255, see exit(3) manual page,
 the value is chopped with "& 0377".)
 
+The special exit code 125 should be used when the current source code
+cannot be tested. If the "run" script exits with this code, the current
+revision will be skipped, see `git bisect skip` above.
+
 You may often find that during bisect you want to have near-constant
 tweaks (e.g., s/#define DEBUG 0/#define DEBUG 1/ in a header file, or
 "revision that does not have this commit needs this patch applied to
index f8d0099059b2f9bdb27e2bad4f742752ee18c502..180c6c280c8dd2e9622dff26399a6b91540d54fd 100755 (executable)
@@ -392,7 +392,10 @@ bisect_run () {
       fi
 
       # Find current state depending on run success or failure.
-      if [ $res -gt 0 ]; then
+      # A special exit code of 125 means cannot test.
+      if [ $res -eq 125 ]; then
+         state='skip'
+      elif [ $res -gt 0 ]; then
          state='bad'
       else
          state='good'
@@ -404,6 +407,12 @@ bisect_run () {
 
       cat "$GIT_DIR/BISECT_RUN"
 
+      if grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
+               > /dev/null; then
+         echo >&2 "bisect run cannot continue any more"
+         exit $res
+      fi
+
       if [ $res -ne 0 ]; then
          echo >&2 "bisect run failed:"
          echo >&2 "'bisect_state $state' exited with error code $res"
index 16d0c4a90eca9ad866ed37294a17db65992fe4ef..53956c08e2754eb68a2a8311b26e16f5ee891308 100755 (executable)
@@ -177,6 +177,46 @@ test_expect_success 'bisect skip and bisect replay' '
        git bisect reset
 '
 
+HASH6=
+test_expect_success 'bisect run & skip: cannot tell between 2' '
+       add_line_into_file "6: Yet a line." hello &&
+       HASH6=$(git rev-parse --verify HEAD) &&
+       echo "#"\!"/bin/sh" > test_script.sh &&
+       echo "tail -1 hello | grep Ciao > /dev/null && exit 125" >> test_script.sh &&
+       echo "grep line hello > /dev/null" >> test_script.sh &&
+       echo "test \$? -ne 0" >> test_script.sh &&
+       chmod +x test_script.sh &&
+       git bisect start $HASH6 $HASH1 &&
+       if git bisect run ./test_script.sh > my_bisect_log.txt
+       then
+               echo Oops, should have failed.
+               false
+       else
+               test $? -eq 2 &&
+               grep "first bad commit could be any of" my_bisect_log.txt &&
+               ! grep $HASH3 my_bisect_log.txt &&
+               ! grep $HASH6 my_bisect_log.txt &&
+               grep $HASH4 my_bisect_log.txt &&
+               grep $HASH5 my_bisect_log.txt
+       fi
+'
+
+HASH7=
+test_expect_success 'bisect run & skip: find first bad' '
+       git bisect reset &&
+       add_line_into_file "7: Should be the last line." hello &&
+       HASH7=$(git rev-parse --verify HEAD) &&
+       echo "#"\!"/bin/sh" > test_script.sh &&
+       echo "tail -1 hello | grep Ciao > /dev/null && exit 125" >> test_script.sh &&
+       echo "tail -1 hello | grep day > /dev/null && exit 125" >> test_script.sh &&
+       echo "grep Yet hello > /dev/null" >> test_script.sh &&
+       echo "test \$? -ne 0" >> test_script.sh &&
+       chmod +x test_script.sh &&
+       git bisect start $HASH7 $HASH1 &&
+       git bisect run ./test_script.sh > my_bisect_log.txt &&
+       grep "$HASH6 is first bad commit" my_bisect_log.txt
+'
+
 #
 #
 test_done