use strict; use warnings; use autodie qw(:all); use File::Spec::Functions qw( catdir catfile ); use Test::More; BEGIN { eval { require SVN::Core; 1 } or plan skip_all => "SVN::Core required for testing the Subversion client"; eval { require SVN::Fs; 1 } or plan skip_all => "SVN::Fs required for testing the Subversion client"; eval { require SVN::Repos; 1 } or plan skip_all => "SVN::Repos required for testing the Subversion client"; }; plan tests => 30; use utf8; my $builder = Test::More->builder; binmode $builder->output, ":utf8"; binmode $builder->failure_output, ":utf8"; binmode $builder->todo_output, ":utf8"; use File::Temp qw(tempdir); my $r = tempdir( CLEANUP => not $ENV{TEST_KEEP_TEMP} ); diag "Temporary directory $r will be kept" if $ENV{TEST_KEEP_TEMP}; my $repo = catdir( $r, 'repo' ); my $wd = catdir( $r, 'checkout' ); my $tf = catfile( $wd, 'file' ); sub poke { my $f; open $f, ">", $tf; print $f @_; close $f; } sub in_wd { system 'sh', '-c', "cd $wd && " . shift; } system 'svnadmin', 'create', $repo; if ( $ENV{TEST_KGB_BOT_RUNNING} ) { diag "will try to send notifications to locally running bot"; use Cwd; my $R = getcwd; my $h; open $h, '>', "$repo/hooks/post-commit"; print $h <<"EOF"; #!/bin/sh PERL5LIB=$R/lib $R/script/kgb-client --conf $R/eg/test-client.conf --status-dir $r \$1 \$2 EOF close $h; chmod 0755, "$repo/hooks/post-commit"; } system 'svn', 'checkout', "file://$repo", $wd; poke('one'); in_wd "svn add $tf"; in_wd "svn ci -m 'add file'"; poke('two'); in_wd "svn ci -m 'modify file'"; in_wd "svn rm file"; poke('three'); in_wd "svn add file"; in_wd "svn ci -m 'replace file'"; in_wd "svn rm file"; in_wd "svn ci -m 'remove file. Über cool with cyrillics: здрасти'"; ok( 1, "Test repository prepared" ); use App::KGB::Client::Subversion; use App::KGB::Client::ServerRef; my $port = 7645; my $password = 'v,sjflir'; my $c = new_ok( 'App::KGB::Client::Subversion' => [ { repo_id => 'test', servers => [ App::KGB::Client::ServerRef->new( { uri => "http://127.0.0.1:$port/", password => $password, } ), ], #br_mod_re => \@br_mod_re, #br_mod_re_swap => $br_mod_re_swap, #ignore_branch => $ignore_branch, repo_path => $repo, revision => 1, } ] ); my $commit = $c->describe_commit; my $me = getpwuid($>); is( $commit->id, 1 ); is( $commit->log, 'add file' ); diag "\$>=$> \$<=$< \$ENV{USER}=$ENV{USER} getpwuid(\$>)=$me"; is( $commit->author, $me ); is( scalar @{ $commit->changes }, 1 ); my $change = $commit->changes->[0]; is( $change->path, '/file' ); ok( not $change->prop_change ); is( $change->action, 'A' ); $c->revision(2); $c->_called(0); $commit = $c->describe_commit; is( $commit->id, 2 ); is( $commit->log, 'modify file' ); is( $commit->author, $me ); is( scalar @{ $commit->changes }, 1 ); $change = $commit->changes->[0]; is( $change->path, '/file' ); ok( not $change->prop_change ); is( $change->action, 'M' ); $c->revision(3); $c->_called(0); $commit = $c->describe_commit; is( $commit->id, 3 ); is( $commit->log, 'replace file' ); is( $commit->author, $me ); is( scalar @{ $commit->changes }, 1 ); $change = $commit->changes->[0]; is( $change->path, '/file' ); ok( not $change->prop_change ); is( $change->action, 'R' ); $c->revision(4); $c->_called(0); $commit = $c->describe_commit; is( $commit->id, 4 ); is( $commit->log, 'remove file. Über cool with cyrillics: здрасти' ); is( $commit->author, $me ); is( scalar @{ $commit->changes }, 1 ); $change = $commit->changes->[0]; is( $change->path, '/file' ); ok( not $change->prop_change ); is( $change->action, 'D' );