I would check to make sure that each step of the way, your script returns a non-zero exit code on failure. Check to see if your python3.1 foo.py --test
returns a non-zero exit code if a test fails. Check to make sure your make test
command returns a non-zero exit code. And finally, check that your pre-commit
hook itself returns a non-zero exit code on failure.
You can check for a non-zero exit code by adding || echo $?
to the end of a command; that will print out the exit code if the command failed.
The following example works for me (I'm redirecting stderr to /dev/null
to avoid including too much extraneous output here):
$ python3.1 test.py 2>/dev/null || echo $?
1
$ make test 2>/dev/null || echo $?
python3.1 test.py
2
$ .git/hooks/pre-commit 2>/dev/null || echo $?
python3.1 test.py
1
test.py
:
import unittest
class TestFailure(unittest.TestCase):
def testFail(self):
assert(False)
if __name__ == '__main__':
unittest.main()
Makefile
:
test:
python3.1 test.py
.git/hooks/pre-commit
:
#!/bin/sh
make test || exit 1
Note the || exit 1
. This isn't necessary if make test
is the last command in the hook, as the exit status of the last command will be the exit status of the script. But if you have later checks in your pre-commit
hook, then you need to make sure you exit with an error; otherwise, a successful command at the end of the hook will cause your script to exit with a status of 0
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…