Python 自动将SVN修订号输入程序
我在SVN下有一个python项目,我想在它运行时显示版本号。有什么方法可以做到这一点(例如在提交时自动运行一个短脚本,它可以更新版本文件,或者在Python中查询SVN存储库?存储库中的文件Python 自动将SVN修订号输入程序,python,svn,revision,Python,Svn,Revision,我在SVN下有一个python项目,我想在它运行时显示版本号。有什么方法可以做到这一点(例如在提交时自动运行一个短脚本,它可以更新版本文件,或者在Python中查询SVN存储库?存储库中的文件hooks/pre-commit是一个脚本或程序,将在成功提交之前执行。只需将此脚本设置为一个脚本,在提交文件时使用正确的版本号更新文件(在脚本运行时将版本号传递给脚本)。下面是一个编写预提交钩子的示例教程:签出。它在Python中公开了Subversion运行时功能的扩展。Django中有一段代码允许您这
hooks/pre-commit
是一个脚本或程序,将在成功提交之前执行。只需将此脚本设置为一个脚本,在提交文件时使用正确的版本号更新文件(在脚本运行时将版本号传递给脚本)。下面是一个编写预提交钩子的示例教程:签出。它在Python中公开了Subversion运行时功能的扩展。Django中有一段代码允许您这样做,我建议您查看一下 我在构建项目时只需运行一个小脚本就可以做到这一点。该脚本只需结合sed调用svn info,以获取裸版本数据,并将该数字注入到revision.txt文件中
Hudson build server在调用构建脚本之前将SVN修订号设置为一个环境变量,这使它变得更加容易。我不确定Python的细节,但是如果将字符串$revision$放入文件的某个位置,并且在SVN配置中启用了auto-props=true,它将被重写为$Revision:144$。然后可以在脚本中解析它 有 这不会有任何开销,例如查询SVN repo,因为字符串在提交或更新时硬编码到文件中 我不确定如何在Python中解析它,但在PHP中我会:
$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
echo 'Revision is ' . $matches[1];
}
我发现when-is-run部分有点模棱两可——when-is-run-from-where?从SVN签出还是从发布的代码?所有解决方案都致力于以某种方式将SVN版本注入Python源代码或存储库中某个单独的版本文件中
版本文件在新签出时被更改,因此在分发之前需要进行清理签出。因此,我关于程序运行位置的问题仍然存在。与PHP答案类似,但比PHP答案更像Python;将其放入模块的
\uuuu init\uuuu.py
:
__version__ = filter(str.isdigit, "$Revision: 13 $")
并确保添加了修订属性:
svn propset svn:keywords Revision __init__.py
或者你可以这样做:
import re,subprocess
svn_info = subprocess.check_output("svn info")
print (re.search(ur"Revision:\s\d+", svn_info)).group()
print (subprocess.check_output("svnversion")).split(":")[0]
它在我的项目中打印“修订版:2874”
或者像这样:
import re,subprocess
svn_info = subprocess.check_output("svn info")
print (re.search(ur"Revision:\s\d+", svn_info)).group()
print (subprocess.check_output("svnversion")).split(":")[0]
它在我的项目中打印
“2874”
这在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])
您可以通过将“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
我们正在回答,因为我很难找到python 3的所有信息。 在python 3中,可以使用以下内容:
重新导入
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中,可通过单击“常规设置”选项卡中“subversion配置文件”旁边的“编辑”按钮访问此配置文件 此函数仅在从subversion签出中运行时有效。如果这是OP想要的,那么问题就解决了。然而,我怀疑他可能希望脚本包含在其自身或配置文件或其subversion版本中,即使脚本不再处于subversion下,在这种情况下,该链接将不会有用。是的,这是一个很好的回退选项,但版本号也在源代码控制下会更好。谢谢+太好了。让预提交钩子修改文件通常是个坏主意。回购协议中的版本将与工作副本中的版本不同,这可能会导致一些混淆。提交者必须还原到文件的早期版本,然后获取新版本,可能会导致某种冲突,因为svn已将原始版本存储在工作副本的文本库中。我同意这是危险的,通常不是期望的行为,但如果您适当限制自己,则我看不出问题。例如,如果您有一个“svn_version.txt”文件,其中只包含当前修订号,那么它将是完全安全的;您的本地副本将始终具有您签出的版本,存储库将始终具有最新版本(通常与您的工作副本相同)。这是正确的答案!另外,记住在每个文件上设置属性'keywords=Revision',你想这样做。Drew-我想如果设置了enable auto props=true,那么默认的关键字都设置了?+1太棒了!但是,在我的例子中,如果版本号是在此版本中更改的另一个文件,有没有办法让SVN编辑版本号?例如,如果我在version.py中有revision number关键字,但我没有在revision nnn中更改version.py,它不会更新它,是吗?如果没有,有没有办法以这种方式使用此方法?@Smashery恐怕您必须编写自己的提交钩子才能做到这一点,我怀疑-您可以通过设置自己的关键字并让svn替您进行替换来使用svn:keywords属性。这只会对正在提交的文件起作用。我们在构建脚本中处理它,这很容易。如果您不喜欢筛选器,请加入“$LastChangedVision:1546$”中的c for c,而不仅仅是工作副本。您可以先从“svn info”中检索svn远程URL,如执行“svn info”,然后从输出中获取“URL”参数值并执行相同的代码,但使用“svn info value_of_URL_param”,更新后的代码是:import re,subprocess svn_info=subprocess。检查输出(“svn info”)打印(re.sea