Получение номера ревизии SVN в программу автоматически - PullRequest
18 голосов
/ 20 сентября 2009

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

Ответы [ 10 ]

27 голосов
/ 21 сентября 2009

Я не уверен насчет специфики Python, но если поместить в ваш файл строку $ Revision $ и у вас есть enable-auto-props = true в вашей конфигурации SVN, она будет переписана во что-то вроде $ Revision : 144 $. Затем вы можете разобрать это в своем скрипте.

Есть количество ключевых слов свойств, которые вы можете использовать таким образом .

Это не будет иметь никаких накладных расходов, например запрашивает репозиторий SVN, потому что строка зафиксирована в вашем файле при фиксации или обновлении.

Я не уверен, как бы вы проанализировали это в Python, но в PHP я бы сделал:

$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
    echo 'Revision is ' . $matches[1];
}
15 голосов
/ 28 ноября 2009

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

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

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

svn propset svn:keywords Revision __init__.py
7 голосов
/ 28 августа 2014

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

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

4 голосов
/ 20 сентября 2009

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

4 голосов
/ 20 сентября 2009

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

3 голосов
/ 20 сентября 2009

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

Сервер сборки Hudson делает это еще проще, поскольку он устанавливает номер редакции SVN в качестве переменной среды непосредственно перед вызовом ваших сценариев сборки.

3 голосов
/ 20 сентября 2009

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

1 голос
/ 22 сентября 2009

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

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

0 голосов
/ 14 ноября 2018

Вы можете сделать это программно, проанализировав вывод 'svn info --xml' в элемент xml:

def get_svn_rev(dir: Union[str, Path]) -> str:
    """Get the svn revision of the given directory"""
    dir = str(dir)
    svn_info_cmd = ['svn', 'info', '--xml', dir]
    print(' '.join(svn_info_cmd))
    svn_info_process = subprocess.run(svn_info_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if svn_info_process.returncode:
        eprint(svn_info_process.stderr.decode().strip())
        raise subprocess.CalledProcessError(returncode=svn_info_process.returncode, cmd=svn_info_cmd,
                                            output=svn_info_process.stdout,
                                            stderr=svn_info_process.stderr)
    else:
        info = ElementTree.fromstring(svn_info_process.stdout.decode().strip())
        entry = info.find('entry')
        revision = entry.get('revision')

    return revision
0 голосов
/ 05 ноября 2018

Это сработало для меня в Python:

Получить всю информацию SVN:

svn_info = subprocess.check_output('svn info').decode("utf-8") 
print(svn_info)

Сделайте поиск и отколитесь от номера:

revisionNum = re.search("Revision:\s\d+", svn_info)
print(revisionNum.group().split(":")[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...