The 'bisect run' feature doesn't currently accept any options, but it could, and that means a '--' option. Additionally, this adds an actual test script for bisect run - it creates a repository with a failed build, then attempts to bisect the offending commit. Signed-off-by: Stephen Oberholtzer <stevie@xxxxxxxxx> --- Documentation/git-bisect.txt | 2 +- git-bisect.sh | 19 ++++++- t/t6071-bisect-run.sh | 96 ++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 2 deletions(-) create mode 100755 t/t6071-bisect-run.sh diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt index 7586c5a843..e72353e157 100644 --- a/Documentation/git-bisect.txt +++ b/Documentation/git-bisect.txt @@ -26,7 +26,7 @@ on the subcommand: git bisect (visualize|view) git bisect replay <logfile> git bisect log - git bisect run <cmd>... + git bisect run [--] <cmd>... git bisect help This command uses a binary search algorithm to find which commit in diff --git a/git-bisect.sh b/git-bisect.sh index efee12b8b1..46085651e1 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -26,7 +26,7 @@ git bisect replay <logfile> replay bisection log. git bisect log show bisect log. -git bisect run <cmd>... +git bisect run [--] <cmd>... use <cmd>... to automatically bisect. Please use "git help bisect" to get the full man page.' @@ -238,6 +238,23 @@ bisect_replay () { bisect_run () { git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit + # check for options + # (there aren't any supported yet, unless you count "--") + while test -n "$1" + do + case "$1" in + --) + shift + break ;; + -*) + option="$1" # \$1 is not expanded by eval_gettext + die "$(eval_gettext "bisect run: invalid option: \$option")" ;; + *) + break ;; + esac + shift + done + test -n "$*" || die "$(gettext "bisect run failed: no command provided.")" while true diff --git a/t/t6071-bisect-run.sh b/t/t6071-bisect-run.sh new file mode 100755 index 0000000000..e173ca18b3 --- /dev/null +++ b/t/t6071-bisect-run.sh @@ -0,0 +1,96 @@ +#!/bin/sh + +test_description='Tests git bisect run' + +exec </dev/null + +. ./test-lib.sh + +{ test_expect_success 'Setting up repo for "git bisect run" tests.' "$(cat)" ; } <<'SETUP' +echo '.DEFAULT: dummy +.PHONY: dummy +dummy: + true +' > Makefile && +make && +echo '0' >path0 && +git update-index --add -- Makefile path0 && +git commit -q -m 'initial commit' && +git tag working0 && +# make some commits that don't cause problems +for x in `test_seq 1 20`; do + echo "$x" >path0 && + git update-index --replace -- path0 && + git commit -q -m "working commit $x" && + git tag "working$x" || exit 1 +done && +# break the makefile +sed -i.bak -e 's/true/false/' Makefile && +rm -f Makefile.bak && +! make && +git update-index --replace -- Makefile && +git commit -q -m "First broken commit" && +git tag broken0 && +# make some more commits that still FTBFS +for x in `test_seq 1 20`; do + echo "$x" >path0 && + git update-index --replace -- path0 && + git commit -q -m "broken build $x" && + git tag "broken$x" || exit 1 +done && +# repair it +git checkout working0 -- Makefile && +make && +git update-index --replace -- Makefile && +git commit -q -m "First repaired commit" && +git tag fixed0 && +# make some more commits with the bugfix +for x in `test_seq 1 20`; do + echo "$x" >path0 && + git update-index --replace -- path0 && + git commit -q -m "fixed build $x" && + git tag "fixed$x" || exit 1 +done +SETUP + +test_expect_success 'setup first bisect' 'git bisect start && git bisect good working0 && git bisect bad broken9' + +test_expect_failure() { + shift + test_must_fail "$@" +} + +# okay, let's do some negative testing + +OLDPATH="$PATH" + +PATH="$PATH:." + +test_expect_success 'setup this-is-not-a-valid-option' ' + echo "#/bin/sh" > --this-is-not-a-valid-option && + chmod a+x -- --this-is-not-a-valid-option && + --this-is-not-a-valid-option' + +test_expect_failure 'git bisect run: reject unrecognized options' git bisect run --this-is-not-a-valid-option + +PATH="$OLDPATH" + +# finally, verify that '--' is honored (note that will mess things up and require a bisect reset) +PATH="$PATH:." + +test_expect_success 'git bisect run: honor --' 'git bisect run -- --this-is-not-a-valid-option' + +PATH="$OLDPATH" + +# now we have to undo the bisect run +test_expect_success 'restarting bisection' 'git bisect reset && git bisect start && git bisect good working0 && git bisect bad broken9' + +test_expect_success "running bisection" " + git bisect run $success_option make && + # we should have determined that broken0 is the first bad version + test_cmp_rev broken0 refs/bisect/bad && + # and that version should be the one checked out + test_cmp_rev broken0 HEAD +" + +test_done -- 2.20.1