add cpan-stable-smolder
[gitmo/moose-dev-utils.git] / cpan-stable-smolder
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use CPAN;
6 use Cwd;
7 use File::chdir;
8 use File::Path qw( rmtree );
9
10
11 CPAN::HandleConfig->load();
12 CPAN::Shell::setup_output();
13 CPAN::Index->reload();
14
15 local $CPAN::Config->{tar_verbosity} = 'none';
16 local $CPAN::Config->{load_module_verbosity} = 'none';
17
18
19 my $LOGFILE = ( cwd . "/cpan-stable-smolder.log" );
20
21 if ( -f $LOGFILE ) {
22     unlink $LOGFILE;
23 }
24
25 open my $log, '>', $LOGFILE || die "Could not open $LOGFILE because $!";
26
27 test_all_modules(
28     qw[
29         Moose::Autobox
30         MooseX::Accessors::ReadWritePrivate
31         MooseX::App::Cmd
32         MooseX::Async
33         MooseX::Attribute::ENV
34         MooseX::AttributeHelpers
35         MooseX::Attribute::Prototype
36         MooseX::Attributes::Curried
37         MooseX::Blessed::Reconstruct
38         MooseX::ClassAttribute
39         MooseX::Clone
40         MooseX::ConfigFromFile
41         MooseX::Constructor::AllErrors
42         MooseX::Contract
43         MooseX::Control
44         MooseX::CurriedHandles
45         MooseX::Daemonize
46         MooseX::Declare
47         MooseX::DeepAccessors
48         MooseX::DOM
49         MooseX::Emulate::Class::Accessor::Fast
50         MooseX::FollowPBP
51         MooseX::Getopt
52         MooseX::GlobRef::Object
53         MooseX::InsideOut
54         MooseX::Iterator
55         MooseX::KeyedMutex
56         MooseX::LazyLogDispatch
57         MooseX::LogDispatch
58         MooseX::Log::Log4perl
59         MooseX::MakeImmutable
60         MooseX::Meta::TypeConstraint::ForceCoercion
61         MooseX::MetaDescription
62         MooseX::MethodAttributes
63         MooseX::Method::Signatures
64         MooseX::MultiInitArg
65         MooseX::MultiMethods
66         MooseX::MutatorAttributes
67         MooseX::NaturalKey
68         MooseX::NonMoose
69         MooseX::Object::Pluggable
70         MooseX::Param
71         MooseX::Params::Validate
72         MooseX::Plaggerize
73         MooseX::POE
74         MooseX::Policy::SemiAffordanceAccessor
75         MooseX::Q4MLog
76         MooseX::Role::Cmd
77         MooseX::Role::Matcher
78         MooseX::Role::Parameterized
79         MooseX::Role::TraitConstructor
80         MooseX::Role::XMLRPC::Client
81         MooseX::Scaffold
82         MooseX::SemiAffordanceAccessor
83         MooseX::SimpleConfig
84         MooseX::Singleton
85         MooseX::Storage
86         MooseX::Storage::Format::XML::Simple
87         MooseX::StrictConstructor
88         MooseX::Struct
89         MooseX::Templated
90         MooseX::Timestamp
91         MooseX::Traits
92         MooseX::Traits::Attribute::CascadeClear
93         MooseX::Types
94         MooseX::Types::Authen::Passphrase
95         MooseX::Types::Common
96         MooseX::Types::Data::GUID
97         MooseX::Types::DateTime
98         MooseX::Types::IO
99         MooseX::Types::Path::Class
100         MooseX::Types::Set::Object
101         MooseX::Types::Structured
102         MooseX::Types::URI
103         MooseX::Types::UUID
104         MooseX::Types::VariantTable
105         MooseX::WithCache
106         MooseX::Workers
107         MooseX::YAML
108         Fey-ORM
109         ]
110 );
111
112 close $log;
113
114 exit;
115
116 sub get_distro_from_cpan {
117     my $project = shift;
118
119     ( my $module = $project ) =~ s/-/::/g;
120
121     my @mods = CPAN::Shell->expand( 'Module', $module );
122
123     die "Cannot resolve $project to a single module object"
124         if @mods > 1;
125
126     return unless @mods;
127
128     my $dist = $mods[0]->distribution();
129
130     $dist->get();
131
132     return $dist;
133 }
134
135 sub test_module {
136     my $dir = shift;
137
138     local $CWD = $dir;
139
140     local $ENV{PERL_AUTOINSTALL} = '--defaultdeps';
141     if ( -f "Makefile.PL" ) {
142         return ! system $^X . ' Makefile.PL && make && make test';
143     }
144     else {
145         return ! system $^X . ' Build.PL && ./Build && ./Build test';
146     }
147 }
148
149 sub test_all_modules {
150     foreach my $project (@_) {
151         my $dist = get_distro_from_cpan($project);
152
153         unless ($dist) {
154             print $log "UNKNOWN : $project (not on CPAN?)\n";
155             next;
156         }
157
158         my $passed = test_module( $dist->dir() );
159
160         my $msg = $passed ? 'SUCCESS' : 'FAIL';
161
162         print $log sprintf( '%7s : %s - %s', $msg, $project, $dist->base_id() );
163         print $log "\n";
164     }
165 }
166
167 1;