这是我的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冲突,那么我想退出脚本,如果没有冲突,那么进一步提交代码。 我无法检查是否存在冲突。 有人可以帮我吗?
提前致谢...
答案 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
我假设在主干上设置foo
到bar
,在分支上设置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?了解正则表达式示例...