1

我的预提交正在调用一个 perl 脚本commit_log.pl。该脚本正在执行许多预检查。现在我正在尝试在提交批准后发送邮件。由于一些权限问题,我们无法设置提交后挂钩。所以我试图在预提交脚本本身中调用发送邮件。

在我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;
                }
4

2 回答 2

1

无法为Avi 的答案添加更多内容:STDOUT 被钩子吞噬了。你永远不会看到 STDOUT。只有当钩子脚本返回非零退出代码时,客户端才会看到 STDERR——这通常意味着钩子失败,并且在预提交钩子中会阻止提交。

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

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

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

此外,一旦你拥有了 Jenkins,你会发现它还有很多其他用途。

于 2011-05-17T12:14:44.837 回答
0

我不确定预提交挂钩的标准输出发送到哪里。根据SVN book,标准错误会被发送回客户端,但前提是存在错误(即它以非零退出代码退出)。

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

此外,一般来说,您可能应该尽可能避免在假定提交成功的预提交脚本中进行工作。在 pre-commit 脚本运行之后,commit 仍然可能会失败,例如在提交本身期间,这就是 post-commit 脚本存在的原因。

于 2011-05-17T07:49:59.337 回答