将SVN修订号自动获取到程序中
我有一个用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];
}