Utilizzo di Perl per costruire uno SVN post-commit hook: IRC Bot stampare impegnarsi Messaggio
Domanda
Sto cercando di costruire un Bot IRC, che mi dice in un canale privato ogni commit-messaggio che io desidero essere informato. Ma ho difficoltà di ottenere per ogni
#!/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
Quindi, l'invocata 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);
Quindi, il mio Bot si connette, e può parlare con me ...
Se inizio lo script di shell manualmente, solo una parola (la stringa all'interno $ utente, nemmeno le seguenti due punti) viene inviato.
Se lo script viene richiamato da SVN attraverso un commit, è sembra che l'utente $ e $ commettere stringhe sono vuote, $ user e $ pronti contro termine sono trasmessi ...
Credo che qualcosa non va con il mio utilizzo di whoami e svnlook ... Ma non riesco a capirlo. Forse qualcuno può darmi un suggerimento?
Soluzione
Il motivo si ottiene solo "$ user" senza i due punti precedenti è perché si sta catturando in uscita dal whoami
, e che l'output include una nuova riga. Quella nuova riga viene interpretato come la fine della stringa da inviare. Prova chomp $user
per sbarazzarsi della nuova linea prima di utilizzare $user
.
Se lo script viene invocato da SVN attraverso un commit, è sembra che l'utente $ e $ Commettono stringhe sono vuote, $ utente e $ pronti contro termine sono trasmessi ...
ho intenzione di assumere che si intende attraverso SVN $user
e $commit
sono vuote, ma $rev
e $repos
vengono trasmessi, dal momento che avrebbe senso ...
Potrai avere lo stesso problema con $commit
da svnlook
, ma perché il commit arriva alla fine del messaggio, avrete un problema solo se il messaggio è a capo in esso. Ad esempio, se la prima riga del messaggio è un ritorno a capo, si non si vede nulla. Per questo, mi consiglia di rimuovere tutti i ritorni a capo dal messaggio, probabilmente con y/\n//
.
Per quanto riguarda $user
essere vuota dall'interno del gancio, che dipende da come si sta utilizzando svn. E 'del tutto possibile che whoami
non è in grado di trovare l'ID utente, ad esempio, se il processo esegue il gancio non è associato alcun accesso. Si avrà probabilmente bisogno di un altro metodo di determinazione l'utente in questo caso, come ad esempio la prima linea di uscita dal svnlook info
.
Altri suggerimenti
si sta utilizzando solo whoami
anziché il percorso completo al comando, ma non c'è alcuna garanzia che quando lo script viene invocato da SVN, la variabile $PATH
ENV conterrà le stesse directory come quella propria shell ha.
Un'altra cosa che si dovrebbe verificare è che il uid
sotto cui SVN esegue lo script dispone di autorizzazioni per utilizzare svnlook
e accedere al repository.
Non sono sicuro se il problema deriva da questo, ma è sicuramente un buon posto per iniziare a guardare.
Non sono sicuro su di esso, ma provare due cose.
Per prima cosa controllare i permessi dei file che si sta eseguendo. Se essi non dispongono di autorizzazioni per eseguire whoami e svnlookup allora sei praticamente avvitato.
In secondo luogo solo dare QX (cmd) un colpo al posto di cmd
.