Utilizzo di Perl per costruire uno SVN post-commit hook: IRC Bot stampare impegnarsi Messaggio

StackOverflow https://stackoverflow.com/questions/2224323

  •  19-09-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top