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





Вы можете использовать свойство svn:keywords, чтобы включить ключевое слово Rev.
Затем вы можете использовать $Rev$ в своем коде, и SVN автоматически расширит его при обновлении до $Rev: 256 $, который затем может анализировать ...
Дополнительная информация о руководстве по Subversion
Два пути:
Вставьте в код $ Id $ или $ Редакция $. Затем установите для файла свойство svn: keywords = "Версия идентификатора". Это даст вам последнюю измененную версию этого исходного файла. Подходит для небольших проектов и сценариев.
В качестве альтернативы можно использовать процесс, управляемый 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 и извлечь его, что не так уж сложно (это файл XML).
Википедия делает это на страница их версии, чтобы указать версию программного обеспечения, которое работает в реальном времени; код здесь - ищите метод getSvnRevision ().
Вам нужно будет рекурсивно проверить все файлы записей, чтобы найти самый высокий номер редакции. Я предполагаю, что это то, что делает svnversion.
svnversion, похоже, возвращает последнюю измененную ревизию всего репозитория (а не только путь к вашему WC). См. Мой ответ на этот связанный вопрос о том, как я решил эту проблему: stackoverflow.com/questions/56227/…
Похоже, что это не работает с Subversion 1.7, которая исключает каталог .svn везде, кроме верхнего уровня песочницы.
Вы также можете использовать SubWCRev, который является частью TortoiseSVN.
SubWCRev - это консольная программа Windows, которую можно использовать для чтения статуса рабочей копии Subversion и, при необходимости, для подстановки ключевых слов в файле шаблона. Это часто используется как часть процесса сборки как средство включения информации о рабочей копии в объект, который вы строите. Обычно его можно использовать для включения номера редакции в поле «О программе».
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
в вашем 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"
...
Сейчас же:
sed заменяет RevNumber в .dox на вывод svnversion (выполняется в основной папке вашего репозитория) и сохраняет измененный файл в YourFileDummy.dox.doxygen выполняется на YourFileDummy.dox для создания документации.
Это не то, что нужно, если вам нужен номер полной версии проекта, поскольку $ Rev $ изменяется только при обновлении этого файла, а не при обновлении чего-либо в проекте.