自动将SVN修订号编入程序

时间:2009-09-20 00:33:45

标签: python svn revision

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

11 个答案:

答案 0 :(得分:27)

我不确定Python的细节,但是如果把字符串$ Revision $放到你的文件中并且你的SVN配置中有enable-auto-props = true,那么它将被重写为$ Revision :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];
}

答案 1 :(得分:15)

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

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

并确保添加Revision属性:

svn propset svn:keywords Revision __init__.py

答案 2 :(得分: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"

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

我通过在构建项目时运行一个小脚本来实现这一点。该脚本只是将svn info与sed一起调用以获取裸版本数据并将该数字注入revision.txt文件中。

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

答案 7 :(得分:1)

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

版本文件在新结帐时更改,因此需要在分发之前完成清理检查。所以关于程序运行的问题仍然存在。

答案 8 :(得分: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])

答案 9 :(得分: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

答案 10 :(得分:0)

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

import re

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

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

svn propset svn:keywords Revision YOURFILE.py

此外,必须在Subversion配置文件中将属性enable-auto-props设置为yes。情况应该已经如此。在Tortoise SVN中,可以通过单击常规设置选项卡中“ subversion配置文件”旁边的“编辑”按钮来访问此配置文件。