Merge branch 'mg/doc-bisect-tweak-worktree'

* mg/doc-bisect-tweak-worktree:
  git-bisect.txt: example for bisecting with hot-fix
  git-bisect.txt: streamline run presentation
This commit is contained in:
Junio C Hamano 2011-03-22 21:38:15 -07:00
commit b350f7797c

View File

@ -279,53 +279,68 @@ $ git bisect start HEAD origin -- # HEAD is bad, origin is good
$ git bisect run make test # "make test" builds and tests $ git bisect run make test # "make test" builds and tests
------------ ------------
* Automatically bisect a broken test suite:
+
------------
$ cat ~/test.sh
#!/bin/sh
make || exit 125 # this skips broken builds
make test # "make test" runs the test suite
$ git bisect start v1.3 v1.1 -- # v1.3 is bad, v1.1 is good
$ git bisect run ~/test.sh
------------
+
Here we use a "test.sh" custom script. In this script, if "make"
fails, we skip the current commit.
+
It is safer to use a custom script outside the repository to prevent
interactions between the bisect, make and test processes and the
script.
+
"make test" should "exit 0", if the test suite passes, and
"exit 1" otherwise.
* Automatically bisect a broken test case: * Automatically bisect a broken test case:
+ +
------------ ------------
$ cat ~/test.sh $ cat ~/test.sh
#!/bin/sh #!/bin/sh
make || exit 125 # this skips broken builds make || exit 125 # this skips broken builds
~/check_test_case.sh # does the test case passes ? ~/check_test_case.sh # does the test case pass?
$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 $ git bisect start HEAD HEAD~10 -- # culprit is among the last 10
$ git bisect run ~/test.sh $ git bisect run ~/test.sh
------------ ------------
+ +
Here "check_test_case.sh" should "exit 0" if the test case passes, Here we use a "test.sh" custom script. In this script, if "make"
fails, we skip the current commit.
"check_test_case.sh" should "exit 0" if the test case passes,
and "exit 1" otherwise. and "exit 1" otherwise.
+ +
It is safer if both "test.sh" and "check_test_case.sh" scripts are It is safer if both "test.sh" and "check_test_case.sh" are
outside the repository to prevent interactions between the bisect, outside the repository to prevent interactions between the bisect,
make and test processes and the scripts. make and test processes and the scripts.
* Automatically bisect a broken test suite: * Automatically bisect with temporary modifications (hot-fix):
+
------------
$ cat ~/test.sh
#!/bin/sh
# tweak the working tree by merging the hot-fix branch
# and then attempt a build
if git merge --no-commit hot-fix &&
make
then
# run project specific test and report its status
~/check_test_case.sh
status=$?
else
# tell the caller this is untestable
status=125
fi
# undo the tweak to allow clean flipping to the next commit
git reset --hard
# return control
exit $status
------------
+
This applies modifications from a hot-fix branch before each test run,
e.g. in case your build or test environment changed so that older
revisions may need a fix which newer ones have already. (Make sure the
hot-fix branch is based off a commit which is contained in all revisions
which you are bisecting, so that the merge does not pull in too much, or
use `git cherry-pick` instead of `git merge`.)
* Automatically bisect a broken test case:
+ +
------------ ------------
$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 $ git bisect start HEAD HEAD~10 -- # culprit is among the last 10
$ git bisect run sh -c "make || exit 125; ~/check_test_case.sh" $ git bisect run sh -c "make || exit 125; ~/check_test_case.sh"
------------ ------------
+ +
Does the same as the previous example, but on a single line. This shows that you can do without a run script if you write the test
on a single line.
SEE ALSO SEE ALSO
-------- --------