EDIT: This question duplicates How to access the current Subversion build number? (Thanks for the heads up, Charles!)
Всем привет,
Этот вопрос похож на Получение номера репозитория Subversion в коде
Отличия заключаются в следующем:
Я хотел бы добавить номер версии в Python
Я хочу ревизию репозитория (а не извлеченный файл)
Т.е. Я хотел бы извлечь номер редакции из возврата из 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 и регулярном выражении кода, хотя это кажется довольно жестким. :)
Помощь будет очень признательна.
Спасибо и ура.






Я использую очень похожую технику, чтобы показать текущий номер версии подверсии в моей оболочке:
svnRev=$(echo "$(svn info)" | grep "^Revision" | awk -F": " '{print $2};')
echo $svnRev
У меня это работает очень хорошо.
Почему вы хотите, чтобы файлы python изменялись каждый раз при увеличении номера версии всего репозитория? Это сделает такие вещи, как выполнение различий между двумя файлами, раздражающими, если один из репозитория, а другой из архива ..
Я предполагаю, что BMH не хочет использовать это в каждом файле, но чтобы иметь одно место, в котором подробно описывается текущая версия системы - посмотрите в правом нижнем углу этой страницы для примера.
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, что делает точно правильным в такой ситуации.
Существует команда под названием svnversion, которая поставляется с Subversion и предназначена для решения именно такого рода проблем.
Вы можете изменить это, чтобы показать, как можно записать результат в артефакт сборки, объединенный в сгенерированное яйцо / пакет / еще что-то, просто чтобы быть полным и ответить на обе части вопроса (как рассчитать ответ и как связать его в ваш проект на Python).
Если вы хотите иметь переменную в одном исходном файле, которая может быть установлена на текущую ревизию рабочей копии и не воспроизводится при подрывной работе, а рабочая копия действительно доступна во время запуска вашей программы, тогда 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 - это круто. :)
В этом вопросе очень много дубликатов - и я не понимаю, почему это проблема, связанная с питоном (или имеет ответ, связанный с питоном), если вы не хотите привязаться к процессу сборки на основе setuptools или тому подобное.