Как добавить номер сборки репозитория svn в код Python?

EDIT: This question duplicates How to access the current Subversion build number? (Thanks for the heads up, Charles!)

Всем привет,

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

Отличия заключаются в следующем:

  1. Я хотел бы добавить номер версии в Python

  2. Я хочу ревизию репозитория (а не извлеченный файл)

Т.е. Я хотел бы извлечь номер редакции из возврата из svn info, любит:

Информация о $ svn

Path: .
URL: svn://localhost/B/trunk
Repository Root: svn://localhost/B
Revision: 375
Node Kind: directory
Schedule: normal
Last Changed Author: bmh
Last Changed Rev: 375
Last Changed Date: 2008-10-27 12:09:00 -0400 (Mon, 27 Oct 2008)

Я хочу переменную с 375 (ревизия). Достаточно просто поместить $ Rev $ в переменную, чтобы отслеживать изменения в файле. Однако я хотел бы отслеживать версию репозитория, и я понимаю (и это похоже на мои тесты), что $ Rev $ обновляется только при изменении файла.

Мои первоначальные мысли обращаются к использованию модуля svn / libsvn, встроенного в Python, хотя я не могу найти никакой документации или примеров того, как их использовать.

В качестве альтернативы я подумал о вызове svn info и регулярном выражении кода, хотя это кажется довольно жестким. :)

Помощь будет очень признательна.

Спасибо и ура.

В этом вопросе очень много дубликатов - и я не понимаю, почему это проблема, связанная с питоном (или имеет ответ, связанный с питоном), если вы не хотите привязаться к процессу сборки на основе setuptools или тому подобное.

Charles Duffy 28.10.2008 15:57
stackoverflow.com/questions/110175/…
Charles Duffy 28.10.2008 15:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
4 539
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я использую очень похожую технику, чтобы показать текущий номер версии подверсии в моей оболочке:

svnRev=$(echo "$(svn info)" | grep "^Revision" | awk -F": " '{print $2};')
echo $svnRev

У меня это работает очень хорошо.

Почему вы хотите, чтобы файлы python изменялись каждый раз при увеличении номера версии всего репозитория? Это сделает такие вещи, как выполнение различий между двумя файлами, раздражающими, если один из репозитория, а другой из архива ..

Я предполагаю, что BMH не хочет использовать это в каждом файле, но чтобы иметь одно место, в котором подробно описывается текущая версия системы - посмотрите в правом нижнем углу этой страницы для примера.

Cebjyre 28.10.2008 09:06

Python имеет прямую привязку к libsvn, поэтому вам вообще не нужно вызывать клиент командной строки. Подробнее см. это сообщение в блоге.

Обновлено: вы можете сделать что-то вроде этого:

from svn import fs, repos, core
repository = repos.open(root_path)
fs_ptr = repos.fs(repository)
youngest_revision_number = fs.youngest_rev(fs_ptr)

Да, но это не дает вам доступа ко всей логике svnversion, что делает точно правильным в такой ситуации.

Charles Duffy 28.10.2008 15:56
Ответ принят как подходящий

Существует команда под названием svnversion, которая поставляется с Subversion и предназначена для решения именно такого рода проблем.

Вы можете изменить это, чтобы показать, как можно записать результат в артефакт сборки, объединенный в сгенерированное яйцо / пакет / еще что-то, просто чтобы быть полным и ответить на обе части вопроса (как рассчитать ответ и как связать его в ваш проект на Python).

Charles Duffy 28.10.2008 16:01

Если вы хотите иметь переменную в одном исходном файле, которая может быть установлена ​​на текущую ревизию рабочей копии и не воспроизводится при подрывной работе, а рабочая копия действительно доступна во время запуска вашей программы, тогда SubWCRev будет вашим решением.

Также, похоже, есть порт Linux под названием SVNWCRev

Оба выполняют замену $ WCREV $ на самый высокий уровень фиксации рабочей копии. Также может быть предоставлена ​​другая информация.

Похищено прямо из django:

def get_svn_revision(path=None):
    rev = None
    if path is None:
        path = MODULE.__path__[0]
    entries_path = '%s/.svn/entries' % path

    if os.path.exists(entries_path):
        entries = open(entries_path, 'r').read()
        # Versions >= 7 of the entries file are flat text.  The first line is
        # the version number. The next set of digits after 'dir' is the revision.
        if re.match('(\d+)', entries):
            rev_match = re.search('\d+\s+dir\s+(\d+)', entries)
            if rev_match:
                rev = rev_match.groups()[0]
        # Older XML versions of the file specify revision as an attribute of
        # the first entries node.
        else:
            from xml.dom import minidom
            dom = minidom.parse(entries_path)
            rev = dom.getElementsByTagName('entry')[0].getAttribute('revision')

    if rev:
        return u'SVN-%s' % rev
    return u'SVN-unknown'

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

Преимущество этого кода в том, что он работает, даже если в целевой системе не установлена ​​Subversion.

Основываясь на ответе CesarB и предоставленной Чарльзом ссылке, я сделал следующее:

try:
  from subprocess import Popen, PIPE
  _p = Popen(["svnversion", "."], stdout=PIPE)
  REVISION= _p.communicate()[0]
  _p = None # otherwise we get a wild exception when Django auto-reloads
except Exception, e:
  print "Could not get revision number: ", e
  REVISION = "Unknown"

Golly Python - это круто. :)

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