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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
40
0
47 603
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

Это не то, что нужно, если вам нужен номер полной версии проекта, поскольку $ Rev $ изменяется только при обновлении этого файла, а не при обновлении чего-либо в проекте.

Charles Duffy 28.10.2008 16:11

Два пути:

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

Arne Evertsson 14.10.2008 12:28

svnversion, похоже, возвращает последнюю измененную ревизию всего репозитория (а не только путь к вашему WC). См. Мой ответ на этот связанный вопрос о том, как я решил эту проблему: stackoverflow.com/questions/56227/…

hasseg 30.10.2008 16:33

Похоже, что это не работает с Subversion 1.7, которая исключает каталог .svn везде, кроме верхнего уровня песочницы.

Dave Taflin 04.06.2015 01:24

Вы также можете использовать 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"
...

Сейчас же:

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

Другие вопросы по теме