SVNのコミット情報をログに書くスクリプト

svnのコミットログを動的に取る方法ってないんかなぁ。とりあえず、以下の適当コードで対応。

#!/usr/bin/perl 

use strict;
use warnings;
use SVN::Client;
use IO::All;
use Getopt::Long;

my $logfile = "/var/log/svnlog";
my $target = "http://localhost/svn/repo";
my $name   = "repo";
my $sleep  = 60;

my $result
    = GetOptions(
        "logfile=s" => \$logfile,
        "target=s"  => \$target,
        "reponame=s"=> \$name,
        "sleep=i"   => \$sleep,
    );

my $client = SVN::Client->new();
my $log = '';
my $prev_revision = 0;
my $cur_revision = 0;

#  $ctx->log($targets, $start, $end, $discover_changed_paths,  $strict_node_history, \&log_receiver, $pool);
while ( 1 ) {
eval {
$client->log(
        $target,
        $prev_revision || 'HEAD',
        'HEAD',
        1,
        1,
        sub {
            my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
            unless ( $message ) {
                $message ="メッセージなし";
            }
            $log = "svn:[$name] r:$revision:$author: $message \n";
            my $files =  [ sort keys %$changed_paths ];
            $log .= "    change:" . join( ',' , @{ $files } ) . "\n";

            $cur_revision = $revision;
                if( $cur_revision  > $prev_revision ) {
                    $prev_revision = $cur_revision;
                    my $io =  io( $logfile );
                    $io->append( $log ) ;
                    $io->close();
                    $log = '';
                }
            }
        );
};
if( $@ ) {
    warn $@;
}
    sleep $sleep;
}

=head1 NAME

svnlogger.pl - logging svn commit infomation.

=head1 SYNOPSYS

 svnlogger.pl --logfile /var/log/svnlog --target http://localhost/svn/repo --reponame 'Foo Project' --sleep 30 &

=head2 DESCRIPTION

svnのコミット情報をロギングします。 エラーおこってもループ回り続けます。気をつけて。

=head1 AUTHOR

Tomohiro teranishi <tomohiro.teranishi@gmail.com>

=cut