use strict; use warnings; use autodie qw(:all); 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 => 1+8*3; use App::KGB::Change; 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 => '/', revision => 1, } ] ); sub test_matching { my ( $test_name, $files, $res, $swap, $wanted_branch, $wanted_module, $rest ) = @_; $files = [$files] unless ref($files); $res = [$res] unless ref($res); my $changes = [ map { App::KGB::Change->new( { action => 'M', path => $_, } ) } @$files ]; $c->br_mod_re($res); $c->br_mod_re_swap($swap); my ( $branch, $module ) = $c->detect_branch_and_module( $changes ); is( $branch, $wanted_branch, "branch detection in [$test_name] (@$files) =~ (@$res)" ); is( $module, $wanted_module, "module detection in [$test_name] (@$files) =~ (@$res)" ); is( "@$changes", $rest, "file list for [$test_name]" ); } test_matching( 'module and branch', '/kgb/trunk/some/file', '^/([^/]+)/([^/]+)/', 1, 'trunk', 'kgb', 'some/file', ); test_matching( 'branch and module', '/trunk/kgb/some/file', '^/([^/]+)/([^/]+)/', 0, 'trunk', 'kgb', 'some/file', ); test_matching( 'branch only', '/trunk/some/file', '^/([^/]+)/()', 0, 'trunk', '', 'some/file', ); test_matching( 'module only', '/website/some/file', '^/(website)/()', 1, '', 'website', 'some/file', ); test_matching( 'real example', 'kgb/trunk/script/kgb-bot', [ "^([^/]+)/(trunk|tags)/", "^([^/]+)/branches/([^/]+)/", "^(website)/()", ], 1, 'trunk', 'kgb', 'script/kgb-bot', ); test_matching( 'multi-file in one dir', [ 'kgb/trunk/script/kgb-bot', 'kgb/trunk/script/kgb-client' ], [ "^([^/]+)/(trunk|tags)/", "^([^/]+)/branches/([^/]+)/", "^(website)/()", ], 1, 'trunk', 'kgb', 'script/kgb-bot script/kgb-client', ); test_matching( 'multi-module', [ 'trunk/foo/debian/moo', 'trunk/bar/debian/goo' ], [ "^(trunk|tags)/([^/]+)/", "^branches/([^/]+)/([^/]+)/", "^(website)/()", ], 0, undef, undef, 'trunk/foo/debian/moo trunk/bar/debian/goo', ); test_matching( 'multi-module with separated modules', [ 'foo/trunk/debian/moo', 'bar/trunk/debian/goo' ], [ "^([^/]+)/(trunk|tags)/", "^([^/]+)/branches/([^/]+)/", "^(website)/()", ], 1, undef, undef, 'foo/trunk/debian/moo bar/trunk/debian/goo', );