Использование Perl для создания обработчика SVN post-commit: IRC Bot для вывода сообщения коммита - PullRequest
2 голосов
/ 08 февраля 2010

Я пытаюсь создать 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);

Итак, мой бот подключается и может говорить со мной ...

Если я запускаю сценарий оболочки вручную, отправляется только одно слово (строка внутри $ user, даже не следующее двоеточие).

Если скрипт вызывается SVN через коммит, кажется, что строки $ user и $ commit пусты, передаются $ user и $ repos ...

Я думаю, что-то не так с моим использованием whoami и svnlook ... Но я не могу понять это. Может быть, кто-то может дать мне подсказку?

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

Причина, по которой вы получаете только «$ user» без предшествующего двоеточия, заключается в том, что вы захватываете выходные данные из whoami, и эти выходные данные включают новую строку. Эта новая строка интерпретируется как конец вашей строки для отправки. Попробуйте chomp $user избавиться от новой строки перед использованием $user.

Если скрипт вызывается через SVN коммит, похоже на $ user и $ commit строки пусты, $ user и $ репо передаются ...

Я собираюсь предположить, что вы имеете в виду, что через SVN $user и $commit пусты, но передаются $rev и $repos, поскольку это имело бы смысл ...

У вас будет такая же проблема с $commit из svnlook, но поскольку фиксация происходит в конце вашего сообщения, у вас будет проблема только в том случае, если в вашем сообщении есть новые строки. Например, если первая строка вашего сообщения - новая строка, вы ничего не увидите. Для этого я бы порекомендовал удалить все новые строки из сообщения, вероятно, с y/\n//.

Относительно того, что $user пусто изнутри крючка, это зависит от того, как вы используете SVN. Вполне возможно, что whoami не сможет найти идентификатор пользователя, например, если процесс, выполняющий ловушку, не связан ни с каким логином. В этом случае вам, вероятно, понадобится другой метод определения пользователя, например, первая строка вывода из svnlook info.

1 голос
/ 08 февраля 2010

Вы используете только whoami вместо полного пути к команде, но нет уверенности в том, что при запуске скрипта SVN переменная $PATH env будет содержать те же каталоги, что и ваша оболочка.

Еще одна вещь, которую вы должны проверить, это то, что uid, под которым SVN запускает скрипт, имеет разрешения на использование svnlook и доступ к хранилищу.

Не уверен, что ваша проблема возникла из-за этого, но это, конечно, хорошее место, чтобы начать смотреть.

0 голосов
/ 08 февраля 2010

Я не уверен в этом, но попробуйте две вещи.

Сначала проверьте права доступа к файлам, которые вы запускаете. Если у них нет прав для запуска whoami и svnlookup, то вы в значительной степени облажались. Во-вторых, просто дайте qx (cmd) шанс вместо cmd.

...