Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动将SVN修订号输入程序_Python_Svn_Revision - Fatal编程技术网

Python 自动将SVN修订号输入程序

Python 自动将SVN修订号输入程序,python,svn,revision,Python,Svn,Revision,我在SVN下有一个python项目,我想在它运行时显示版本号。有什么方法可以做到这一点(例如在提交时自动运行一个短脚本,它可以更新版本文件,或者在Python中查询SVN存储库?存储库中的文件hooks/pre-commit是一个脚本或程序,将在成功提交之前执行。只需将此脚本设置为一个脚本,在提交文件时使用正确的版本号更新文件(在脚本运行时将版本号传递给脚本)。下面是一个编写预提交钩子的示例教程:签出。它在Python中公开了Subversion运行时功能的扩展。Django中有一段代码允许您这

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

存储库中的文件
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