Я бы проверил, чтобы на каждом этапе ваш скрипт возвращал ненулевой код завершения при ошибке.Проверьте, не возвращает ли ваш python3.1 foo.py --test
ненулевой код завершения, если тест не пройден.Убедитесь, что ваша команда make test
возвращает ненулевой код выхода.И наконец, проверьте, что ваш pre-commit
хук сам возвращает ненулевой код завершения при ошибке.
Вы можете проверить ненулевой код завершения, добавив || echo $?
в конец команды;он выведет код завершения, если команда не удалась.
Следующий пример работает для меня (я перенаправляю stderr на /dev/null
, чтобы избежать слишком большого количества посторонних выводов):
$ 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
Обратите внимание на || exit 1
.В этом нет необходимости, если make test
- последняя команда в ловушке, поскольку состояние выхода последней команды будет состоянием выхода скрипта.Но если у вас есть более поздние проверки в вашем хуке pre-commit
, то вам нужно убедиться, что вы выходите с ошибкой;в противном случае успешное выполнение команды в конце ловушки приведет к завершению работы вашего сценария со статусом 0
.