Utilizando Perl para construir un SVN post-commit hook: Bot de IRC para imprimir el mensaje del informe

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de construir un bot de IRC que me dice en un canal privado cada-mensaje de confirmación que quiero conocer. Pero tengo problemas para obtener por

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

A continuación, el invocado 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);

Por lo tanto, mi Bot no conectar, y puede hablar conmigo ...

Si comienzo la secuencia de comandos shell de forma manual, sólo una palabra (la cadena dentro de $ usuario, ni siquiera los siguientes dos puntos) se envía.

Si el script es invocado por SVN Trough una confirmación, es parece que el usuario $ y $ cometer cadenas están vacías, $ usuario y $ repos se transmiten ...

supongo que algo está mal con mi uso de whoami y svnlook ... Pero no puedo entenderlo. Tal vez alguien me puede dar una pista?

¿Fue útil?

Solución

La razón por la que sólo recibe "$ usuario" sin precedentes de colon se debe a que está capturando salida de whoami, y que incluye una nueva línea de salida. Ese salto de línea se interpreta como el final de la cadena de enviado. Trate chomp $user para deshacerse de la nueva línea antes de usar $user.

  

Si el script es invocado por SVN artesa   una confirmación, es que parece ser que el usuario $ y   $ Comprometen cadenas están vacías, y $ USER   $ repos se transmiten ...

Voy a suponer que te refieres a través de SVN $user y $commit están vacías, pero $rev y $repos se transmiten, ya que eso tendría sentido ...

Vas a tener el mismo problema con $commit de svnlook, pero debido a la confirmación llega al final de su mensaje, sólo va a tener un problema si su mensaje tiene saltos de línea en el mismo. Por ejemplo, si la primera línea de su mensaje es un salto de línea, usted no se ve nada. Por eso, me gustaría recomendar la eliminación de todas las nuevas líneas del mensaje, probablemente con y/\n//.

En cuanto a $user está en blanco desde dentro del gancho, que depende de cómo se está usando SVN. Es muy posible que whoami no es capaz de encontrar el identificador de usuario, por ejemplo, si el proceso que ejecuta el gancho no está asociado con ningún inicio de sesión. Es probable que tenga otro método para determinar el usuario en ese caso, como la primera línea de salida de svnlook info.

Otros consejos

Usted está utilizando sólo whoami en lugar de la ruta completa al comando, pero no hay garantía de que cuando el guión es invocado por SVN, la variable $PATH env contendrá los mismos directorios que el que su cáscara tiene.

Otra cosa que debe comprobar es que el SVN uid bajo el cual se ejecuta la secuencia de comandos tiene permisos para utilizar svnlook y acceder al repositorio.

No estoy seguro si el problema viene de esto, pero seguro que es un buen lugar para empezar a buscar en.

No estoy seguro de ello, pero trato de dos cosas.

En primer lugar, compruebe los permisos de los archivos que está ejecutando. Si ellos no tienen permisos para ejecutar whoami y svnlookup entonces usted está bastante jodido. En segundo lugar acaba de dar qx (cmd) un tiro en lugar de cmd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top