2009-09-20 6 views
17

У меня есть проект python под SVN, и я хочу отобразить номер версии при ее запуске. Есть ли способ сделать это (например, автоматически запускать короткий скрипт на коммит, который может обновлять файл версии или запрашивать репозиторий SVN в Python?)Получение номера версии SVN в программе автоматически

ответ

25

Я не уверен в специфике 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]; 
} 
+0

Это правильный ответ! Кроме того, не забудьте установить свойство «keywords = Revision» для каждого файла, для которого вы хотите это сделать. –

+0

Drew - Я думаю, что если включена опция enable-auto-props = true, тогда будут заданы ключевые слова по умолчанию? –

+3

+1 Это потрясающе! В моем случае, однако, есть ли способ изменить SVN номер версии, если это другой файл, который был изменен в этой ревизии? Например, если у меня есть ключевое слово номер версии в файле version.py, но я не изменяю version.py в редакции nnn, он не обновит его, не так ли? Если нет, есть ли способ использовать этот метод таким образом? – Smashery

4

Файл hooks/pre-commit в вашем репозитории - это сценарий или программа, которая будет выполняться перед успешным фиксацией. Просто сделайте это скриптом, который обновляет ваш файл с соответствующим номером версии, когда он выполняется (номер версии передается вашему скрипту по мере его запуска). Вот учебник с примером написания крючка для предварительной фиксации: http://wordaligned.org/articles/a-subversion-pre-commit-hook

+2

Уч. Предотвращение файлов, связанных с фиксацией крюка, обычно является плохой идеей. Версия в репо будет отличаться от версии в рабочей копии, и это может привести к некоторой путанице. Коммиттер должен вернуться к более ранней версии файла, а затем получить новый, что может привести к конфликту, поскольку svn сохранил исходную версию в текстовой базе рабочей копии. – sunny256

+0

Я согласен с тем, что это опасно и обычно не является желаемым поведением, но если вы ограничиваете себя должным образом, я не вижу проблемы. Например, если у вас есть файл svn_version.txt, который не содержит ничего, кроме текущего номера версии, то это будет совершенно безопасно; ваша локальная копия всегда будет иметь версию, которую вы проверили, и в репозитории всегда будет самая последняя (часто такая же, как ваша рабочая копия). –

3

Отъезд pysvn. он предоставляет расширения в Python для функциональности среды Subversion.

+1

+1 для pysvn, но лучше не связываться с «этим» –

4

В Django есть фрагмент кода, который позволяет вам это делать, я бы рекомендовал посмотреть на него. http://code.djangoproject.com/browser/django/trunk/django/utils/version.py

+0

Эта функция работает только в том случае, если вы работаете из проверки subversion. Если это то, чего хочет OP, тогда проблема решена. Тем не менее, я подозреваю, что он может захотеть, чтобы сценарий содержался в нем или в файле конфигурации или что-то в его ревизии подрывной деятельности, даже если скрипт больше не находится под дебаффером, и в этом случае эта ссылка не будет полезна. –

+0

Да, это отличный вариант возврата, но наличие номера версии также под контролем источника будет лучше. Благодаря! +1 – Smashery

3

Я делаю это, просто запуская небольшой скрипт при создании моего проекта. Сценарий просто вызывает svn info в сочетании с sed, чтобы вытащить чистые данные ревизии и введет этот номер в файл revision.txt.

Сервер сборки Hudson делает его еще проще, поскольку он устанавливает номер версии SVN в качестве переменной среды прямо перед вызовом скриптов Build.

+0

Мы делаем это, хорошо работает – orip

1

Я считаю, при запуске раздела немного неоднозначным - когда он запускается, откуда? Из проверки SVN или из выпущенного кода? Все решения работают над тем, чтобы внедрить версию SVN как-то в источник Python или где-то в репозитории в отдельный файл версии.

Файл версии изменен на свежие проверки, поэтому перед дистрибутивом необходимо очистить проверку. Поэтому мой вопрос о том, где выполняется программа, остается.

13

Похож на, но немного больше pythonic, чем ответ PHP; поместить это в вашем модуле __init__.py:

__version__ = filter(str.isdigit, "$Revision: 13 $") 

и убедитесь, что вы добавляете свойство Revision:

svn propset svn:keywords Revision __init__.py 
+1

или «.join (c для c в« $ LastChangedRevision: 1546 $ », если c.isdigit()) , если вам не нравится фильтр. –

7

Или вы можете сделать так:

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" в моем проекте

+0

Работает только с рабочей копией. – bahrep

+0

Не только с рабочей копией. Сначала вы можете получить удаленный 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() –