将SVN修订号自动获取到程序中

20 投票
11 回答
33938 浏览
提问于 2025-04-15 14:27

我有一个用SVN管理的Python项目,我想在运行这个项目的时候显示版本号。有没有什么办法可以做到这一点呢?比如说在提交代码的时候自动运行一个小脚本来更新版本文件,或者在Python中查询SVN仓库的信息?

11 个回答

12

或者你可以这样做:

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'

15

这段话的意思是,跟PHP的回答有点像,但更符合Python的风格;把这段代码放到你模块的 __init__.py 文件里:

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

同时,确保你添加了Revision属性:

svn propset svn:keywords Revision __init__.py
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];
}

撰写回答