Скрипт svn post-commit запускается из командной строки, но не при передаче файлов в svn - PullRequest
0 голосов
/ 31 марта 2010

У меня в svn есть хук post-commit, который отлично запускается из командной строки при запуске

env - ./foo.sh /path/to/svn/repos/ 12345

но когда скрипт вызывается из svn, он не работает.

Что я в основном делаю, так это проверяю зафиксированные файлы, и если конкретный файл изменяется, я делаю svn-экспорт его в сетевой ресурс. Прекрасно работает из командной строки.

Сценарий пост-фиксации выглядит следующим образом:

#!/bin/sh

REPOS="$1"
REV="$2"

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"`
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST="/mnt/build/somefile-r$REV.zip"

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST`
fi

exit 0

Есть ли способ вывести какие-либо сообщения об ошибках в файл при запуске скрипта или, в частности, строку экспорта svn (где, я думаю, может быть проблема)?

1 Ответ

1 голос
/ 31 марта 2010

Стандартный вывод скрипта ловушки отбрасывается, но стандартная ошибка возвращается клиенту, по крайней мере, в последних версиях Subversion. Я думал, что так было некоторое время, но книга SVN 1.4 говорит, что вывод отбрасывается, поэтому вы можете проверить, что вы используете последнюю версию сервера - видя стандартную ошибку Поток - это хороший способ получить раннее предупреждение о распространенных типах ошибок.

Чтобы отправить вывод команды в файл и включить стандартный вывод ошибок в файл, чтобы сохранить все это в одном месте, выполните

command >/path/to/logfile 2>&1

Используйте >> вместо > для добавления в файл:

command >>/path/to/logfile 2>&1

Поскольку стандартный вывод ошибок отправляется обратно клиенту svn, вы также можете таким образом передавать информацию из стандартного вывода для одной команды,

command 1>&2

или для всего сценария, поставив

exec 1>&2

вверху скрипта.

С первого взгляда я вижу одну проблему с вашим скриптом: если предположить, что обратные кавычки в строке экспорта svn не являются артефактом разметки, вы должны удалить их. (Они выполнят команду экспорта, которую вы написали, а затем примут ее вывод и выполнят этот вывод как другую команду - почти наверняка не то, что вы хотели.)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi

(я не знал о синтаксисе двойных квадратных скобок в bash, для меня это новое открытие!)

...