Получение номера репозитория Subversion в коде

Я хотел бы реализовать способ записи версии проекта в коде, чтобы ее можно было использовать при тестировании и отслеживать ошибки. Похоже, что лучше всего использовать номер текущей версии от Subversion. Есть ли простой способ привязать это число к заголовочному файлу (C++ в моем случае) или чему-то еще, что я могу затем получить в коде? Я думаю, это хук фиксации поста или что-то в этом роде?

Есть ли у кого-нибудь опыт реализации этого (с кодом, которым можно поделиться, пожалуйста?) Или может предложить лучшую альтернативу? Спасибо.

Ответов (6)

Решение

Несмотря на то, что трюк с ключевыми словами ревизии изящен, он обновляет файл только тогда, когда он изменен в этой ревизии - если вы не измените файл, он продолжит отражать старую ревизию.

Если вы хотите, чтобы программное обеспечение всегда отражало общий номер ревизии, вам придется вникнуть в соответствующий файл записей SVN и извлечь его, что не так уж сложно (это файл XML).

Википедия делает это на странице своей версии, чтобы указать версию программного обеспечения, которое работает в реальном времени; код здесь - ищите метод getSvnRevision () .

в вашем Makefile добавьте:

SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...

тогда вы можете использовать макрос в SVN_REV любом месте вашего кода, например:

printf ("Version: SVN %s\n", SVN_REV);

Хорошее актуальное решение:

Создайте, Makefile содержащий следующую строку (в той же папке, что и YourFile.dox ):

sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox

И YourFile.dox должен содержать это:

...
PROJECT_NUMBER         = "Revision RevNumber"
...

Теперь:

  1. sedзаменяет RevNumberв .dox выводом svnversion(выполняется в основной папке вашего репозитория) и сохраняет измененный файл вYourFileDummy.dox
  2. doxygenвыполняется YourFileDummy.doxдля создания документации
  3. Теперь ваша документация будет содержать номер редакции!

Два пути:

Вставьте $ Id $ или $ Revision $ в код. Затем установите для файла свойство svn: keywords = "Id Revision" . Это даст вам последнюю измененную версию этого исходного файла. Подходит для небольших проектов и сценариев.

В качестве альтернативы можно использовать процесс, управляемый Makefile, и инструмент командной строки svnversion. (Зависит от языка - это должно работать для C/C++)

echo -n "#define VERSION 1.0.1-" > version.h
svnversion -n . >> version.h

Или какой-нибудь более сложный скрипт сборки с sed и version.h.in. Тогда просто #include version.h

Это даст вам номер версии репозитория, который будет меняться с каждой фиксацией / обновлением и, вероятно, является более подходящим номером версии для большинства проектов.

Примечание. Я также использовал удобочитаемую строку версии, которую обновляю вручную. Пример даст: Версия: 1.0.1-r13445

~ J

Вы можете использовать svn:keywords свойство для включения Rev ключевого слова.

Затем вы можете использовать $Rev$ в своем коде, и SVN автоматически расширит его при обновлении, чтобы $Rev: 256 $ затем проанализировать ...

Дополнительная информация в руководстве по Subversion

Вы также можете использовать SubWCRev, который является частью TortoiseSVN.

SubWCRev - это консольная программа Windows, которую можно использовать для чтения статуса рабочей копии Subversion и, при необходимости, для подстановки ключевых слов в файле шаблона. Это часто используется как часть процесса сборки как средство включения информации о рабочей копии в объект, который вы строите. Обычно его можно использовать для включения номера редакции в поле «О программе».

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html