Pull to refresh

SVN post-commit hook. Отправка сообщений в локальной сети

Для чего


Недавно начали использовать SVN в пределах отдела (10 человек). Для фиксаций текущих изменений используем ветки, из которых потом сборщик проекта сливает все изменения в trunk. Вручную контролировать появление новых ревизий ветках утомительно и велика вероятность что-нибудь пропустить. В итоге появилась необходимость в посылке оповещения сборщику проекта о наличии новых фиксаций.


Ограничения


Стандартный post-commit hook предлагает отправку уведомлений на e-mail, но я работаю в госорганизации и по каким-то причинам у нас отсутствует доступ в интернет, локального почтового сервера у нас тоже нет. Поднимать почтовый сервер только для отправки сообщений о коммитах — решение не намного лучше чем проверка появления новых ревизий вручную.
На рабочих станциях стоит Windows XP и Windows 7 с Tortoise SVN. Сервер VisualSVN Server крутится на одной из рабочих станций, на которой также стоит Windows 7.

Процесс


В какой-то момент ко мне пришло озарение, что для хук это просто bat файл в который переданы какие-то параметры. Для post-commit хука это путь до репозитория и номер ревизии. А раз хук это просто исполняемый файл, то нужно чтобы при вызове этого файла отправлялось сообщение с данными о произведенной фиксации, такие как имя измененного файла, автор, номер ревизии. Тут можно выделить две задачи как передать и что передать.

Как передать

В Windows 7 отсутствует служба net send с помощью которой можно было бы послать сообщение о фиксации, следовательно было нужно найти ей замену. Первая ссылка в яндексе дала ответ: WinSent Messenger. Этот мессенджер нужно было поставить на компьютер сборщика проекта. Здесь же нашлась и утилита для командной строки Sent, которую можно вызвать в хуке для отправки сообщения. Формат команды Sent такой:
sent.exe [/t:timeout] {[/u:]users | /d:domains | *} ... message
Например:
sent "ComputerName" "Revision 1 commited"

Что передать

Как я уже говорил в хук передаются параметры произведенной ревизии. В принципе, можно было бы послать сообщение только с номером ревизии, но я решил на этом не останавливаться. При помощи svnlook, параметрами которой как раз являются путь до репозитория и номер ревизии, можно получить недостающие данные о произведенной фиксации. Проблема в том, что нельзя непосредственно подставить данные выводимые svnlook в сообщение отправляемое командой sent. Здесь мне помог хабрапост про мультиплеер на .bat. Я решил применить возможно не самое красивое, но работающее решение: выводить результаты svnlook в файл, а потом считывать файл и писать его в переменную, которую потом подставлять в сообщение о ревизии.

Реализация

Для работы хука необходимо, помимо svn сервера и клиента, установить себе WinSent Messenger и утилиту Sent. Пишем скрипт со следующим содержанием. Называем его post-commit.bak и кладем его в папку hooks репозитория.

rem Получаем параметры зафиксированной ревизии и пишем их в файлы
c:\Progra~1\Visual~1\bin\svnlook.exe author %1 -r %2 > d:\repos\test\hooks\author
c:\Progra~1\Visual~1\bin\svnlook.exe changed %1 -r %2 > d:\repos\test\hooks\changed

rem Читаем из файлов то что туда записали и присваиваем это переменным
set /p author=<d:\repos\test\hooks\author
set /p changed=<d:\repos\test\hooks\changed

rem Выводим
c:\Progra~1\Sent\Sent.exe "dell" "%changed% have been commited by %author%. Revision %2% "


Параметром %1 в хук передается путь до репозитория, %2 — номер ревизии. В процессе выполнения хука в папке с репозиторием создаются два временных файла author и changed в которые выводятся имя автора и путь до измененного файла. Затем данные из этих файлов читаются и присваиваются одноименным переменным. Командой sent посылатся сообщение с использованием полученных данных.

Результаты

Все готово для испытаний. Если все сделано правильно после фиксации, приходит сообщение примерно такого вида:
image

В итоге


Использование такой системы извещения, помимо того, что является приятным бонусом к svn, имеет ряд достоинств:
  • помогает сборщику проекта не пропускать появление новых изменений и своевременно переносить их в основной ствол проекта
  • её просто реализовать
  • не требуется почтового сервера
  • сообщение приходят сразу после фиксации

Есть конечно и недостатки:
  • инициализация утилиты sent занимает определенное время (1-2 секунды), что затягивает процесс фиксацию
  • если компьютер сборщика отключен то сообщение не будет доставлено
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.