Run tests recursively.
[gitmo/moose-dev-utils.git] / cpan-stable-smolder
index f7671ab..87b3c6b 100755 (executable)
@@ -1,11 +1,11 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 use strict;
 use warnings;
 use CPAN;
 use Cwd;
 use File::chdir;
-use File::Path qw( rmtree );
+use IPC::Run3 qw( run3 );
 
 
 CPAN::HandleConfig->load();
@@ -24,112 +24,52 @@ if ( -f $LOGFILE ) {
 
 open my $log, '>', $LOGFILE || die "Could not open $LOGFILE because $!";
 
-test_all_modules(
-    qw[
-        Moose::Autobox
-        MooseX::Accessors::ReadWritePrivate
-        MooseX::App::Cmd
-        MooseX::Async
-        MooseX::Attribute::ENV
-        MooseX::AttributeHelpers
-        MooseX::Attribute::Prototype
-        MooseX::Attributes::Curried
-        MooseX::Blessed::Reconstruct
-        MooseX::ClassAttribute
-        MooseX::Clone
-        MooseX::ConfigFromFile
-        MooseX::Constructor::AllErrors
-        MooseX::Contract
-        MooseX::Control
-        MooseX::CurriedHandles
-        MooseX::Daemonize
-        MooseX::Declare
-        MooseX::DeepAccessors
-        MooseX::DOM
-        MooseX::Emulate::Class::Accessor::Fast
-        MooseX::FollowPBP
-        MooseX::Getopt
-        MooseX::GlobRef::Object
-        MooseX::InsideOut
-        MooseX::Iterator
-        MooseX::KeyedMutex
-        MooseX::LazyLogDispatch
-        MooseX::LogDispatch
-        MooseX::Log::Log4perl
-        MooseX::MakeImmutable
-        MooseX::Meta::TypeConstraint::ForceCoercion
-        MooseX::MetaDescription
-        MooseX::MethodAttributes
-        MooseX::Method::Signatures
-        MooseX::MultiInitArg
-        MooseX::MultiMethods
-        MooseX::MutatorAttributes
-        MooseX::NaturalKey
-        MooseX::NonMoose
-        MooseX::Object::Pluggable
-        MooseX::Param
-        MooseX::Params::Validate
-        MooseX::Plaggerize
-        MooseX::POE
-        MooseX::Policy::SemiAffordanceAccessor
-        MooseX::Q4MLog
-        MooseX::Role::Cmd
-        MooseX::Role::Matcher
-        MooseX::Role::Parameterized
-        MooseX::Role::TraitConstructor
-        MooseX::Role::XMLRPC::Client
-        MooseX::Scaffold
-        MooseX::SemiAffordanceAccessor
-        MooseX::SimpleConfig
-        MooseX::Singleton
-        MooseX::Storage
-        MooseX::Storage::Format::XML::Simple
-        MooseX::StrictConstructor
-        MooseX::Struct
-        MooseX::Templated
-        MooseX::Timestamp
-        MooseX::Traits
-        MooseX::Traits::Attribute::CascadeClear
-        MooseX::Types
-        MooseX::Types::Authen::Passphrase
-        MooseX::Types::Common
-        MooseX::Types::Data::GUID
-        MooseX::Types::DateTime
-        MooseX::Types::IO
-        MooseX::Types::Path::Class
-        MooseX::Types::Set::Object
-        MooseX::Types::Structured
-        MooseX::Types::URI
-        MooseX::Types::UUID
-        MooseX::Types::VariantTable
-        MooseX::WithCache
-        MooseX::Workers
-        MooseX::YAML
-        Fey::ORM
-        KiokuDB
-        Catalyst
-        ]
-);
+my $MODULE_LIST_FILE = ( cwd . '/cpan-stable-modules' );
+
+my @modules;
+{
+    open my $fh, $MODULE_LIST_FILE or die "Can't open $MODULE_LIST_FILE: $!";
+    @modules = map { chomp; $_ } <$fh>;
+}
+
+test_all_modules(@modules);
 
 close $log;
 
 exit;
 
 sub test_all_modules {
-    foreach my $project (grep {$_ eq 'Fey::ORM'}@_) {
+    my @statuses;
+    my @details;
+
+    foreach my $project (@_) {
         my $dist = get_distro_from_cpan($project);
 
         unless ($dist) {
-            print $log "UNKNOWN : $project (not on CPAN?)\n";
+            print {$log} "UNKNOWN : $project (not on CPAN?)\n";
             next;
         }
 
-        my $passed = test_module( $dist->dir() );
+        my ( $passed, $warned, $output ) = test_module( $dist->dir() );
+
+        my $status = $passed && $warned ? 'WARN' : $passed ? 'PASS' : 'FAIL';
 
-        my $msg = $passed ? 'SUCCESS' : 'FAIL';
+        my $summary = "$status: $project - " . $dist->base_id();
+        print {$log} "$summary\n";
 
-        print $log sprintf( '%7s : %s - %s', $msg, $project, $dist->base_id() );
-        print $log "\n";
+        push @details, [ $project, $output ]
+            if $warned || ! $passed;
+    }
+
+    if (@details) {
+        print {$log} "\n\n";
+
+        for my $detail (@details) {
+            print {$log} q{-} x 50;
+            print {$log} "\n";
+            print {$log} "$detail->[0]\n\n";
+            print {$log} "$detail->[1]\n\n";
+        }
     }
 }
 
@@ -159,28 +99,44 @@ sub test_module {
 
     local $ENV{PERL_AUTOINSTALL} = '--defaultdeps';
     if ( -f "Build.PL" ) {
-        _run_commands(
+        return
+            unless _run_commands(
             [ $^X, 'Build.PL' ],
             ['./Build'],
-            [qw( ./Build test )],
-        );
+            );
     }
     else {
-        _run_commands(
+        return
+            unless _run_commands(
             [ $^X, 'Makefile.PL' ],
             ['make'],
-            [qw( make test )],
-        );
+            );
     }
+
+    return _run_tests();
 }
 
 sub _run_commands {
     for my $cmd (@_) {
-        if ( system( @{$cmd} ) ) {
+        my $output;
+
+        unless ( run3 $cmd, \undef, \$output, \$output ) {
             warn "Failed to run @{$cmd}\n";
-            return;
+            return ( 0, $output );
         }
     }
+
+    return 1;
+}
+
+sub _run_tests {
+    my $output;
+
+    run3 [ qw( prove -br ) ], undef, \$output, \$output;
+
+    my $passed = $output =~ /Result: PASS/;
+    my $warned = $output =~ /at .+ line \d+/;
+
+    return ( $passed, $warned, $output );
 }
 
-1;