使用perl脚本进行svn合并

时间:2014-06-12 10:15:10

标签: perl svn

这是我的sln合并的perl脚本。

$dir = 'D:\Transversal Unit\example\ace__project\branches\UAT';
print $dir."\n";
chdir($dir) or die "Fail $!";
$status = system("svn merge -c39,46 $sourceBranchURL");
print $status;

这个问题是当执行svn合并行时,无论是否存在冲突,$ status的值始终为0。 我想要的是,如果有svn冲突,那么我想退出脚本,如果没有冲突,那么进一步提交代码。 我无法检查是否存在冲突。 有人可以帮我吗?

提前致谢...

2 个答案:

答案 0 :(得分:2)

  

这个问题是当执行svn合并行时,无论是否存在冲突,$ status的值始终为0。

那不是真的。如果合并根本不起作用,svn merge将返回非零状态。例如,您没有干净的工作目录。如果合并有效,svn merge将返回非零值。即使存在冲突,合并仍然有效。

首先执行--dry-run并打开svn merge作为文件句柄:

use strict;
use warnings;    # I hope in your program, you're actually using these two pragmas

# No you aren't. :-(
# $dir = 'D:\Transversal Unit\example\ace__project\branches\UAT';

use feature qw(say);
use autodie;

my $dir = 'D:/Traversal Unit/example/ace__project/branches/UAT'; #Use forward slashes
open my $merge, '|-', "svn merge -c39,46 --dry-run $sourceBranchURL";

现在,您可以从svn merge命令中读取每行输出,看看是否有问题:

my $conflict_found;
while ( my $line = <$merge> ) {
    chomp $line;
    if ( line =~ /^!/ ) {
       say "Conflict found: $line";
       $conflict_found = 1;
    }
}

if ( $conflict_found ) {
   die qq(Conflicts were found. Do this by hand...);
}

# No conflicts, rerun `svn merge` without `--dry-run`
...

这样,您可以在实际运行merge命令之前检查冲突。如果没有冲突,您可以(几乎)安全地进行合并而不会出现问题。

请记住,如果没有冲突,svn并不意味着合并正常。即使这些行没有冲突,也可能存在逻辑冲突:

原始文件

line #1
line #2
line #3
line #4
print "Foo = " + foo

更改主干

line #1
line #2
line #3
foo = "bar"
line #4
print "Foo = " + foo

分支上的更改

line #1
foo = "boof"
line #2
line #3
line #4
print "Foo = " + foo

我假设在主干上设置foobar,在分支上设置boof是冲突。但是,合并将很愉快地发生而不会发生冲突:

line #1
foo = "boof"
line #2
line #3
foo = "bar"
line #4
print "Foo = " + foo

答案 1 :(得分:0)

使用shell命令的方法,您可以添加一个运行svn status的附加命令,然后解析输出中的冲突并根据此做出决定。

请参阅Is there a command to list SVN conflicts?了解正则表达式示例...