svnlook改变了-t" $ rev" " $回购"没有被执行

时间:2015-03-25 15:48:53

标签: perl batch-file svn visualsvn-server post-commit-hook

在标题中,我使用perl编写的post-commit钩子脚本调用,该脚本具有命令

$msg = `$svnlook changed -t "$rev" "$repos"`;

应该执行,而不是我应该$msg发送到我的服务。但是当我跑步时

if ( length($msg) == 0 )
{
    print STDERR "msg length is 0";
    exit(1);
}

我在控制台上收到此错误消息,为什么这个svnlook命令没有被执行?

我正在使用Windows 7和VisualSVN服务器。

另一方面,我还有其他理论可以像钩手一样运行这个命令

@echo off
set repos=%1
set rev=%2
set changes=svnlook changed %repos% -r %rev% 
C:\Perl64\bin\perl C:\repositories\myproject\hooks\myhook.pl %1 %2 changes

但是我不知道如何传递这个changes参数,所以如果这可以起作用,它也可以回答。

如何将参数从批处理传递到perl脚本?

1 个答案:

答案 0 :(得分:1)

运行svnlook已更改帮助显示svnlook changed的有效选项列表及其预期格式:

$ svnlook help changed
changed: usage: svnlook changed REPOS_PATH

Print the paths that were changed.

Valid options:
  -r [--revision] ARG      : specify revision number ARG
  -t [--transaction] ARG   : specify transaction name ARG
  --copy-info              : show details for copies

通常,您可以指定带有-t的交易号或带有-r的修订号。您似乎正在传递包含-t的修订号,这将导致意外结果:要么没有与您希望的修订版本无关的结果或结果。

我相信你的案子的正确用法是:

my $msg = `$svnlook changed -r "$rev" "$repos"`;

上面的命令将为您提供一个由换行符分隔的长字符串。通过在列表上下文中使用相同的命令,您可以获得更易于管理的数组格式:

my @changes = `$svnlook changed -r "$rev" "$repos"`;

另外这些行都会有尾随换行符,您可以使用内置的chomp()消除它们:

my @changes; 
chomp(@changes = `$svnlook changed -r "$rev" "$repos"`);

或者,您可以查看SVN::SVNLook围绕svnlook命令的Perl包装器。