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

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

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


person Ali Parr    schedule 19.08.2008    source источник


Ответы (6)


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

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

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

person Rob    schedule 30.08.2008
comment
Вам нужно будет рекурсивно проверить все файлы записей, чтобы найти самый высокий номер редакции. Я предполагаю, что это то, что делает svnversion. - person Arne Evertsson; 14.10.2008
comment
svnversion, похоже, возвращает последнюю измененную ревизию всего репозитория (а не только путь к вашему WC). См. Мой ответ на этот связанный вопрос о том, как я решил эту проблему: stackoverflow.com/questions/56227/ - person hasseg; 30.10.2008
comment
Похоже, что это не работает с Subversion 1.7, которая исключает каталог .svn везде, кроме верхнего уровня песочницы. - person Dave Taflin; 04.06.2015

Два пути:

Вставьте в код $ 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

person jmanning2k    schedule 19.08.2008

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

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

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

person Bill    schedule 09.10.2008

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

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

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

printf ("Version: SVN %s\n", SVN_REV);
person iCoder    schedule 11.05.2013

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

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

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

person Vincent Robert    schedule 19.08.2008
comment
Это не то, что нужно, если вам нужен номер полной версии проекта, поскольку $ Rev $ изменяется только при обновлении этого файла, а не при обновлении чего-либо в проекте. - person Charles Duffy; 28.10.2008

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

Создайте 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. Теперь ваша документация будет содержать номер редакции!
person Jesse    schedule 18.04.2017