package Module::CPANTS::Kwalitee::BrokenInstaller;
use warnings;
use strict;
use File::Spec::Functions qw(catfile);

our $VERSION = '1.03';
$VERSION =~ s/_//; ## no critic

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
    return if not -f $mi;

    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) {
        $me->d->{module_install}{version} = my $version = $2;
        my $non_devel = $version;
        $non_devel =~ s/_\d+$//;
        if ($non_devel < 0.61 or $non_devel == 1.04) {
            $me->d->{module_install}{broken} = 1;
        }
        if ($non_devel < 0.89) {
            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;

            if ($mftext =~ /auto_install/) {
                $me->d->{module_install}{broken_auto_install} = 1;
            } else {
                return;
            }

            if ($non_devel < 0.64) {
                $me->d->{module_install}{broken} = 1;
            }
        }
    }
    else {
        # Unknown version (parsing $VERSION failed)
        $me->d->{module_install}{broken} = 1;
    }

    return;
}

sub kwalitee_indicators {
  return [
    {
        name => 'no_broken_module_install',
        error => q{This distribution 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. Also, 1.04 is known to be broken.},
        remedy => q{Upgrade the bundled version of Module::Install 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 {
            my $d = shift;
            return 1 unless exists $d->{module_install};
            $d->{module_install}{broken} ? 0 : 1;
        },
        details => sub {
            q{This distribution uses obsolete Module::Install version }.(shift->{module_install}{version});
        },
    },
    {
        name => 'no_broken_auto_install',
        error => q{This distribution uses an old version of Module::Install. Versions of Module::Install prior to 0.89 do not detect correctly that CPAN/CPANPLUS shell is used.},
        remedy => q{Upgrade the bundled version of Module::Install to at least 0.89, 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 {
            my $d = shift;
            return 1 unless exists $d->{module_install};
            $d->{module_install}{broken_auto_install} ? 0 : 1;
        },
        details => sub {
            q{This distribution uses obsolete Module::Install version }.(shift->{module_install}{version});
        },
    },
];
}

1

__END__

=encoding UTF-8

=head1 NAME

Module::CPANTS::Kwalitee::BrokenInstaller - Check for broken Module::Install

=head1 SYNOPSIS

Find out whether the distribution uses an outdated 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<MCK::BrokenInstaller> 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<Makefile.PL> uses the C<auto_install> feature.
If so, C<Module::Install> should be at least version 0.64.

=head3 kwalitee_indicators

Returns the Kwalitee Indicators data structure.

=over

=item * no_broken_module_install

=item * no_broken_auto_install

=back

=head1 SEE ALSO

L<Module::CPANTS::Analyse>

=head1 AUTHOR

L<Steffen Müller|https://metacpan.org/author/smueller>

L<Thomas Klausner|https://metacpan.org/author/domm>

=head1 COPYRIGHT AND LICENSE

Copyright © 2003–2009 L<Thomas Klausner|https://metacpan.org/author/domm>

Copyright © 2006 L<Steffen Müller|https://metacpan.org/author/smueller>

You may use and distribute this module according to the same terms
that Perl is distributed under.
