все форумы все темы добавить тему
Автоматическое изменение номера версии
Номер версии LabCMS состоит из трех частей: X.Y.ZZZ
где
X - главный номер
Y - вспомогательный номер
ZZZ- номер ревизии
 
Если X и Y меняются относительно редко и поменять их руками проблемы не составляет, то ZZZ должна меняться при каждом изменении репозитория. Делать это руками перспектива не очень заманчивая, поэтому встал вопрос об автоматизации.
Итак, задача следующая:
1. Автоматически менять номер версии в коде.
2. Поместить номер версии а архив с кодом.
3. Выложить обновленный архив на сайте.
4. Обновить номер версии на странице загрузки сайта.
 
Будем решать проблемы по порядку:
 
Прежде всего, необходимо в файле с номером версии автоматически менять номер ревизии. Вспоминаем что у subversion есть замечательное свойство svn:keywords! Указываем это свойство для файла с версией, в файле вместо номера ревизии пишем "$Rev: 1 $", пробуем - работает! Отлично! Пробуем еще раз - не работает... Совсем не отлично... В чем же дело? Оказывается, номер ревизии подставляется только при коммите самого файла... То есть перед комитом файл надо хоть немного изменить. Опять ручная работа?
 
Снова лезем изучать мануал по svn, находим раздел про хуки. Хуки (hooks), это такие программы, которые выполняются по наступлению определенного события в репозитории. Нас в первую очередь интересует хук pre-commit, то есть программа, которая должна выполнится непосредственно перед началом анализа изменений в коде. Казалось бы, что может быть проще - изменяй при помощи *.bat файла в коде одну строчку и он будет постоянно обновляться. Все бы так и работало, если бы не... если бы не windows, консоль которого предназначена для чего угодно, только не для работы с файлами. НАйти в файле и заменить фрагмент текста оказалось весьма нетривиальной задачей. В итоге, на просторах сети встретилось решение, позволяющее производить поиск и замену теста в файле приямо из bat файла. Правда, при этом bat файл создавал временный исполняемый бинарник, но решение вполне рабочее.
 
И вот когда решение, наконец, было найдено, оказалось что стоило так же заглянуть в руководство по TortoiseSVN (svn-клиент под windows). Оказалось что в его составе есть очень полезная утилитка SubWCRev.exe, которая именно тем и занимается, что подставляет в различные файлы информацию из репозитория. В результате законченное решение приняло следующий вид:
 
start-commit-hook вызывает файл update.bat следующего содержания
 
Text
"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" path\to\working\copy path\to\working\copy\revision.tpl.php path\to\working\copy\revision.php
exit 0

 
где
path\to\working\copy - путь рабочей копии проекта
revision.tpl.php - шаблон файла для замены
revision.php - файл для сохранения результатов
 
файл revision.tpl.php имеет следующее содержание
PHP
<?
        $revision=$WCREV$+1;

где вместо $WCREV$ подставляется текущий номер ревизии, а +1 потому что после коммита номер ревизии увеличится на единицу.