Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

среда, 10 июня 2009 г.

Получение Revision Number из SVN с помощью Ant

Несколько часов назад у меня появилась задача: в веб-интерфейсе разрабатываемой системы необходимо показывать номер ревизии (Revision Number) из Subversion. Все исходники проекта хранятся в Subversion, поэтому перед компиляцией (или перед сборкой) необходимо запрашивать Subversion на получение Revision Number проекта, и его вставлять в интерфейс. Естественно, это должно выполняться автоматически перед каждой сборкой.

Решено сделать следующее:
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.

Была написана следующая цель в файле сборки:



<target name="get.revision.and.replace" description="Get revision number, and places it into JSPs">
<exec executable="svn" output="svndump">
<arg value="info"/>
<!-- any filename can be here, because we need only Revision property, which is general for all filenames -->
<arg value="build.xml"/>
</exec>
<loadproperties srcfile="svndump"/>
<echo message="current revision is ${Revision}"/>
<delete file="svndump"/>
<replace file="${basedir}/project/WebContent/templates/head.jsp" token="__REVISION_NUMBER__" value="${Revision}"/>
<replace file="${basedir}/project/WebContent/templates/head_login.jsp" token="__REVISION_NUMBER__" value="${Revision}"/>
</target>


Атрибут output команды <exec> определяет файл, куда записывается вывод исполняемой команды. Как уже говорилось, формат этого вывода таков (Имя: значение), что понимается командами загрузки свойств Ant без изменений, что очень удобно. После загрузки свойств командой <loadproperties srcfile="svndump"/> файл вывода svndump удаляется командой <delete file="svndump"/>. В конце концов, два раза вызывается команда <replace>, которая и заменяет в определенных файлах требуемую лексему на номер ревизии.

3 комментария:

  1. Поправка на счёт чтения вывода svn info как properties-файла: имена пропертей обрезаются до первого пробела. В результате имеем только 10 из 13ти значений и не получится без препросессинга получить и Repository Root и Repository UUID, например.

    Передо мной встала похожая задача.
    Спасибо за толчок в правильном направлении :)

    ОтветитьУдалить
  2. Ага, спасибо, xBlackCat!

    Я не тестировал остальные свойства, так как мне нужно было только свойство Revision.

    ОтветитьУдалить

Постоянные читатели