使用Perl构建SVN后提交钩子:IRC Bot打印提交消息

问题描述:

我试图建立一个IRC Bot,它告诉我在私人通道中的每个提交消息都是我想知道的。但我有麻烦了每使用Perl构建SVN后提交钩子:IRC Bot打印提交消息

#!/bin/bash 
REPOS="$1" 
REV="$2" 
# call bot with arguments reposname, revison and commit message in one string 
/usr/bin/perl /home/user/repo/svn_irc_bot.pl "$REPOS" "$REV" 
# all checks passed, so allow the commit 
exit 0 

然后,调用Perl的Skript获得:

#!/usr/bin/perl -w 
# see http://www.javalinux.it/wordpress/2009/10/15/writing-an-irc-bot-for-svn-commit-notification/ 
# see http://oreilly.com/pub/h/1964 
use strict; 
# We will use a raw socket to connect to the IRC server. 
use IO::Socket; 
my $repos = $ARGV[0]; 
my $rev = $ARGV[1]; 
my $commit = `/usr/bin/svnlook log $repos`; 
my $user = `whoami`; 
# The server to connect to and our details. 
my $server = "irc.server.com"; 
my $nick = "bot2"; 
my $login = "bot2"; 
# The channel which the bot will join. 
# my $channel = "#channel"; 
# Connect to the IRC server. 
my $sock = new IO::Socket::INET(PeerAddr => $server, 
           PeerPort => 6667, 
           Proto => 'tcp') or 
           die "Can't connect\n"; 
# Log on to the server. 
print $sock "NICK $nick\r\n"; 
print $sock "USER $login 8 * :Perl IRC Hacks Robot\r\n"; 
# Read lines from the server until it tells us we have connected. 
while (my $input = <$sock>) { 
    # Check the numerical responses from the server. 
    if ($input =~ /004/) { 
     # We are now logged in. 
     print $sock "PRIVMSG mynick : $user: $repos r$rev -- $commit\n"; 
     last; 
    } 
    elsif ($input =~ /433/) { 
     die "Nickname is already in use."; 
    } 
} 
sleep(5); 
print $sock "QUIT bye... \n"; 
sleep(5); 
close($sock); 

所以,我的僵尸程序连接,并且可以跟我说话......

如果我手动启动shell脚本,只发送一个单词($ user内的字符串,甚至下面的冒号)。

如果脚本是通过SVN调用低谷提交,是好像$用户和$提交字符串是空的,$用户和$回购传输...

我想,什么是错的我whoami和svnlook的使用...但我无法弄清楚。也许有人可以给我一个提示?

之所以你只得到“$ user”没有前面的冒号,是因为你从whoami捕获输出,并且该输出包含一个换行符。该换行符被解释为要发送的字符串的结尾。在使用$user之前,尝试chomp $user摆脱换行符。

如果脚本是通过SVN槽 提交调用,是好像$用户和 $提交字符串是空的,$用户和 $回购传输...

我要去假设你的意思是通过SVN $user$commit是空的,但$rev$repos传输,因为这将使意义......

你有同样的问题来自svnlook,但因为提交出现在消息的末尾,所以如果您的消息中有新行,则只会出现问题。例如,如果消息的第一行是换行符,则不会看到任何内容。为此,我建议删除消息中的所有换行符,可能是y/\n//

至于$user从挂钩内部是空白的,这取决于你如何使用svn。例如,whoami完全有可能找不到用户标识,例如,运行挂钩的进程没有与任何登录关联。在这种情况下,您可能需要另一种确定用户的方法,例如svnlook info的第一行输出。

+0

好的,非常感谢,这有帮助。我的主要错误是“PRIVMSG mynick” – marvin2k 2010-02-09 15:14:56

您只使用whoami而不是命令的完整路径,但不能保证当脚本被SVN调用时,env变量将包含与shell相同的目录。

您应该检查的另一件事是,SVN运行脚本的uid有权使用svnlook并访问存储库。

不知道您的问题是否来自于此,但它确实是一个开始寻找的好地方。

+0

嗨,尝试了whoami的完整路径,但这并没有帮助...回购的文件系统权限是775 - 够了,我想?我自己可以执行/ usr/bin/svnlook ...我如何检查脚本的UID? – marvin2k 2010-02-08 20:19:37

我不确定,但尝试两件事。

首先检查您正在运行的文件的权限。如果他们没有运行whoami和svnlookup的权限,那么你几乎搞砸了。 第二只是给qx(cmd)一击而不是cmd