Задача: запретить коммиты кода в git-е под Windows, если для Python-проекта не прошли все указанные юнит-тесты.
Решение: настроить файл git pre-commit hook.
Для того, чтобы сделать pre-commit hook в git под Windows, который будет автоматически прогонять юнит-тесты перед коммитами, как вариант, можно сделать следующее:
- Создать в каталоге с проектом .git/hooks/ файл pre-commit (пример файла, достаточно скопировать его в указанный каталог).Файл надо отредактировать, указав свои локальные пути до PowerShell и юнит-тестов на Python.
- Укажите путь к вашему PowerShell, не изменяя ключи и слеши:
export powerShell="c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command" - Укажите путь до вашего питона и команду запуска юнит-тестов для вашего проекта (в нашем примере в программу tester.py уже встроены для этого специальные консольные ключи):
export testRun="c:/Python32/python.exe c:/work/tester.py -u all"
Код файла pre-commit:
#!/bin/sh # (c) Positive Technologies 2012 # Author: Timur Gilmullin # # Your must install Power Shell on Win. Then put this file into your .git/hooks/ directory. # # Setup path to commands for execute. # # Path to local PowerShell: powerShell="c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command" # Command to run unittest: testRun="c:/Python32/python.exe c:/work/Tester.py -u all" # Running pre-commit and gets exit-code: runString=$powerShell' '$testRun exec $runString exitCode=$? echo "Exit-code of unittest is:" echo $exitCode if [ x"$exitCode" == x"0" ] then exit 0 else echo "Not all unit-tests passed! Commit cancelled!" exit 1 fi
Сейчас, если внутри каталога .git/hooks/ разместить аналогичный файл с именем pre-commit, то git не даст закоммитить ваши изменения, пока не пройдут все юнит-тесты. Например, для пользователей Git Extension под Windows это будет выглядеть как ошибка при коммите: