package Module::CPANTS::Kwalitee::BrokenInstaller; use warnings; use strict; use File::Find; use File::Spec::Functions qw(catdir catfile abs2rel); use File::stat; sub order { 100 } sub analyse { my $class = shift; my $me = shift; my $distdir = $me->distdir; # inc/Module/Install.pm file my $mi = catfile($distdir, 'inc', 'Module', 'Install.pm'); # Must be okay if not using Module::Install if (not -f $mi) { $me->d->{broken_module_install} = 0; return; } open my $ih, '<', $mi or die "Could not open file '$mi' for checking the bad_installer metric: $!"; my $buf; read $ih, $buf, 100000 or die $!; close $ih; if ($buf =~ /VERSION\s*=\s*("|'|)(\d+|\d*\.\d+(?:_\d+)?)\1/m) { my $version = $2; my $non_devel = $version; $non_devel =~ s/_\d+$//; if ($non_devel < 0.61) { $me->d->{broken_module_install} = $version; } elsif ($non_devel < 0.64) { $me->d->{broken_module_install} = 0; my $makefilepl = catfile($distdir, 'Makefile.PL'); return if not -f $makefilepl; open my $ih, '<', $makefilepl or die "Could not open file '$makefilepl' for checking the bad_installer metric: $!"; local $/ = undef; my $mftext = <$ih>; close $ih; return if not defined $mftext or $mftext !~ /auto_install/; $me->d->{broken_module_install} = $version; } else { $me->d->{broken_module_install} = 0; } } else { # Unknown version (parsing $VERSION failed) $me->d->{broken_module_install} = 1; } return; } sub kwalitee_indicators { return [ { name=>'has_working_buildtool', error=>q{This package uses an obsolete version of Module::Install. Versions of Module::Install prior to 0.61 might not work on some systems at all. Additionally if your Makefile.PL uses the 'auto_install()' feature, you need at least version 0.64.}, remedy=>q{Upgrade the bundled version of Module::Install to at least 0.61, but preferably to the most current release. Alternatively, you can switch to another build system / installer that does not suffer from this problem. (ExtUtils::MakeMaker, Module::Build both of which have their own set of problems.)}, code=>sub { shift->{broken_module_install} ? 0 : 1 }, }, ]; } 1 __END__ =pod =head1 NAME Module::CPANTS::Kwalitee::BrokenInstaller - Check for broken Module::Install =head1 SYNOPSIS Find out whether the distribution uses an outdaten version of Module::Install. =head1 DESCRIPTION =head2 Methods =head3 order Defines the order in which Kwalitee tests should be run. Returns C<100>, as data generated by this should not be used by any other tests. =head3 analyse C checks whether the distribution uses Module::Install and if so whether it uses a reasonably current version of it (0.61 or later). It also checks whether the F uses the C feature. If so, C should be at least version 0.64. =head3 kwalitee_indicators Returns the Kwalitee Indicators datastructure. =over =item * uses_broken_installer =back =head1 SEE ALSO L =head1 AUTHOR Steffen Müller, , http://steffen-mueller.net Thomas Klausner, , http://domm.zsi.at =head1 COPYRIGHT You may use and distribute this module according to the same terms that Perl is distributed under. =cut