关于使用python获取svnlog信息的一些总结
最近接到了用python写工具的需求,具体需求是通过python获取到本地记录的本版到最新的版本之间的所有提交记录,然后根据提交log中附带的单号,将相同的提交单号的单子里的文件汇总在一起,然后根据提交单号进行模型减面和GPU采样处理,再根据不同的提交单号分开提交处理结果,目的是在合并改动到release版本的时候可以通过美术的提交单号检索到需要合并的内容,而不是全部合并,
公司的python版本是3.9

python操作svn的库

python提供了几个操作svn的库,现在比较常用的是pysvn这个库,网上可以搜到使用方式,在此不做详细描述,因为本人所在项目中没有使用这个库,使用的是python 的 svn这个库中的svn.local 和svn.remote

在svn.local中提供了获取两个版本之间所有log的函数 log_default,但是这个函数有个大坑,可能是提交的日志中带有特殊字符或者是中文的原因(具体是哪个字符有问题并没有仔细探究),直接调用会报一个解码的错误,类似这种

‘gbk’ codec can’t decode byte 0xaa…………

经过研究svn.local源码并测试发现具体的报错位置在调用svn命令获取返回值的时候:

python svn钩子 python获取svn文件的提交人_python svn钩子


为了解决此问题,我最终选则直接调用源码中的run_command来运行svn命令拿到返回值,与此处的唯一区别就是没有添加–xml的格式转换,run_command的参数如图

python svn钩子 python获取svn文件的提交人_python_02


此处的两个参数一个是svn的命令,一个是附加参数,我们要获取到日志,因此subcommond传入’log’参数,args里面传入的是 “-v -r{0}:{1}” 0的位置是最新的版本号,1的位置是当前版本号,可以根据需求自行修改,但是svn命令里面这两个参数是前面的是新版本,后面的是老版本,可是在run_command的时候发现参数的顺序没有影响,并且要注意的是args是一个列表因此在写代码的时候应当将-v -r 和版本号分开作为列表的元素,如下所示

python svn钩子 python获取svn文件的提交人_字符串_03


第三个参数就传入do_combine=True即可,还有一个需要注意的地方是通过这种方式来运行svn的命令相当于在命令行中直接执行svn命令,只不过可以拿到返回值,因此执行此命令获取到的日志是当前工作文件夹的日志而不是localClient中传入的文件夹的日志,这个问题当时查了很长时间,因为一直拿不到目标文件夹的日志,解决办法就是在运行这个命令之前先调用os库的chdir函数,将工作文件夹切换到想要获取日志的文件夹路径如下图所示

python svn钩子 python获取svn文件的提交人_svn_04


切换后进行调用就可以获取到目标文件夹两个版本之间的所有版本信息,返回值是一个字符串,是把所有的版本信息包括svn版本,文件变更列表,还有提交的log都拼接在一起的一个字符串,之后可以自己再根据需求进行字符串的解析获取到想要的信息,可以通过打断点或者输出到控制台来查看字符串详情

以上是此次的总结,如有错误请大家指正,有疑问也欢迎大家来提问