У меня есть проект python под SVN, и я хочу отобразить номер версии при ее запуске. Есть ли способ сделать это (например, автоматически запускать короткий скрипт на коммит, который может обновлять файл версии или запрашивать репозиторий SVN в Python?)Получение номера версии SVN в программе автоматически
ответ
Я не уверен в специфике Python, но если вы помещаете строку $ Revision $ в свой файл где-нибудь, и у вас есть опция enable-auto-props = true в вашей конфигурации SVN, она будет переписана на что-то вроде $ Редакция: 144 $. Затем вы можете разобрать это в своем скрипте.
Есть a number of property keywords you can use in this way.
У этого не будет никаких накладных расходов, например. запрашивая репо SVN, потому что строка жестко закодирована в ваш файл при фиксации или обновлении.
Я не знаю, как вы бы разобрать это в Python, но в PHP я хотел бы сделать:
$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
echo 'Revision is ' . $matches[1];
}
Файл hooks/pre-commit
в вашем репозитории - это сценарий или программа, которая будет выполняться перед успешным фиксацией. Просто сделайте это скриптом, который обновляет ваш файл с соответствующим номером версии, когда он выполняется (номер версии передается вашему скрипту по мере его запуска). Вот учебник с примером написания крючка для предварительной фиксации: http://wordaligned.org/articles/a-subversion-pre-commit-hook
Уч. Предотвращение файлов, связанных с фиксацией крюка, обычно является плохой идеей. Версия в репо будет отличаться от версии в рабочей копии, и это может привести к некоторой путанице. Коммиттер должен вернуться к более ранней версии файла, а затем получить новый, что может привести к конфликту, поскольку svn сохранил исходную версию в текстовой базе рабочей копии. – sunny256
Я согласен с тем, что это опасно и обычно не является желаемым поведением, но если вы ограничиваете себя должным образом, я не вижу проблемы. Например, если у вас есть файл svn_version.txt, который не содержит ничего, кроме текущего номера версии, то это будет совершенно безопасно; ваша локальная копия всегда будет иметь версию, которую вы проверили, и в репозитории всегда будет самая последняя (часто такая же, как ваша рабочая копия). –
Отъезд pysvn. он предоставляет расширения в Python для функциональности среды Subversion.
+1 для pysvn, но лучше не связываться с «этим» –
В Django есть фрагмент кода, который позволяет вам это делать, я бы рекомендовал посмотреть на него. http://code.djangoproject.com/browser/django/trunk/django/utils/version.py
Эта функция работает только в том случае, если вы работаете из проверки subversion. Если это то, чего хочет OP, тогда проблема решена. Тем не менее, я подозреваю, что он может захотеть, чтобы сценарий содержался в нем или в файле конфигурации или что-то в его ревизии подрывной деятельности, даже если скрипт больше не находится под дебаффером, и в этом случае эта ссылка не будет полезна. –
Да, это отличный вариант возврата, но наличие номера версии также под контролем источника будет лучше. Благодаря! +1 – Smashery
Я делаю это, просто запуская небольшой скрипт при создании моего проекта. Сценарий просто вызывает svn info в сочетании с sed, чтобы вытащить чистые данные ревизии и введет этот номер в файл revision.txt.
Сервер сборки Hudson делает его еще проще, поскольку он устанавливает номер версии SVN в качестве переменной среды прямо перед вызовом скриптов Build.
Мы делаем это, хорошо работает – orip
Я считаю, при запуске раздела немного неоднозначным - когда он запускается, откуда? Из проверки SVN или из выпущенного кода? Все решения работают над тем, чтобы внедрить версию SVN как-то в источник Python или где-то в репозитории в отдельный файл версии.
Файл версии изменен на свежие проверки, поэтому перед дистрибутивом необходимо очистить проверку. Поэтому мой вопрос о том, где выполняется программа, остается.
Похож на, но немного больше pythonic, чем ответ PHP; поместить это в вашем модуле __init__.py
:
__version__ = filter(str.isdigit, "$Revision: 13 $")
и убедитесь, что вы добавляете свойство Revision:
svn propset svn:keywords Revision __init__.py
или «.join (c для c в« $ LastChangedRevision: 1546 $ », если c.isdigit()) , если вам не нравится фильтр. –
Или вы можете сделать так:
import re,subprocess
svn_info = subprocess.check_output("svn info")
print (re.search(ur"Revision:\s\d+", svn_info)).group()
печатает "Revision: 2874"
в моем проекте
Или вот так:
print (subprocess.check_output("svnversion")).split(":")[0]
печатает "2874"
в моем проекте
Работает только с рабочей копией. – bahrep
Не только с рабочей копией. Сначала вы можете получить удаленный URL svn из «svn info», например выполнить «svn info», затем взять значение параметра «URL» из вывода и выполнить тот же код, но используя «svn info value_of_URL_param» Итак, обновленный код: импорта вновь, подпроцесс svn_info = subprocess.check_output ("SVN информация по протоколу HTTPS: //svn.you_remote_repo_url") печати (повторно.search (ur "Revision: \ s \ d +", svn_info)). group() –
Это правильный ответ! Кроме того, не забудьте установить свойство «keywords = Revision» для каждого файла, для которого вы хотите это сделать. –
Drew - Я думаю, что если включена опция enable-auto-props = true, тогда будут заданы ключевые слова по умолчанию? –
+1 Это потрясающе! В моем случае, однако, есть ли способ изменить SVN номер версии, если это другой файл, который был изменен в этой ревизии? Например, если у меня есть ключевое слово номер версии в файле version.py, но я не изменяю version.py в редакции nnn, он не обновит его, не так ли? Если нет, есть ли способ использовать этот метод таким образом? – Smashery