2010-02-08 93 views
2

我試圖建立一個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的使用...但我無法弄清楚。也許有人可以給我一個提示?

回答

1

之所以你只得到「$ 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

1

您只使用whoami而不是命令的完整路徑,但不能保證當腳本被SVN調用時,env變量將包含與shell相同的目錄。

您應該檢查的另一件事是,SVN運行腳本的uid有權使用svnlook並訪問存儲庫。

不知道您的問題是否來自於此,但它確實是一個開始尋找的好地方。

+0

嗨,嘗試了whoami的完整路徑,但這並沒有幫助...回購的文件系統權限是775 - 夠了,我想?我自己可以執行/ usr/bin/svnlook ...我如何檢查腳本的UID? – marvin2k 2010-02-08 20:19:37

0

我不確定,但嘗試兩件事。

首先檢查您正在運行的文件的權限。如果他們沒有運行whoami和svnlookup的權限,那麼你幾乎搞砸了。 第二隻是給qx(cmd)一擊而不是cmd