среда, 27 февраля 2013 г.

Настройка git pre-commit hook под Windows

Задача: запретить коммиты кода в git-е под Windows, если для Python-проекта не прошли все указанные юнит-тесты.
Решение: настроить файл git pre-commit hook.

Для того, чтобы сделать pre-commit hook в git под Windows, который будет автоматически прогонять юнит-тесты перед коммитами, как вариант, можно сделать следующее:
  1. Создать в каталоге с проектом .git/hooks/ файл pre-commit (пример файла, достаточно скопировать его в указанный каталог).Файл надо отредактировать, указав свои локальные пути до PowerShell и юнит-тестов на Python.
  2. Укажите путь к вашему PowerShell, не изменяя ключи и слеши:
    export powerShell="c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command"
  3. Укажите путь до вашего питона и команду запуска юнит-тестов для вашего проекта (в нашем примере в программу 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 это будет выглядеть как ошибка при коммите: