在标题中,我使用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脚本?
答案 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包装器。