Решено сделать следующее:
1) на место, куда требуется вставлять Revision Number (страничка head.jsp, которая вставляется инклюдом во все остальные странички), вставляется лексема __REVISION_NUMBER__, которая перед компиляцией заменяется на актуальный Revision Number, полученный из Subversion
2) создается цель (target) в Ant, которая получает Revision Number из SVN, и сохраняет его в соответствующее свойство (property)
3) применяется команда <replace>, которая заменяет лексему __REVISION_NUMBER__ на значение свойства, куда сохранили Revision Number
Все стандартно, но встает вопрос - как получить Revision Number из Subversion. Немножко погуглив, я нашел решение, про которое и расскажу.
В Subversion есть команда info, которая выдает информацию о локальном либо удаленном (находящимся в репозитории) файле. Выдается следующая информация:
- Path
- Name
- URL
- Revision
- Repository Root
- Repository UUID
- Node Kind
- Last Changed Author
- Last Changed Revision
- Last Changed Date
- Text Last Updated
- Properties Last Updated
- Checksum
- Lock Token
- Lock Owner
- Lock Creation Date
Например, при выполнении команды
svn info build.xml
на консоль будет выведена следующая информация:
Path: build.xml
Name: build.xml
URL: svn://svn/PROJECT/trunk
Repository Root: svn://svn
Repository UUID: (UUID репозитория)
Revision: 3558
Node Kind: file
Schedule: normal
Last Changed Author: awm
Last Changed Rev: 3443
Last Changed Date: (date goes here...)
Text Last Updated: (date goes here...)
Checksum: (checksum goes here....)
Для нас здесь важно свойство Revision. Именно его значение мы и собираемся вставлять вместо лексемы __REVISION_NUMBER__. Причем не важно, какой именно файл будет передан в качестве аргумента команде svn info. Дело в том, что номер ревизии является общим для всех файлом в проекте, поэтому выполнить команду svn info мы можем для любого файле проекта, в частности, и для файла сборки build.xml.
Удобно и то, что формат представления информации командой svn info понимается командами Ant, в частности, командой <property file=""/> и <loadproperties/>. Это означает, что скинув дамп вывода в какой-нибудь файл, мы затем можем без изменений передать этой файл этим командам, и они прочитают свойства, которые выведены командой svn info:
Name, URL, Repository Root, Repository UUID, Revision, Node Kind, Schedule, Last Changed, Author, Last Changed Rev, Last Changed Date, Text Last Updated, Checksum.
Была написана следующая цель в файле сборки:
|
Атрибут output команды <exec> определяет файл, куда записывается вывод исполняемой команды. Как уже говорилось, формат этого вывода таков (Имя: значение), что понимается командами загрузки свойств Ant без изменений, что очень удобно. После загрузки свойств командой <loadproperties srcfile="svndump"/> файл вывода svndump удаляется командой <delete file="svndump"/>. В конце концов, два раза вызывается команда <replace>, которая и заменяет в определенных файлах требуемую лексему на номер ревизии.
Поправка на счёт чтения вывода svn info как properties-файла: имена пропертей обрезаются до первого пробела. В результате имеем только 10 из 13ти значений и не получится без препросессинга получить и Repository Root и Repository UUID, например.
ОтветитьУдалитьПередо мной встала похожая задача.
Спасибо за толчок в правильном направлении :)
Ага, спасибо, xBlackCat!
ОтветитьУдалитьЯ не тестировал остальные свойства, так как мне нужно было только свойство Revision.
попробуйте svnversion
ОтветитьУдалить