Perl-Dist-Strawberry

 view release on metacpan or  search on metacpan

share/utils/CPAN_install_module.pl  view on Meta::CPAN

use v5.18;
use warnings;

use CPAN;
use File::Spec::Functions qw(catfile);
use Getopt::Long qw(:config gnu_getopt no_ignore_case);

my @spec = (
    'module=s@',
    'url=s',
    'dp_dir=s',
    'install_to=s',
    'dist_file=s',
    'output_dir=s',
    'use_sqlite=i',
    'run_tests=i',
    'follow_deps=i',
    'internet=i',
    'assume=i',
);
GetOptions(\my %opts, @spec) or die ">> invalid option(s)";

#defaults
$opts{module}      //= [];
$opts{install_to}  //= '';
$opts{url}         //= 'http://cpan.strawberryperl.com';
$opts{run_tests}   //= 1,
$opts{follow_deps} //= 1;

$opts{internet}    //= 1;
$opts{assume}      //= 0;
$opts{dp_dir}      //= 'c:\temp\xxx';
$opts{dist_file}   //= 'c:\temp\xxx.dist.file.txt';
$opts{output_dir}  //= 'c:\temp\xxx';
$opts{use_sqlite}  //= 0;
$opts{force}       //= 0;

my $module_list = '';

CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
$CPAN::Config->{'urllist'}     = [ $opts{url} ];
$CPAN::Config->{'use_sqlite'}  = $opts{use_sqlite};
$CPAN::Config->{'prefs_dir'}   = $opts{dp_dir};
$CPAN::Config->{'patches_dir'} = $opts{dp_dir};
if ($opts{follow_deps}) {
    $CPAN::Config->{'prerequisites_policy'} = q[follow];
}
else {
    $CPAN::Config->{'prerequisites_policy'} = q[ignore];
}
$CPAN::Config->{'connect_to_internet_ok'} = $opts{internet};
$CPAN::Config->{'ftp'} = q[];
if ($opts{install_to} =~ /(perl|site|vendor)/) {
    my $module_build_dirs = $opts{install_to};
    $module_build_dirs = 'core' if $module_build_dirs eq 'perl';
    $CPAN::Config->{'makepl_arg'}         = "INSTALLDIRS=$opts{install_to}";
    $CPAN::Config->{'make_install_arg'}   = "INSTALLDIRS=$opts{install_to}";
    $CPAN::Config->{'mbuildpl_arg'}       = "--installdirs $module_build_dirs";
    $CPAN::Config->{'mbuild_install_arg'} = "--installdirs $module_build_dirs";
}
open(my $cpan_fh, '>', $opts{dist_file}) or die ">> open: $!";
MODULE:
foreach my $name (@{$opts{module}}) {
    warn ">> Installing $name from CPAN...\n";
    my $module = CPAN::Shell->expandany($name) or die ">> CPAN.pm couldn't locate $name";

    if ( $module->uptodate() ) {
        unlink $opts{dist_file};
        warn ">> $name is up to date\n";
        say $cpan_fh "$name;;;" or die ">> say: $!";
        next MODULE;
    }

    try {
        if ($opts{run_tests} == 1) {
            CPAN::Shell->install($name);
        }
        elsif ($opts{run_tests} == 2) {
            CPAN::Shell->force('install', $name);
        }
        elsif ($opts{run_tests} == 0) {
            CPAN::Shell->notest('install', $name);
        }
        else {
            die "invalid run_tests";
        }
    } catch($e) {
        my $error = $@;
       
       #XXX-FIXME probably not needed
       #my $id = $module->distribution()->pretty_id();
       #my $time = time;
       #my $module_id = $name;
       #$module_id =~ s{::}{_}gmsx;
       #my $filename = catfile('$output_dir', "$time.$module_id.output.txt");
       #write_file($filename, $output);
       #die "Installation of $name failed: $error\n" if $error;
       #say $cpan_fh "$name;$id;$filename;"  or die "say: $!";
       
        warn ">> ERROR=$error" if $error;
    }
    warn ">> Completed install of '$name'\n";
    die ">> Installation of '$name' appears to have failed\n" unless $opts{assume} or $module->uptodate();



( run in 2.791 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )