Почему мой хук предварительной фиксации SVN работает локально, а не при фиксации? - PullRequest
2 голосов
/ 03 декабря 2010

У меня есть следующий хук предварительной фиксации для использования 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 commit ошибка не выдается.

Я уже учел:

  • Поскольку $ PATH отсутствует, я явно задал все пути к командам.
  • Я получаю правильный код ошибки из команды jsl для выхода.
  • Я нажимаю STDOUT в STDERR для команды jsl, чтобы она отображалась при неудачной фиксации.

Чего мне не хватает?

Ваш
Тревор

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Я нашел ответ после долгой и извилистой дороги.В основном, в моем скрипте выше я использую -r в моих командах svn, , но в pre-commit hook вы должны использовать -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
3 голосов
/ 03 декабря 2010

Возможно, одна из ваших программ ожидает установки переменных окружения.

С Создание и настройка хранилища :

В целях безопасности репозиторий Subversion выполняет сценарии ловушек с пустой средой, то есть переменные среды вообще не задаются, даже $ PATH или% PATH%. Из-за этого многие администраторы сбиты с толку, когда их скрипт-ловушка работает нормально вручную, но не работает при запуске Subversion. Обязательно установите переменные окружения в вашем хуке и / или используйте абсолютные пути к программам.

Попробуйте выполнить их локально без установленных переменных окружения и посмотрите, работает ли это.

Я обычно заканчиваю тем, что импортировал всю свою среду в первой строке моих скриптов ловушек:

source /home/username/.bash_profile
0 голосов
/ 03 декабря 2010

Если искомая ошибка исходит от 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 ]
...