如果脚本存在且代码为0,则提交挂钩不会打印任何错误消息

时间:2011-05-17 07:05:41

标签: perl svn-hooks

我的预提交是调用perl脚本commit_log.pl。脚本正在做很多预先检查。现在我试图在提交批准后发送邮件。我们无法设置post-由于某些权限问题而提交挂钩。所以我试图在预提交脚本本身中调用发送邮件。

如果退出代码为零,则在我的commit_log.pl中,即使printf无效。

如果退出代码为1,一切正常

pre-commit

log=`$SVNLOOK log -t "$TXN" "$REPOS"`
author=`$SVNLOOK author -t "$TXN" "$REPOS"`
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS"`

/usr/bin/perl /isource/svnroot/fgw_ins/hooks/user/commit_log.pl "$log" "$author" "$CHANGED" "$0" 1>&2

if [ "$?" -eq "1" ];
then
        exit 1
else
        exit 0
fi

# if does not match..fail...
exit 1
---------------------------------------------------------------------------------
commit_log.pl
------------------------


}
   else
                {
                        print("Commit approved\n");#this printf itself is not working
                        `python $path/send_mail.py $comment $committed_filepath`;
                        exit 0;
                }

2 个答案:

答案 0 :(得分:1)

无法向Avi's添加更多答案:STDOUT被钩子吞没了。您将从不看到STDOUT。如果钩子脚本返回一个非零的exitcode,通常意味着钩子失败,并且在预提交钩子中阻止提交,则客户端只能看到STDERR。

如果您需要在提交后发送邮件,并且不能使用post-commit挂钩,我建议您使用像Jenkins这样的连续构建系统。您可以让Jenkins监视您的存储库,当它看到新版本时,向相关人员发送电子邮件。

Jenkins是一个连续构建系统,它可以在每次提交后进行构建,但是没有理由你需要进行构建(除了它通常是一个好主意)。 Jenkins可以设置为执行 post commit 的任何操作,因此您可以让Jenkins通过电子邮件向相关人员发送电子邮件。

是的,像詹金斯这样的整个系统只是发送电子邮件,这有点过分。为什么不简单地编写自己的脚本?但是,您可以在一两个小时内下载,安装和配置Jenkins。只需布置您认为需要完成的工作,您需要更长的时间。

此外,一旦你有詹金斯,你会发现它有很多其他用途。

答案 1 :(得分:0)

我不确定预提交挂钩的标准输出发送到哪里。根据{{​​3}},标准错误被发送回客户端,但仅在出现错误时(即退出时使用非零退出代码)。

我会尝试写入特定位置,而不是标准输出(例如/tmp/pre-commit.log用于测试目的)。

此外,通常,您可能应尽可能避免在假定提交成功的预提交脚本中进行工作。在提交前脚本运行后,提交可能仍然失败,例如在提交本身期间,这就是提交后脚本存在的原因。