Perl6-Pugs
view release on metacpan or search on metacpan
util/PaP6-testing/test_loop.pl view on Meta::CPAN
#!perl
use strict;
use warnings;
use Carp qw(carp croak);
use FindBin qw($RealBin);
use File::Spec::Functions;
use File::Path;
use File::Copy;
use lib 'libcpan';
use Data::Dump qw(dump);
use File::Copy::Recursive qw(dircopy);
use lib 'lib';
use Watchdog qw(sys sys_for_watchdog);
use SVNShell qw(svnversion svnup);
use lib "$FindBin::Bin/lib";
use Term::ReadKey;
ReadMode('cbreak');
my $ver = 5;
print "Working path: '" . $RealBin . "'\n" if $ver > 3;
print "Loading config file.\n" if $ver > 1;
my $fp_conf = catfile( $RealBin, 'conf.pl' );
print "Config file path: '" . $fp_conf . "'\n" if $ver > 1;
my $conf = require $fp_conf;
dump( $conf ) if $ver > 4;
print "Validating config.\n" if $ver > 1;
foreach my $c_num ( 0..$#$conf ) {
my $ck = $conf->[$c_num];
print "num: $c_num\n" if $ver > 3;
# global keys
foreach my $mck ( qw(name repository commands) ) {
croak "Option '$mck' not found for '$ck'!\n" unless defined $ck->{$mck};
print "$mck: '" . $ck->{$mck} . "'\n" if !ref($ck->{$mck}) && $ver > 3;
}
# commands keys
foreach my $ac_num ( 0..$#{$ck->{commands}} ) {
my $ack = $ck->{commands}->[$ac_num];
print " num: $ac_num\n" if $ver > 3;
foreach my $mack ( qw(name cmd) ) {
croak "Option '$mack' not found for '$ack'!\n" unless defined $ack->{$mack};
print " $mack: '" . $ack->{$mack} . "'\n" if !ref($ack->{$mack}) && $ver > 3;
}
}
$ck->{src_dn} = $ck->{name} . '-src' unless exists $ck->{src_dn};
$ck->{temp_dn} = $ck->{name} . '-temp' unless exists $ck->{temp_dn};
$ck->{results_dn} = $ck->{name} . '-results' unless exists $ck->{results_dn};
$ck->{src_add_dn} = $ck->{name} . '-src-add' unless exists $ck->{src_add_dn};
# todo
$ck->{temp_dn_back} = '..' unless exists $ck->{temp_dn_back};
# todo
$ck->{rm_temp_dir} = 1 unless exists $ck->{rm_temp_dir};
$ck->{rewrite_temp_dir} = 1 unless exists $ck->{rewrite_temp_dir};
}
print "\n" if $ver > 3;
dump( $conf ) if $ver > 3;
print "\n" if $ver > 3;
# todo - load from dump
sub default_cmd_state {
return {
'cmd_num' => 0,
'before_done' => 0,
'cmd_done' => 0,
'after_done' => 0,
};
}
sub default_state {
return {
'svnup_done' => 0,
'rm_temp_dir_done' => 0,
'copy_src_dir_done' => 0,
'after_temp_copied_done' => 0,
'cmd' => default_cmd_state(),
};
}
my $fp_state = catfile( $RealBin, 'state.pl' );
print "Runstate config file path: '" . $fp_state . "'\n" if $ver > 1;
my $state;
if ( -e $fp_state ) {
$state = require $fp_state;
} else {
$state = default_state();
}
my $conf_last = $#$conf;
my $conf_first = ( exists $state->{ck_num} ) ? $state->{ck_num} : 0;
my $first_time = 1;
while ( 1 ) {
NEXT_CONF: foreach my $ck_num ( $conf_first..$conf_last ) {
if ( $first_time ) {
$conf_first = 0;
} else {
$state = default_state();
}
$first_time = 0;
my $ck = $conf->[$ck_num];
# todo
# $state->{ck_hash} = hash($ck)
# $conf_a->{ignore_ck_hash}
$state->{ck_num} = $ck_num;
print
( $ck->{skip} ? 'Skipping' : 'Running' ) .
" testing for configuration: '$ck->{name}' (" .
($ck_num+1) . " of " . ($conf_last+1). ")\n"
if $ver > 1;
next if $ck->{skip};
# 'svn co' if needed
unless ( -d $ck->{src_dn} ) {
print "Source dir not found: 'svn co'\n";
my $cmd = 'svn co "' . $ck->{repository} . '" "' . $ck->{src_dn} . '"';
my ( $cmd_rc, $out ) = sys_for_watchdog(
$cmd,
$ck->{results_dn} . '/svn_co.txt'
);
if ( $cmd_rc ) {
print "svn co failed, return code: $cmd_rc\n" if $ver > 1;
print "svn co output: '$out'\n" if $ver > 2;
next;
}
$state->{svnup_done} = 1;
} else {
print "Source dir found: '$ck->{src_dn}'\n" if $ver > 3;
}
# get revision num
unless ( $state->{svnup_done} ) {
print "Getting revision number for src dir.\n" if $ver > 1;
my ( $o_rev, $o_log ) = svnversion( $ck->{src_dn} );
die "svn info failed: $o_log" unless defined $o_rev;
$state->{src_rev} = $o_rev;
print "Src revision number: $state->{src_rev}\n" if $ver > 1;
if ( $state->{src_rev} !~ /^(\d+)$/ ) {
print "Bad revision number. No clean src dir.\n" if $ver > 1;
next NEXT_CONF;
}
( run in 0.669 second using v1.01-cache-2.11-cpan-39bf76dae61 )