Продолжаю тему Subversion + TortoiseSVN. Попытаемся использовать ловушки (hook) для внесения изменений (например — даты checkin и ревизии .dns файла зоны в SOA запись). И используем для этих целей powershell. Изучим вопрос и попробуем добиться результата.

Напоминаю, что для своих целей использую вариант хранилища файл-сервер FSFS. Соответственно, в роли ловушки будем пробовать использовать powershell сценарий. Слово “ловушка” мне крайне не нравится, далее hook буду переводить как обработчик события или триггер.

Материала оказалось достаточно на эту тему. Не могу не сослаться на статью, которая прояснила для меня многое в данном вопросе, переведу отдельные её тезисы на родной язык:

Во-первых, обработчики событий SVN исполняются непосредственно (т.е. могут быть .exe, .bat., .com, .cmd, or windows script files); powershell сценарии не исполняются непосредственно из соображений безопасности, поэтому мы будем вынуждены использовать .bat или .cmd файл в качестве прокси.

Во-вторых, SVN вызывает обработчик события (в нашем случае – прокси) в контексте, в котором не определены переменные окружения (опять-таки, из соображений безопасности); в том числе – без PATH и прочего, поэтому прокси сценарий и сам сценарий powershell должны использоваться полные имена файлов и каталогов.

И напоследок, обработчики некоторых событий (например — post-revprop-change) получают данные через STDIN, но прокси сценарий не передаёт STDIN процессу powershell без дополнительных усилий.

Изучим доступные нам события (ну или триггеры, если будет угодно). Для этого лучше всего воспользоваться документацией разработчиков Subversion:

  • start-commit
    — запускается до начала транзакции, может быть использован для проверки прав. Два аргумента: путь к репозиторию, имя пользователя, активировавшего действие. Если триггер возвращает ненулевое значение, исполнение команды пользователя прекращается и транзакция даже не открывается. Если триггер что-либо вывел в stderr, эта информация будет передана пользователю.
  • pre-commit
    — запускается в конце транзакции, но до фиксации, может использоваться для проверки данных. Как правило, данный триггер используется для проверки выполнения необходимых условий chekin. Два аргумента: путь к репозиторию, имя завершаемой транзакции. Если триггер что-либо вывел в stderr, эта информация будет передана пользователю.
  • post-commit
    — запускается после транзакции, может быть использовано для отправки e-mail или для резервирования хранилища. Два аргумента: путь к репозиторию и созданная ревизия. Exit code игнорируется.
  • pre-revprop-change
    — запускается до изменений свойств, могут быть использованы для проверки доступа. 4 аргумента: путь до репозитория, ревизия, в которой модифицируемое свойство существует, пользователь, свойство.
  • post-revprop-change
    — запускается после изменений в свойствах, параметры – по аналогии.
  • pre-lock
    — перед блокировкой файла. 3 аргумента: путь к репозиторию, путь к блокируемому файлу, пользователь. Если триггер возвращает ненулевое значение, исполнение команды пользователя прекращается. Если триггер что-либо вывел в stderr, эта информация будет передана пользователю.
  • post-lock
    — после успешной блокировки файла. Аргументы: заблокированный путь – stdin, путь к репозиторию, пользователь.
  • pre-unlock
    — перед разблокировкой файла. 3 аргумента: путь к репозиторию, путь к заблокированному файлу, пользователь. Если триггер возвращает ненулевое значение, исполнение команды пользователя прекращается. Если триггер что-либо вывел в stderr, эта информация будет передана пользователю.
  • post-unlock
    — после успешного разблокирования файла. Аргументы: заблокированный путь – stdin, путь к репозиторию, пользователь.

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

c:\windows\system32\windowspowershell\v1.0\powershell.exe
    -command "$input | C:\WORK\test\SVN\DNS\hooks\pre-commit.ps1"
    -repos_path "%1" -txn_name "%2"

(естественно – всё в одну строку, переносы вставлены для восприятия), при этом обработчик на PoSh будет выглядеть приблизительно вот так:

param(
    $repos_path,
    $txn_name
)

@"
Репозиторий : $repos_path
Транзакция  : $txn_name
std_in      : $input
"@ | out-file "C:\WORK\test\SVN\DNS\hooks\log.txt" -append

В результате, в лог файле при фиксировании изменений видим нечто следующее:

Репозиторий : C:\work\test\svn\DNS
Транзакция  : 13-j
std_in      : 

Итак, с передачей параметров всё более менее понятно. Следующим шагом избавимся от необходимости указания полных путей. И после этого приступим к извлечению информации об изменяемых файлах, и по возможности – к их модификации (что настоятельно не рекомендуют делать, кстати).

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка