2

我正在尝试构建一个 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);

所以,我的 Bot 确实可以连接,并且可以与我交谈……

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

如果脚本由 SVN 通过提交调用,似乎 $user 和 $commit 字符串为空,$user 和 $repos 被传输......

我想我对 whoami 和 svnlook 的使用有问题……但我想不通。也许有人可以给我一个提示?

4

3 回答 3

1

你只得到 "$user" 前面没有冒号的原因是因为你正在捕获来自 的输出whoami,并且该输出包含一个换行符。该换行符被解释为要发送的字符串的结尾。在chomp $user使用$user.

如果脚本由 SVN 通过提交调用,似乎 $user 和 $commit 字符串为空,$user 和 $repos 被传输......

我将假设您的意思是通过 SVN$user并且$commit是空的,但是$rev并且$repos被传输,因为这很有意义......

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

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

于 2010-02-09T00:58:02.843 回答
1

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

您应该检查的另一件事是uidSVN 在其下运行脚本具有使用svnlook和访问存储库的权限。

不确定您的问题是否来自于此,但它确实是一个很好的起点。

于 2010-02-08T19:48:45.600 回答
0

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

首先检查您正在运行的文件的权限。如果他们没有运行 whoami 和 svnlookup 的权限,那么你就完蛋了。其次只是给 qx(cmd) 一个镜头,而不是cmd.

于 2010-02-08T19:50:42.213 回答