19

我在 SVN 下有一个 python 项目,我想在它运行时显示版本号。有没有办法做到这一点(例如在提交时自动运行一个可以更新版本文件的短脚本,或者在 Python 中查询 SVN 存储库?)

4

11 回答 11

29

我不确定 Python 的细节,但如果将字符串 $Revision$ 放入文件中的某个位置,并且在 SVN 配置中有 enable-auto-props=true,它将被重写为 $Revision: 144$ . 然后,您可以在脚本中解析它。

您可以通过这种方式使用许多属性关键字。

这不会有任何开销,例如查询 SVN 存储库,因为该字符串在提交或更新时被硬编码到您的文件中。

我不确定您如何在 Python 中解析它,但在 PHP 中我会这样做:

$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
    echo 'Revision is ' . $matches[1];
}
于 2009-09-21T11:43:56.273 回答
15

类似于,但比 PHP 答案更 Pythonic;把它放在你的模块中__init__.py

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

并确保添加 Revision 属性:

svn propset svn:keywords Revision __init__.py
于 2009-11-28T10:06:25.117 回答
10

或者你可以这样做:

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"在我的项目中

编辑

对于较新的 python 版本 (>=3.4) 和显式文件路径:

import re,subprocess

file_path = 'c:/foo'

svn_info = subprocess.check_output('svn info ' + file_path)

revision_string = re.search(r"Revision:\s\d+", str(svn_info)).group()
revision = revision_string.split(': ')[1]
print(revision)

例如打印

'8623'

于 2014-08-28T05:22:27.200 回答
4

存储库中的文件hooks/pre-commit是一个脚本或程序,将在成功提交之前执行。只需将其设为一个脚本,该脚本会在提交文件时使用正确的版本号更新您的文件(修订号在运行时传递给您的脚本)。这是一个编写预提交钩子示例的教程:http ://wordaligned.org/articles/a-subversion-pre-commit-hook

于 2009-09-20T00:38:10.327 回答
4

Django中有一段代码可以让你这样做,我建议你看一下。http://code.djangoproject.com/browser/django/trunk/django/utils/version.py

于 2009-09-20T00:39:21.070 回答
3

查看pysvn。它在 Python 中公开了 Subversion 运行时功能的扩展。

于 2009-09-20T00:39:00.663 回答
3

我通过在构建我的项目时简单地运行一个小脚本来做到这一点。该脚本只是结合 sed 调用 svn info 来获取裸修订数据并将该数字注入到 revision.txt 文件中。

Hudson 构建服务器使它更容易,因为它在调用构建脚本之前将 SVN 修订号设置为环境变量。

于 2009-09-20T10:46:38.980 回答
1

我发现它何时运行部分有点模棱两可 - 当它从哪里运行时?来自 SVN 结帐还是来自已发布的代码?所有解决方案都以某种方式将 SVN 版本注入 Python 源代码或存储库中某个单独版本文件的位置。

版本文件在新签出时更改,因此需要在分发之前进行干净签出。所以我关于程序在哪里运行的问题仍然存在。

于 2009-09-22T07:32:22.693 回答
1

重新回答是因为我找不到 python 3 的所有信息。在 python 3 中,您可以使用以下内容:

import re

revstring = '$Revision: 123 $'
revnumber = re.sub(r'\D', '', revstring)

要让 SVN 替换数字,必须设置文件关键字“Revision”。您可以通过在终端中键入以下命令来实现此目的:

svn propset svn:keywords Revision YOURFILE.py

此外,在 subversion 配置文件中,该属性enable-auto-props必须设置为yes. 应该已经是这样了。在 Tortoise SVN 中,可以通过单击常规设置选项卡中“颠覆配置文件”旁边的“编辑”按钮访问此配置文件。

于 2019-11-29T13:44:27.730 回答
0

这在 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])
于 2018-11-05T16:35:54.707 回答
0

您可以通过将 '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
于 2018-11-14T14:24:06.693 回答