Распространенные типы ловушек Subversion

Какие сценарии ловушек люди используют для Subversion? Просто общие идеи, но код тоже подойдет!

Ответов (16)

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

Для этого вам нужно включить скрипт-перехватчик pre-revprop-change. Приведенный пример, если он включен, позволяет редактировать только свойство комментария и быть только исходным коммиттером. Отлично подходит для исправления опечаток.

Для тех, кто ищет pre-revprop-change.bat для операции snvsync :

https://gist.github.com/1679659

@ECHO OFF

set user=%3

if /I '%user%'=='syncuser' goto ERROR_REV

exit 0

:ERROR_REV echo "Only the syncuser user may change revision properties" >&2
exit 1

Это просто отсюда: http://chestofbooks.com/computers/revision-control/subversion-svn/Repository-Replication-Reposadmin-Maint-Replication.html и адаптировано для Windows.

Я использую перехватчики пост-фиксации ( думаю, именно этот ), чтобы публиковать сообщения на форуме Basecamp для каждой фиксации. Два преимущества:

  1. Как ведущий разработчик, я каждое утро получаю сводку коммитов (через RSS-канал с этого форума базового лагеря) и могу довольно быстро увидеть, чем занимается моя команда.

  2. Наша установка Trac / SVN находится за нашим брандмауэром, так что это дает моим руководителям в других местах окно в то, что мы делаем. Они могут этого не понимать, но для менеджера большая активность выглядит, ну, ну, много активности;)

Я предполагаю, что конечный результат этого аналогичен тому, что делает @Aviv.

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

На моем рабочем месте мы создали ловушку после фиксации, которая генерирует RSS-каналы, которые отображаются на различных панелях мониторинга и используются для того, чтобы рецензенты кода знали, когда пришло время проверять, и чтобы мы видели, что новые сотрудники делают достаточно .

Ловушка для уведомления системы управления ошибками / проблемами об изменениях в репозитории. Т.е. сообщение фиксации содержит ошибку: 546 или аналогичный тег, который анализируется и передается в систему управления ошибками.

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

Мы используем скрипт фиксации, чтобы запустить нашего релиз-робота. Запись информации о новом выпуске в файл с именем changes.txt в наших различных продуктах приведет к созданию тега и соответствующих артефактов.

С помощью наших скриптов ловушек мы проверяем следующее:

  • Было предоставлено сообщение журнала фиксации
  • Что для фиксации был указан рецензент
  • Что в репозитории не попадает автоматически сгенерированный код или запрещенные типы файлов.
  • Отправьте электронное письмо, когда будет создана ветка / тег

Мы по-прежнему хотим реализовать следующее:

  • Отправлять электронное письмо, когда пользователь блокирует файл
  • Отправьте электронное письмо, когда ваш замок украден
  • Отправлять всем электронное письмо, когда свойство ревизии было изменено

мы используем их для нескольких целей:

  • интеграция с системой отслеживания ошибок ( в нашем случае Trac - сообщение фиксации с надписью Closes # 514 автоматически помечает эту ошибку как закрытую
  • интеграция с интеграцией сборки ( в нашем случае buildbot - фиксация отслеживаемой ветки запускает сборку
  • ловушка pre-commit для проверки фиксации - мы используем svnchecker . Он проверяет наш код Python на правильность PEP8.
  • отправка проверенных писем в список рассылки
  • запуск скриптов отступов

Мы используем FogBugz для отслеживания ошибок, он предоставляет скрипты фиксации подрывной деятельности, которые позволяют вам включать номер дела в вашу проверку в комментариях, а затем связывает ошибку с проверкой, которая ее исправила. Это действительно требует настройки экземпляра WebSVN, чтобы у вас была веб-программа просмотра для вашего репозитория.

Если с репозиторием работают как пользователи Unix, так и Windows, я настоятельно рекомендую вам использовать скрипт -перехватчик case-insensitive.py перед фиксацией в качестве меры предосторожности. Это предотвращает трудноразрешимые ситуации, когда обновления svn не работают для пользователей Windows из-за переименования файла, которое изменяет только регистр имени файла . Поверьте, это избавит вас от неприятностей.

У меня есть одна установка с использованием библиотеки Ruby Tinder, которую я отправляю в комнату для костра. Если кому-то нужен сценарий, я могу опубликовать или отправить вам код.

Другие распространенные сообщения, которые я видел, - это сообщения в системах отслеживания ошибок и уведомления по электронной почте.

Я использую pre-revprop-change ловушку, которая позволяет мне возвращаться и редактировать комментарии и подобную информацию после выполнения фиксации. Это очень полезно, если в комментариях коммита отсутствует / ошибочная информация.

Здесь я размещаю pre-revprop-change.bat командный файл для Windows NT или новее. Вы, безусловно, можете улучшить его с помощью дополнительных модификаций. Вы также можете получить post-revprop-change.cmd от него, чтобы создать резервную копию старого snv:log или просто добавить его в новый журнал.

Единственная сложная часть заключалась в том, чтобы иметь возможность фактически анализировать stdin из командного файла. Здесь это делается с помощью FIND.EXE команды.

Другое дело, что у меня были сообщения от других пользователей о проблемах с использованием команды /b with exit . Вам может просто потребоваться удалить это /b в вашем конкретном приложении, если случаи ошибок не работают должным образом.

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

goto :eof



:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

Хук предварительной фиксации Windows, чтобы проверить, что журнал что-то содержит.

@ECHO OFF
setlocal

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get subversion arguments
set repos=%~1
set txn=%2

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set some variables
set svnlookparam="%repos%" -t %txn%

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
set bIsEmpty=true
for /f "tokens=* usebackq" %%g in (`svnlook log %svnlookparam%`) do (
   set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

echo Allowed. >&2

goto :END


:ERROR_EMPTY
echo Empty log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
:: You may require to remove the /b below if your hook is called directly by subversion
exit /b 1

:END
endlocal

post-commit, чтобы отправить уведомление по электронной почте о том, что что-то изменилось в репозитории, в список писем. Вам нужен sendmail.exe в той же папке, что и ваш файл ловушки, вместе с sendmail.ini.

Вам также понадобится файл post-commit.tos.txt рядом с вашим post-commit.cmd, чтобы перечислить получателей почты. Файл должен содержать:

[email protected],[email protected],[email protected]

Вот код ловушки:

@ECHO OFF
setlocal

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get subversion arguments
set repos=%~1
set rev=%2

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set some variables
set tos=%repos%\hooks\%~n0.tos.txt
set reposname=%~nx1
set svnlookparam="%repos%" --revision %rev%

if not exist "%tos%" goto :END

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Prepare sendmail email file
set author=
for /f "tokens=* usebackq" %%g in (`svnlook author %svnlookparam%`) do (
  set author=%%g
)

for /f "tokens=* usebackq delims=" %%g in ("%tos%") do (
  set EmailNotificationTo=%%g
)
set SendMailFile=%~n0_%reposname%_%rev%.sm

echo To: %EmailNotificationTo% >> "%SendMailFile%"
echo From: %reposname%[email protected] >> "%SendMailFile%"
echo Subject: [%reposname%] Revision %rev% - Subversion Commit Notification  >> "%SendMailFile%"

echo --- log [%author%] --- >> "%SendMailFile%"
svnlook log %svnlookparam% >> "%SendMailFile%" 2>&1
echo --- changed --- >> "%SendMailFile%"
svnlook changed %svnlookparam% --copy-info >> "%SendMailFile%" 2>&1

echo .>> "%SendMailFile%"

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Send email
type "%SendMailFile%" | "%~dp0sendmail.exe" -t

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Clean-up
if exist "%SendMailFile%" del "%SendMailFile%"


:END
endlocal

Я забыл ввести комментарий при фиксации. У меня не было времени понять, почему мой хук перед изменением ревпропа не работал. Таким образом, следующая команда svnadmin сработала для меня, чтобы ввести сообщение о фиксации:, svnadmin setlog <filesystem path to my repository> --bypass-hooks -r 117 junk где «мусор» - это файл, содержащий текст, который я хотел сделать комментарием. svn setlog help есть дополнительная информация об использовании ...