Зачем мой SVN предварительно совершал крючок работать на местном уровне, но не в совершении?

StackOverflow https://stackoverflow.com/questions/4340215

Вопрос

У меня есть следующий предварительный коммитский крючок для использования 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, чтобы она была отображена в неудаче Commit.

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

Твой,
Тревор

Это было полезно?

Решение 2

Я обнаружил ответ после длинной и извилистой дороги. В основном, в моем скрипте выше я использую В моих командах SVN, но в предварительный коммит крюк Вы должны использовать -та, не -р. Отказ Полный скрипт ниже:

#!/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 ]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top