0

如标题所示,我是从我用 perl 编写的提交后挂钩脚本调用的,该脚本具有命令

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

4

1 回答 1

1

运行 svnlook changed help 显示有效选项列表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周围的 Perl 包装器。svnlook

于 2015-03-25T16:29:27.070 回答