$VERSION
=
'0.029'
;
use
Cwd
qw( cwd abs_path)
;
my
%CONFIG
= (
df_sync
=>
'rsync'
,
df_ddir
=> File::Spec->rel2abs(
'perl-current'
, abs_path() ),
df_v
=> 0,
df_rsync
=>
'rsync'
,
df_opts
=>
'-az --delete'
,
df_source
=>
'github.com/Perl::perl-current'
,
rsync
=> {
allowed
=> [
qw(rsync source opts)
],
required
=> [
qw(rsync source)
],
class
=>
'Test::Smoke::Syncer::Rsync'
,
},
df_ftp
=>
'Net::FTP'
,
df_server
=>
'github.com/Perl'
,
df_sdir
=>
'/pub/apc/perl-current-snap'
,
df_sfile
=>
''
,
df_snapext
=>
'tar.gz'
,
df_tar
=> ( $^O eq
'MSWin32'
?
'Archive::Tar'
:
'gzip -d -c %s | tar xf -'
),
df_patchup
=> 0,
df_pserver
=>
'github.com/Perl'
,
df_pdir
=>
'/pub/apc/perl-current-diffs'
,
df_ftpusr
=>
'anonymous'
,
df_ftppwd
=>
'smokers@perl.org'
,
df_unzip
=> $^O eq
'MSWin32'
?
'Compress::Zlib'
:
'gzip -dc'
,
df_patchbin
=>
'patch'
,
df_cleanup
=> 1,
snapshot
=> {
allowed
=> [
qw( ftp server sdir sfile snapext tar ftpusr ftppwd
patchup pserver pdir unzip patchbin cleanup )
],
required
=> [],
class
=>
'Test::Smoke::Syncer::Snapshot'
,
},
df_cdir
=>
undef
,
copy
=> {
allowed
=> [
qw(cdir)
],
required
=> [
qw(cdir)
],
class
=>
'Test::Smoke::Syncer::Copy'
,
},
df_hdir
=>
undef
,
df_haslink
=> (
$Config
{d_link}||
''
) eq
'define'
,
hardlink
=> {
allowed
=> [
qw( hdir haslink )
],
required
=> [
qw(hdir)
],
class
=>
'Test::Smoke::Syncer::Hardlink'
,
},
df_fsync
=>
'rsync'
,
df_mdir
=>
undef
,
df_fdir
=>
undef
,
forest
=> {
allowed
=> [
qw(fsync mdir fdir)
],
required
=> [
qw(mdir fdir)
],
class
=>
'Test::Smoke::Syncer::Forest'
,
},
df_ftphost
=>
'public.activestate.com'
,
df_ftpsdir
=>
'/pub/apc/perl-current'
,
df_ftpcdir
=>
'/pub/apc/perl-current-diffs'
,
df_ftype
=>
undef
,
ftp
=> {
allowed
=> [
qw(ftphost ftpusr ftppwd ftpsdir ftpcdir ftype)
],
required
=> [
qw()
],
class
=>
'Test::Smoke::Syncer::FTP'
,
},
df_gitbin
=>
'git'
,
df_gitdir
=>
undef
,
df_gitdfbranch
=>
'blead'
,
df_gitbranchfile
=>
undef
,
git
=> {
allowed
=> [
qw(gitbin gitorigin gitdir gitdfbranch gitbranchfile)
],
required
=> [
qw(gitbin gitorigin gitdir)
],
class
=>
'Test::Smoke::Syncer::Git'
,
},
valid_type
=> {
rsync
=> 1,
git
=> 1,
snapshot
=> 1,
copy
=> 1,
hardlink
=> 1,
ftp
=> 1 },
);
{
my
%allkeys
=
map
{
(
$_
=> 1)
}
map
@{
$CONFIG
{
$_
}{allowed} }
,
keys
%{
$CONFIG
{valid_type} };
push
@{
$CONFIG
{forest}{allowed} },
keys
%allkeys
;
$CONFIG
{forest}{required} = [];
$CONFIG
{forest}{class} =
'Test::Smoke::Syncer::Forest'
;
$CONFIG
{valid_type}->{forest} = 1;
}
sub
new {
my
$factory
=
shift
;
my
$sync_type
=
lc
(
shift
||
$CONFIG
{df_sync});
if
( !
exists
$CONFIG
{valid_type}{
$sync_type
} ) {
croak(
"Invalid sync_type '$sync_type'"
);
};
my
%args_raw
=
@_
? UNIVERSAL::isa(
$_
[0],
'HASH'
) ? %{
$_
[0] } :
@_
: ();
my
%args
=
map
{
(
my
$key
=
$_
) =~ s/^-?(.+)$/
lc
$1/e;
(
$key
=>
$args_raw
{
$_
} );
}
keys
%args_raw
;
my
%fields
=
map
{
my
$value
=
exists
$args
{
$_
} ?
$args
{
$_
} :
$CONFIG
{
"df_$_"
};
(
$_
=>
$value
)
} (
v
=>
ddir
=> @{
$CONFIG
{
$sync_type
}{allowed} } );
if
( ! File::Spec->file_name_is_absolute(
$fields
{ddir} ) ) {
$fields
{ddir} = File::Spec->catdir( abs_path(),
$fields
{ddir} );
}
$fields
{ddir} = File::Spec->rel2abs(
$fields
{ddir}, abs_path() );
my
@missing
;
for
my
$required
(@{
$CONFIG
{
$sync_type
}{required} }) {
push
(
@missing
,
"option '$required' missing for '$CONFIG{$sync_type}{class}'"
)
if
!
defined
$fields
{
$required
};
}
if
(
@missing
) {
croak(
"Missing option:\n\t"
,
join
(
"\n\t"
,
@missing
));
}
my
$class
=
$CONFIG
{
$sync_type
}{class};
return
$class
->new(
%fields
);
}
sub
config {
my
$dummy
=
shift
;
my
$key
=
lc
shift
;
if
(
$key
eq
'all_defaults'
) {
my
%default
=
map
{
my
(
$pass_key
) =
$_
=~ /^df_(.+)/;
(
$pass_key
=>
$CONFIG
{
$_
} );
}
grep
/^df_/ =>
keys
%CONFIG
;
return
\
%default
;
}
return
undef
unless
exists
$CONFIG
{
"df_$key"
};
$CONFIG
{
"df_$key"
} =
shift
if
@_
;
return
$CONFIG
{
"df_$key"
};
}