如果成功/失败,svn merge是否返回返回码?

时间:2015-03-03 22:17:45

标签: python svn

我使用以下python命令自动合并和提交文件

p = subprocess.Popen("svn merge ...")
p.communicate()

if(no conflict)
    p = subprocess.Popen("svn commit..."
else
    Abort script

如果发生冲突,停止脚本的最佳方法是什么?我想在可能的情况下抑制合并输出。

1 个答案:

答案 0 :(得分:1)

如果存在合并冲突,

svn merge会提示您这样的事情:

Conflict discovered in 'foo'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: 

您可以使用--non-interactive标记跳过提示:

svn merge --non-interactive URL WC

(注意--not-interactive也可以用于其他SVN命令。)

这将允许合并在没有用户输入的情况下继续,但会标记任何有冲突的文件;在提交之前,您必须手动解决与svn resolve的冲突。

您还可以使用--accept选项:

svn merge --accept postpone URL WC

这将给出基本相同的最终结果。*

您可以使用--quiet标记来抑制输出。

不幸的是,SVN客户端并未将冲突合并视为失败,因此它以零状态退出。您可以在合并后运行svn status以查看是否存在任何文件冲突,例如:

M       bar
C       foo
D       qux

或者,您可以尝试使用SWIG bindings to the C API,这可以让您进行更细粒度的错误检查。还有PySVN,据说比SVN提供的绑定更像Pythonic。


*我会使用--non-interactive代替--accept,因为--non-interactive将禁止所有提示,而不仅仅是针对冲突的提示。例如,如果您尚未保存运行脚本的用户的凭据,--non-interactive将导致合并立即失败,而如果您使用--accept,系统将提示您输入密码并且你的脚本会挂起。