Получение номера хранилища Subversion в коде

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

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

19.08.2008 14:19:06
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

14
30.08.2008 04:23:00
Вы должны были бы рекурсивно проверить все записи файлов, чтобы найти самый высокий номер ревизии. Я думаю, это то, что делает svnversion.
Arne Evertsson 14.10.2008 08:28:46
svnversion, похоже, возвращает последнюю измененную ревизию всего хранилища (а не только путь вашего WC). Смотрите мой ответ на этот связанный вопрос о том, как я решил это: stackoverflow.com/questions/56227/…
hasseg 30.10.2008 13:33:43
Похоже, что это ломается с Subversion 1.7, который удаляет каталог .svn везде, кроме верхнего уровня песочницы.
Dave Taflin 3.06.2015 22:24:12

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

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

Больше информации о руководстве Subversion

4
19.08.2008 14:26:10
Это неправильно, если вам нужен полный номер версии проекта, так как $ Rev $ изменяется только при обновлении этого файла, а не при обновлении чего-либо в проекте.
Charles Duffy 28.10.2008 13:11:03

Два пути:

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

28
19.08.2008 14:39:59

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

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

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

13
9.10.2008 10:16:43

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

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

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

printf ("Version: SVN %s\n", SVN_REV);
6
11.05.2013 00:51:21

Хорошее современное решение:

Создайте 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. Ваша документация теперь будет содержать номер редакции!
0
18.04.2017 09:26:41