8 use File::Path qw( rmtree );
9 use IPC::Run3 qw( run3 );
12 CPAN::HandleConfig->load();
13 CPAN::Shell::setup_output();
14 CPAN::Index->reload();
16 local $CPAN::Config->{tar_verbosity} = 'none';
17 local $CPAN::Config->{load_module_verbosity} = 'none';
20 my $LOGFILE = ( cwd . "/cpan-stable-smolder.log" );
26 open my $log, '>', $LOGFILE || die "Could not open $LOGFILE because $!";
28 my $MODULE_LIST_FILE = ( cwd . '/cpan-stable-modules' );
32 open my $fh, $MODULE_LIST_FILE or die "Can't open $MODULE_LIST_FILE: $!";
33 @modules = map { chomp; $_ } <$fh>;
36 test_all_modules(@modules);
42 sub test_all_modules {
46 foreach my $project (@_) {
47 my $dist = get_distro_from_cpan($project);
50 print {$log} "UNKNOWN : $project (not on CPAN?)\n";
54 my ( $passed, $warned, $output ) = test_module( $dist->dir() );
56 my $status = $passed && $warned ? 'WARN' : $passed ? 'PASS' : 'FAIL';
58 push @statuses, "$status: $project - " . $dist->base_id();
60 push @details, [ $project, $output ]
61 if $warned || ! $passed;
64 for my $status (@statuses) {
65 print {$log} "$status\n";
71 for my $detail (@details) {
72 print {$log} q{-} x 50;
74 print {$log} "$detail->[0]\n\n";
75 print {$log} "$detail->[1]\n\n";
80 sub get_distro_from_cpan {
83 ( my $module = $project ) =~ s/-/::/g;
85 my @mods = CPAN::Shell->expand( 'Module', $module );
87 die "Cannot resolve $project to a single module object"
92 my $dist = $mods[0]->distribution();
104 local $ENV{PERL_AUTOINSTALL} = '--defaultdeps';
105 if ( -f "Build.PL" ) {
107 unless _run_commands(
114 unless _run_commands(
115 [ $^X, 'Makefile.PL' ],
127 unless ( run3 $cmd, \undef, \$output, \$output ) {
128 warn "Failed to run @{$cmd}\n";
129 return ( 0, $output );
139 run3 [ qw( prove -b ) ], undef, \$output, \$output;
141 my $passed = $output =~ /Result: PASS/;
142 my $warned = $output =~ /at .+ line \d+/;
144 return ( $passed, $warned, $output );