Почему мой хук предварительной фиксации SVN работает локально, а не при фиксации?
У меня есть следующий хук pre-commit для использования JavaScript Lint для проверки файлов JavaScript перед фиксацией:
#!/bin/env bash
REPOS="$1"
TXN="$2"
ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -r$TXN $REPOS | $SED -e "s/^....//g"`
JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.conf
for FILE in $FILES_CHANGED
do
if $ECHO $FILE | $GREP "\.js$"
then
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
then
exit $JSL_ERROR_CODE
fi
fi
done
# If we got here, nothing is wrong.
exit 0
Этот код работает локально следующим образом: ./pre-commit /my/svn/repo/location 6781 # номер - номер транзакции
НО это не делает ошибку правильно на SVN коммит.
Я уже учел:
- Поскольку $PATH не было, я явно установил все пути команд.
- Я ловлю правильный код ошибки из команды jsl для выхода.
- Я нажимаю STDOUT в STDERR для команды jsl, чтобы она отображалась при неудачной фиксации.
Что мне не хватает?
С уважением,
Тревор
3 ответа
Я нашел ответ после долгой и извилистой дороги. По сути, в моем скрипте выше я использую -r в моих командах svn, но в хуке перед фиксацией вы должны использовать -t, а не -r. Полный скрипт ниже:
#!/bin/sh
REPOS="$1"
TXN="$2"
ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"`
JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.default.conf
for FILE in $FILES_CHANGED
do
if $ECHO $FILE | $GREP "\.js$"
then
$SVNLOOK cat -t$TXN $REPOS $FILE | $JSL -conf $JSL_CONF -stdin -nologo 1>&2
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
then
exit $JSL_ERROR_CODE
fi
fi
done
# If we got here, nothing is wrong.
exit 0
Вполне возможно, что одна из ваших программ ожидает установки некоторых переменных среды.
Из создания и настройки репозитория:
По соображениям безопасности в хранилище Subversion выполняются сценарии подключения с пустой средой, то есть переменные среды вообще не задаются, даже $PATH или%PATH%. Из-за этого многие администраторы сбиты с толку, когда их скрипт-хук отлично работает вручную, но не работает при запуске Subversion. Не забудьте явно установить переменные среды в вашем хуке и / или использовать абсолютные пути к программам.
Попробуйте выполнить их локально без установленных переменных окружения и посмотрите, работает ли это.
Я обычно заканчиваю тем, что импортировал всю свою среду в первой строке моих скриптов ловушек:
source /home/username/.bash_profile
Если искомая ошибка исходит от svn
в трубопроводе, а jsl
, затем $?
не будет содержать код возврата. использование ${PIPESTATUS[@]}
вместо. Это массив, который содержит коды возврата каждого члена конвейера. Быстрый способ проверить любой неуказанный сбой:
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
или же
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]