#!/usr/bin/perl use strict; use warnings; use CPAN; use Cwd; use File::chdir; use File::Path qw( rmtree ); CPAN::HandleConfig->load(); CPAN::Shell::setup_output(); CPAN::Index->reload(); local $CPAN::Config->{tar_verbosity} = 'none'; local $CPAN::Config->{load_module_verbosity} = 'none'; my $LOGFILE = ( cwd . "/cpan-stable-smolder.log" ); if ( -f $LOGFILE ) { unlink $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 ] ); close $log; exit; sub test_all_modules { foreach my $project (grep {$_ eq 'Fey::ORM'}@_) { my $dist = get_distro_from_cpan($project); unless ($dist) { print $log "UNKNOWN : $project (not on CPAN?)\n"; next; } my $passed = test_module( $dist->dir() ); my $msg = $passed ? 'SUCCESS' : 'FAIL'; print $log sprintf( '%7s : %s - %s', $msg, $project, $dist->base_id() ); print $log "\n"; } } sub get_distro_from_cpan { my $project = shift; ( my $module = $project ) =~ s/-/::/g; my @mods = CPAN::Shell->expand( 'Module', $module ); die "Cannot resolve $project to a single module object" if @mods > 1; return unless @mods; my $dist = $mods[0]->distribution(); $dist->get(); return $dist; } sub test_module { my $dir = shift; local $CWD = $dir; local $ENV{PERL_AUTOINSTALL} = '--defaultdeps'; if ( -f "Build.PL" ) { _run_commands( [ $^X, 'Build.PL' ], ['./Build'], [qw( ./Build test )], ); } else { _run_commands( [ $^X, 'Makefile.PL' ], ['make'], [qw( make test )], ); } } sub _run_commands { for my $cmd (@_) { if ( system( @{$cmd} ) ) { warn "Failed to run @{$cmd}\n"; return; } } } 1;