svnlook changed -t "$rev" "$repos" 没有被执行

svnlook changed -t "$rev" "$repos" not getting executed

如标题所示,我正在从我的 post-commit 挂钩脚本中调用,该挂钩脚本是用 perl 编写的,其中包含命令

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

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

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

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

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

另一方面,我有其他理论 运行 这个命令在 hook 本身就像

@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 脚本?

运行 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 包装器。