如果 success/fail,svn 会合并 return 一个 return 代码吗?

Does svn merge return a return code if success/fail?

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

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

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

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

如果有任何合并冲突,

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, which should allow you to do more granular error checking. There is also PySVN,据说它比 SVN 提供的绑定更 Pythonic。


* 我会使用 --non-interactive 而不是 --accept 因为 --non-interactive 会抑制 所有 提示,而不仅仅是那些冲突提示。例如,如果您没有为用户 运行 保存您的脚本的凭据,--non-interactive 将导致合并立即失败,而如果您使用 --accept,则会提示您输入密码,您的脚本将挂起。