Писал на в песочницу. Вот скоро мои труды канут в бездну. Чтобы совсем не пропало надо хотя бы тут сохранить.
Для чего
Недавно начали использовать 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 с помощью которой можно было бы послать сообщение о фиксации, следовательно было нужно найти ей замену. Первая ссылка в яндексе дала ответ: . Этот мессенджер нужно было поставить на компьютер сборщика проекта. Здесь же нашлась и утилита для командной строки , которую можно вызвать в хуке для отправки сообщения. Формат команды Sent такой:
sent.exe [/t:timeout] {[/u:]users | /d:domains | *} ... message
Например:
sent "ComputerName" "Revision 1 commited"
Что передать
Как я уже говорил в хук передаются параметры произведенной ревизии. В принципе, можно было бы послать сообщение только с номером ревизии, но я решил на этом не останавливаться. При помощи svnlook, параметрами которой как раз являются путь до репозитория и номер ревизии, можно получить недостающие данные о произведенной фиксации. Проблема в том, что нельзя непосредственно подставить данные выводимые svnlook в сообщение отправляемое командой sent. Здесь мне помог хабрапост про . Я решил применить возможно не самое красивое, но работающее решение: выводить результаты 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 посылатся сообщение с использованием полученных данных.
Результаты
Все готово для испытаний. Если все сделано правильно после фиксации, приходит сообщение примерно такого вида:

В итоге
Использование такой системы извещения, помимо того, что является приятным бонусом к svn, имеет ряд достоинств:
- помогает сборщику проекта не пропускать появление новых изменений и своевременно переносить их в основной ствол проекта
- её просто реализовать
- не требуется почтового сервера
- сообщение приходят сразу после фиксации
Есть конечно и недостатки:
- инициализация утилиты sent занимает определенное время (1-2 секунды), что затягивает процесс фиксацию
- если компьютер сборщика отключен то сообщение не будет доставлено
Читайте также
Последние новости
План занятий
Обучение детей от года до 3 лет плаванию, как правило, проходит в три этапа. На первом этапе ребенок должен адаптироваться к воде, избавиться от страха перед глубиной, неизвестной средой. Намного проще дети привыкают к бассейну, где есть бортики, вода теплая и прозрачная. Чуть сложнее дети адаптируются к открытым водоемам с темной и прохладной ...Читать далее »
Гимнастика от 2 лет до 2 лет 6 месяцев
1. Самостоятельная ходьба. 2. Бег вдогонку за взрослым или к взрослому в разном темпе. 3. Руки вверх, потянуться – «деревья большие большие», развести руки в стороны. 4. Ходьба по доске, приподнятой над полом на 15–20 см. 5. Приседания. 6. Подъем туловища с опорой на ладони в положении лежа на животе. 7. Хлопк...Читать далее »
Проблема: ожоги, ушибы, травмы
Немного повзрослев, ребенок начинает интересоваться источниками огня, что чревато ожогом. При незначительном ожоге необходимо поврежденный участок тела поместить под холодную проточную воду, а затем обработать антиожоговым аэрозолем. В период выздоровления применяют массаж, который способствует улучшению лимфо– и кровотока. В резуль...Читать далее »
Проблема: плоскостопие
Когда ребенок начинает ходить, его первые шаги могут быть омрачены плоскостопием. К сожалению, если эта болезнь наследственная, то волнения вполне обоснованны. И здесь без посещения детского врача ортопеда не обойтись. Его рекомендации относятся к укреплению подошвенного свода стопы вашего ребенка. Костная структура стопы ребенка ...Читать далее »
Рефлекторные движения
Рефлекторные гимнастические упражнения, В основе которых лежат врожденные двигательные рефлекторные реакции, проводятся первые три пять месяцев жизни ребенка, когда еще не утрачены безусловные двигательные рефлексы – «автоматическая походка», ладонно ротовой рефлекс, хоботковый рефлекс, сохранение равновесия, защитно оборонительные рефлексы. Рефлекторные гимнасти...Читать далее »
Техника выполнения: растирание
Прямолинейное растирание Выполняется концевыми фалангами одного или нескольких пальцев. Движение проводится прямолинейно одной рукой или обеими, иногда с отягощением. Круговое растирание Проводится с помощью круговых движений концевыми фалангами одного или нескольких пальцев. Кисть располагается с опорой на основании ладони, а манипуляции выполняют в сторону мизинца одной рук...Читать далее »
Проблема: пупочная грыжа
Пупочная грыжа – это патологическое состояние, в котором через несколько расширенное пупочное кольцо происходит выпячивание брюшины, сальника и даже кишечника. Причина заболевания следующая: вследствие дефекта передней брюшной стенки и пупочного кольца проявляется округлое или овальное выпячивание. Чаще факторами, провоцирующими повышение внутрибрюшного давления, являются кашель, запоры ...Читать далее »
