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 )