@@ -8,7 +8,7 @@ use CPAN::InfoObj;
88use File::Path ();
99@CPAN::Distribution::ISA = qw( CPAN::InfoObj) ;
1010use vars qw( $VERSION) ;
11- $VERSION = " 2.18_01 " ; # with cperl support
11+ $VERSION = " 2.19_01 " ; # with cperl support
1212
1313# no prepare, because prepare is not a command on the shell command line
1414# TODO: clear instance cache on reload
@@ -660,8 +660,11 @@ sub satisfy_requires {
660660 my ($self ) = @_ ;
661661 $self -> debug(" Entering satisfy_requires" ) if $CPAN::DEBUG ;
662662 if (my @prereq = $self -> unsat_prereq(" later" )) {
663- $self -> debug(" unsatisfied[@prereq ]" ) if $CPAN::DEBUG ;
664- $self -> debug(@prereq ) if $CPAN::DEBUG && @prereq ;
663+ if ($CPAN::DEBUG ){
664+ require Data::Dumper;
665+ my $prereq = Data::Dumper-> new(\@prereq )-> Terse(1)-> Indent(0)-> Dump;
666+ $self -> debug(" unsatisfied[$prereq ]" );
667+ }
665668 if ($prereq [0][0] eq " perl" ) {
666669 my $need = " requires perl '$prereq [0][1]'" ;
667670 my $id = $self -> pretty_id;
@@ -1656,7 +1659,7 @@ sub force {
16561659 my $methodmatch = 0;
16571660 my $ldebug = 0;
16581661 PHASE: for my $phase (qw( unknown get make test install) ) { # order matters
1659- $methodmatch = 1 if $fforce || $ phase eq $method ;
1662+ $methodmatch = 1 if $fforce || ( $method && $ phase eq $method ) ;
16601663 next unless $methodmatch ;
16611664 ATTRIBUTE: for my $att (@{$phase_map {$phase }}) {
16621665 if ($phase eq " get" ) {
@@ -1718,18 +1721,21 @@ sub isa_perl {
17181721 my ($self ) = @_ ;
17191722 my $file = File::Basename::basename($self -> id);
17201723 if ($file =~ m { ^ perl
1721- -?
1722- (5)
1723- ([._-])
17241724 (
1725- \d {3}(_[0-4][0-9])?
1725+ -(5 \.\d + \.\d +)
17261726 |
1727- \d + \.\d +
1727+ (5)[._-](00[0-5](?:_[0-4][0-9])?)
17281728 )
17291729 \. tar[._-](?:gz|bz2)
17301730 (?!\n )\Z
17311731 } xs ) {
1732- return " $1 .$3 " ;
1732+ my $perl_version ;
1733+ if ($2 ) {
1734+ $perl_version = $2 ;
1735+ } else {
1736+ $perl_version = " $3 .$4 " ;
1737+ }
1738+ return $perl_version ;
17331739 } elsif ($self -> cpan_comment
17341740 &&
17351741 $self -> cpan_comment =~ / isa_perl\( .+?\) / ) {
@@ -1983,7 +1989,12 @@ sub prepare {
19831989 }
19841990 }
19851991 elsif ( $self -> _should_report(' pl' ) ) {
1986- ($output , $ret ) = CPAN::Reporter::record_command($system );
1992+ ($output , $ret ) = eval { CPAN::Reporter::record_command($system ) };
1993+ if (! defined $output or $@ ) {
1994+ my $err = $@ || " Unknown error" ;
1995+ $CPAN::Frontend -> mywarn(" Error while running PL phase: $err " );
1996+ return $self -> goodbye(" $system -- NOT OK" );
1997+ }
19871998 CPAN::Reporter::grade_PL( $self , $system , $output , $ret );
19881999 }
19892000 else {
@@ -2085,7 +2096,7 @@ is part of the perl-%s distribution. To install that, you need to run
20852096 $self -> called_for,
20862097 $self -> isa_perl,
20872098 $self -> called_for,
2088- $self -> id ,
2099+ $self -> pretty_id ,
20892100 ));
20902101 $self -> {make } = CPAN::Distrostatus-> new(" NO isa perl" );
20912102 $CPAN::Frontend -> mysleep(1);
@@ -2611,9 +2622,19 @@ sub _make_install_make_command {
26112622sub is_locally_optional {
26122623 my ($self , $prereq_pm , $prereq ) = @_ ;
26132624 $prereq_pm ||= $self -> {prereq_pm };
2614- exists $prereq_pm -> {opt_requires }{$prereq }
2615- ||
2616- exists $prereq_pm -> {opt_build_requires }{$prereq };
2625+ my ($nmo ,$opt );
2626+ for my $rt (qw( requires build_requires) ) {
2627+ if (exists $prereq_pm -> {$rt }{$prereq }) {
2628+ # rt 121914
2629+ $nmo ||= $CPAN::META -> instance(" CPAN::Module" ,$prereq );
2630+ my $av = $nmo -> available_version;
2631+ return 0 if !$av || CPAN::Version-> vlt($av ,$prereq_pm -> {$rt }{$prereq });
2632+ }
2633+ if (exists $prereq_pm -> {" opt_$rt " }{$prereq }) {
2634+ $opt = 1;
2635+ }
2636+ }
2637+ return $opt ||0;
26172638}
26182639
26192640# -> sub CPAN::Distribution::follow_prereqs ;
@@ -2627,7 +2648,7 @@ sub follow_prereqs {
26272648 # e.g. $p = ['Devel::PartialDump', 'r', 1]
26282649 # skip builtins without .pm
26292650 if ($Config::Config {usecperl }
2630- and $p -> [0] =~ / ^(DynaLoader|XSLoader|strict|coretypes)$ / ) {
2651+ and $p -> [0] =~ / ^(DynaLoader|XSLoader|strict|coretypes)$ / ) {
26312652 CPAN-> debug(" $p ->[0] builtin" ) if $CPAN::DEBUG ;
26322653 next ;
26332654 }
@@ -2769,8 +2790,29 @@ sub _feature_depends {
27692790sub prereqs_for_slot {
27702791 my ($self ,$slot ) = @_ ;
27712792 my ($prereq_pm );
2772- $CPAN::META -> has_usable(" CPAN::Meta::Requirements" )
2773- or die " CPAN::Meta::Requirements not available" ;
2793+ unless ($CPAN::META -> has_usable(" CPAN::Meta::Requirements" )) {
2794+ my $whynot = " not available" ;
2795+ if (defined $CPAN::Meta::Requirements::VERSION ) {
2796+ $whynot = " version $CPAN::Meta::Requirements::VERSION not sufficient" ;
2797+ }
2798+ $CPAN::Frontend -> mywarn(" CPAN::Meta::Requirements $whynot \n " );
2799+ my $before = " " ;
2800+ if ($self -> {CALLED_FOR }){
2801+ if ($self -> {CALLED_FOR } =~
2802+ / ^(
2803+ CPAN::Meta::Requirements
2804+ |version
2805+ |parent
2806+ |ExtUtils::MakeMaker
2807+ |Test::Harness
2808+ )$ /x ) {
2809+ $CPAN::Frontend -> mywarn(" Setting requirements to nil as a workaround\n " );
2810+ return ;
2811+ }
2812+ $before = " before $self ->{CALLED_FOR}" ;
2813+ }
2814+ $CPAN::Frontend -> mydie(" Please install CPAN::Meta::Requirements manually$before " );
2815+ }
27742816 my $merged = CPAN::Meta::Requirements-> new;
27752817 my $prefs_depends = $self -> prefs-> {depends }||{};
27762818 my $feature_depends = $self -> _feature_depends();
@@ -2833,12 +2875,19 @@ sub unsat_prereq {
28332875 my ($self ,$slot ) = @_ ;
28342876 my ($merged_hash ,$prereq_pm ) = $self -> prereqs_for_slot($slot );
28352877 my (@need );
2836- $CPAN::META -> has_usable(" CPAN::Meta::Requirements" )
2837- or die " CPAN::Meta::Requirements not available" ;
2878+ unless ($CPAN::META -> has_usable(" CPAN::Meta::Requirements" )) {
2879+ $CPAN::Frontend -> mywarn(" CPAN::Meta::Requirements not available, please install as soon as possible, trying to continue with severly limited capabilities\n " );
2880+ return ;
2881+ }
28382882 my $merged = CPAN::Meta::Requirements-> from_string_hash($merged_hash );
28392883 my @merged = sort $merged -> required_modules;
28402884 CPAN-> debug(" all merged_prereqs[@merged ]" ) if $CPAN::DEBUG ;
28412885 NEED: for my $need_module ( @merged ) {
2886+ # skip builtins without .pm
2887+ if ($^V =~ / c$ / and $need_module =~ / ^(DynaLoader|XSLoader|strict|coretypes)$ / ) {
2888+ CPAN-> debug(" $need_module builtin" ) if $CPAN::DEBUG ;
2889+ next NEED;
2890+ }
28422891 my $need_version = $merged -> requirements_for_module($need_module );
28432892 my ($available_version ,$inst_file ,$available_file ,$nmo );
28442893 if ($need_module eq " perl" ) {
@@ -3055,6 +3104,10 @@ sub unsat_prereq {
30553104 }
30563105 # here need to flag as optional for recommends/suggests
30573106 # -- xdg, 2012-04-01
3107+ $self -> debug(sprintf " %s manadory?[%s ]" ,
3108+ $self -> pretty_id,
3109+ $self -> {mandatory })
3110+ if $CPAN::DEBUG ;
30583111 my $optional = !$self -> {mandatory }
30593112 || $self -> is_locally_optional($prereq_pm , $need_module );
30603113 push @need , [$need_module ,$needed_as ,$optional ];
@@ -3977,7 +4030,15 @@ sub install {
39774030 local $ENV {PERL_MM_USE_DEFAULT } = 1 if $CPAN::Config -> {use_prompt_default };
39784031 local $ENV {NONINTERACTIVE_TESTING } = 1 if $CPAN::Config -> {use_prompt_default };
39794032
3980- my ($pipe ) = FileHandle-> new(" $system $stderr |" ) || Carp::croak(" Can't execute $system : $! " );
4033+ my ($pipe ) = FileHandle-> new(" $system $stderr |" );
4034+ unless ($pipe ) {
4035+ $CPAN::Frontend -> mywarn(" Can't execute $system : $! " );
4036+ $self -> introduce_myself;
4037+ $self -> {install } = CPAN::Distrostatus-> new(" NO" );
4038+ $CPAN::Frontend -> mywarn(" $system -- NOT OK\n " );
4039+ delete $self -> {force_update };
4040+ return ;
4041+ }
39814042 my ($makeout ) = " " ;
39824043 while (<$pipe >) {
39834044 print $_ ; # intentionally NOT use Frontend->myprint because it
@@ -3992,7 +4053,8 @@ sub install {
39924053 $CPAN::Frontend -> myprint(" $system -- OK\n " );
39934054 $CPAN::META -> is_installed($self -> {build_dir });
39944055 $self -> {install } = CPAN::Distrostatus-> new(" YES" );
3995- if ($CPAN::Config -> {' cleanup_after_install' }) {
4056+ if ($CPAN::Config -> {' cleanup_after_install' }
4057+ && ! $self -> is_dot_dist) {
39964058 my $parent = File::Spec-> catdir( $self -> {build_dir }, File::Spec-> updir );
39974059 chdir $parent or $CPAN::Frontend -> mydie(" Couldn't chdir to $parent : $! \n " );
39984060 File::Path::rmtree($self -> {build_dir });
0 commit comments