2

私は、知りたいすべてのコミットメッセージをプライベートチャネルで通知するIRCボットを構築しようとしています。しかし、私は

#!/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);

だから、私のボットは接続し、私と話すことができます...

シェルスクリプトを手動で開始すると、1つの単語($ user内の文字列、次のコロンも含まない)のみが送信されます。

スクリプトがコミットを通じてSVNによって呼び出された場合、$userと$commitの文字列が空のように見え、$userと$reposが送信されます...

whoamiとsvnlookの使い方に問題があると思いますが...わかりません。多分誰かが私にヒントを与えることができますか?

4

3 に答える 3

1

whoamiコマンドへのフルパスの代わりに使用していますが、スクリプトがSVNによって呼び出されたときに、 $PATHenv変数にシェルと同じディレクトリが含まれるという保証はありません。

もう1つ確認する必要があるのは、uidSVNがスクリプトを実行するときにsvnlook、リポジトリを使用およびアクセスするためのアクセス許可があることです。

あなたの問題がこれに起因するかどうかはわかりませんが、それは確かに見始めるのに良い場所です。

于 2010-02-08T19:48:45.600 に答える
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 に答える
0

よくわかりませんが、2つのことを試してみてください。

まず、実行しているファイルの権限を確認します。彼らがwhoamiとsvnlookupを実行する権限を持っていない場合、あなたはかなり困惑しています。次に、.の代わりにqx(cmd)を実行しcmdます。

于 2010-02-08T19:50:42.213 に答える