#!/usr/bin/perl BEGIN { my $file_name = __FILE__; $file_name =~ s{[^/\\]+$}{}; $file_name = '.' unless length $file_name; require ($file_name . "/cpanm"); } require JSON::PP; my $orig_jsonpp = \&JSON::PP::new; *JSON::PP::new = sub { return $orig_jsonpp->(@_)->allow_blessed; }; sub CPAN::Meta::TO_JSON { undef } my $orig_unsatisfied_deps = \&App::cpanminus::script::unsatisfied_deps; *App::cpanminus::script::unsatisfied_deps = sub { if ($_[0]->{scandeps}) { return (); } else { return $orig_unsatisfied_deps->(@_); } }; ## To support "Checking if you have ExtUtils::MakeMaker 7.0401 ... Yes (7.04_01)":-< my $orig_accepts = \&CPAN::Meta::Requirements::_Range::Range::_accepts; *CPAN::Meta::Requirements::_Range::Range::_accepts = sub { my ($self, $version) = @_; return 1 if $orig_accepts->(@_); if (defined $self->{minimum} and not defined $self->{maximum} and not defined $self->{exclusions}) { my $min = $self->{minimum}; $min =~ tr/_//d; $version =~ tr/_//d; return 1 if $min eq $version; } return; }; # _accepts my $orig_search_module = \&App::cpanminus::script::search_module; *App::cpanminus::script::search_module = sub { my ($self, $module, $version) = @_; if ($module eq 'ExtUtils::MakeMaker' and defined $version and $version =~ /^(\d+)\.(\d{2})(\d{2})$/) { $version = "$1.$2\_$3"; warn "$module $1.$2$3 -> $version rewritten\n"; } return $orig_search_module->($self, $module, $version); }; # search_module my $orig_search_mirror_index_file = \&App::cpanminus::script::search_mirror_index_file; *App::cpanminus::script::search_mirror_index_file = sub { my $self = shift; my ($file, $module, $version) = @_; my $value = $orig_search_mirror_index_file->($self, @_); return $value if $value; open my $fh, '<', $file or return undef; my $found; while (<$fh>) { if (m!^\Q$module\E\s+([\w\.]+)\s+(.*)!m) { $found = $self->cpan_module($module, $2, $1); last; } } if ($found) { if (!$version or version->new($found->{module_version} || 0) >= version->new($version)) { return $found; } else { $self->chat("Found $module version $found->{module_version} < $version.\n"); } } return undef; }; # search_mirror_index_file setpgrp 0, 0 unless $^O eq 'MSWin32'; my $app = App::cpanminus::script->new; $app->parse_options (@ARGV); exit $app->doit;