2010-02-08 56 views
0

我在Windows服务器上运行SVN,我使用Perl脚本来实现一些预先提交的钩子。我看到来自TortoiseSVN的以下错误消息:如何匹配Perl中的svnlook输出?

Error !! ScriptError !!无法解析 行:_U路径/到/文件/后备箱

,这是脚本:

foreach my $line (`$svnlook changed -t "$txn" "$repos"`) 
{ 
    chomp($line); 
    if ($line !~ /([AUD]).\s\s(.+)$/) 
    { 
    print STDERR "!!Script Error!! Can't parse line: $line\n"; 
    exit(1); 
    } 
    else 
    { 
    # perform some actions 
    } 
} 

exit(0); 

我试过,没有sucess更换的东西,正则表达式像/_([AUD]).\s\s(.+)$/ - 我甚至尝试/.*([AUD]).\s\s(.+)$/

想法?建议?

+0

您可以添加一个来自TortoiseSVN的错误消息的样子吗? – ccheneson 2010-02-08 18:44:18

回答

4

没有看看SVN文档,我只是猜测: 在上面的输出中,U和实际路径之间只显示一个空格,但在所有正则表达式中都有\s\s

好的,现在我看看svnlook reference。首先,你的正则表达式失败的svnlook命令的当前版本,指定的输出如下:

  • 前两列包含状态
  • 路径始于第五列
  • 状态可能是一个A(添加),U(内容改变),d(删除),_U(属性的变化),和UU(内容+性质改变)

所以,你应该能够匹配的东西,如^([_AUD]+)\s+(.+)$。人们可以得到更具体的,但这不是必要的。

如果这不匹配,请将命令的输出传送到一个文件,并在此处张贴相关部分。

+0

我将它替换为: if($ line!〜/^\s+([AUD])\s+(.+)$/) 但没有成功 - 它似乎被那个领先的下划线所激怒,但我想知道这实际上是一个下划线还是其它东西就像是一个破损的编码字符。 – dls 2010-02-08 18:32:14

+0

上次我查看svnlook源代码时,它确实是一个下划线。我建议查看源代码以确定可能输出的内容。关于法律输出的帮助并不完全是最新的,也不准确。 – 2010-02-08 18:55:51

+0

这是,但谷歌它总是返回版本1.0的帮助... – gimpf 2010-02-08 19:05:44

0

if ($line !~ /^_?([AUD])\s+(.+)$/应该可以正常工作。

+0

这对整套svnlook标识符的效果要好得多: 'if($ line!〜/^\ s *(A | D | U | UU | _U)\ s *(。+)$ /)' – dls 2010-02-08 19:08:16

+0

啊,是的。当我检查文档时,我错过了'UU'位。 – jamessan 2010-02-08 19:14:32