Skip to content

Instantly share code, notes, and snippets.

@kentfredric
Created July 23, 2015 11:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kentfredric/6909949e7fdc91dd47e6 to your computer and use it in GitHub Desktop.
Save kentfredric/6909949e7fdc91dd47e6 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
sub dep(@) { Dep->new( name => @_ ) }
## Archive::Tar ------
dep 'GSAR/Archive-Tar-0.071.tar.gz' => provides => { 'Archive::Tar' => '0.071', };
dep 'SRZ/Archive-Tar-0.22.tar.gz' => provides => { 'Archive::Tar' => '0.22', };
## Array::Compare -----
dep 'DAVECROSS/Array-Compare-0.01.tar.gz' => provides => { 'Array::Compare' => '0.01', };
#| Last before MB gets added
dep 'DAVECROSS/Array-Compare-1.03.tar.gz' => provides => { 'Array::Compare' => '1.03', };
#| Last version before Moose/Moo hits
dep 'DAVECROSS/Array-Compare-1.18.tar.gz' => provides => { 'Array::Compare' => '1.18', },
requires => { Carp => 0, 'Module::Build' => '0', CPAN => '1.90' };
## Carp -------------------
#| 1.34_01 - 1.36 broken
dep 'ZEFRAM/Carp-1.22.tar.gz' => provides => { 'Carp' => '1.22' },
requires => {
'Exporter' => '0',
'Test::More' => '0',
};
dep 'ZEFRAM/Carp-1.3301.tar.gz' => provides => { 'Carp' => '1.3301' },
requires => {
'Test::More' => '0',
'parent' => '0.217',
};
dep 'ADAMK/Config-Tiny-0.1.tar.gz' => provides => { 'Config::Tiny' => '0.1' },
requires => { 'Test::Simple' => 0, };
dep 'ADAMK/Config-Tiny-2.08.tar.gz' => provides => { 'Config::Tiny' => '2.08' },
requires => { 'Test::More' => '0.47', };
## CPAN ---------------------
dep 'ANDK/CPAN-1.60b.tar.gz' => provides => { 'CPAN' => '1.60' },
requires => { 'Test::More' => 0, };
dep 'ANDK/CPAN-1.70.tar.gz' => provides => { 'CPAN' => '1.70' },
requires => { 'Test::More' => 0, };
dep 'ANDK/CPAN-1.80.tar.gz' => provides => { 'CPAN' => '1.80' },
requires => { 'Test::More' => 0, };
#| Build.PL Support
dep 'ANDK/CPAN-1.90.tar.gz' => provides => { 'CPAN' => '1.90' },
requires => {
'Test::More' => 0,
'Scalar::Util' => 0,
'Test::Harness' => '2.62',
'Time::HiRes' => 0
};
dep 'ANDK/CPAN-2.10.tar.gz' => provides => { 'CPAN' => '2.10' },
requires => {
'Test::More' => '0.88',
'Test::Harness' => '2.62',
'ExtUtils::MakeMaker' => '6.32',
'version' => '0.88',
'if' => 0,
'CPAN::Meta::Requirements' => '2.121',
'IO::Scalar' => 2.105,
'Time::HiRes' => 0,
'HTTP::Tiny' => '0.005',
};
## CPAN::Meta ----------------
dep 'DAGOLDEN/CPAN-Meta-2.110360.tar.gz' => provides => { 'CPAN::Meta' => '2.110360', },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Carp' => '0',
'Scalar::Util' => '0',
'Parse::CPAN::Meta' => '1.43',
'Version::Requirements' => '0.101020',
'version' => '0.82',
'File::Temp' => '0.20',
'Storable' => '0',
'Test::More' => '0.96',
};
dep 'DAGOLDEN/CPAN-Meta-2.120350.tar.gz' => provides => {
'CPAN::Meta' => '2.120350',
'CPAN::Meta::Requirements' => '2.120350',
};
## CPAN::Meta::Requirements -----------
dep 'DAGOLDEN/CPAN-Meta-Requirements-2.121.tar.gz' => provides => { 'CPAN::Meta::Requirements' => 2.121 },
requires => {
'Scalar::Util' => 0,
'ExtUtils::MakeMaker' => '6.17',
'version' => '0.77',
'Test::More' => '0.88',
};
## CPAN::Meta::YAML -------------------
dep 'DAGOLDEN/CPAN-Meta-YAML-0.001.tar.gz' => provides => { 'CPAN::Meta::YAML' => '0.001' },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Scalar::Util' => '1.08', # refaddr
'Test::More' => 0,
'File::Temp' => 0,
};
dep 'DAGOLDEN/CPAN-Meta-YAML-0.002.tar.gz' => provides => { 'CPAN::Meta::YAML' => '0.002' },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Scalar::Util' => '1.08', # refaddr
'Test::More' => 0,
'File::Temp' => 0,
};
##
dep 'DAGOLDEN/CPAN-Reporter-0.10.tar.gz' => provides => { 'CPAN::Reporter' => '0.10' },
requires => { 'Config::Tiny' => 2.08, 'File::HomeDir' => 0.58, 'File::Temp' => 0.16 };
dep 'NANIS/Crypt-SSLeay-0.58.tar.gz' => provides => { 'Crypt::SSLeay' => '0.58' },
requires => {
'MIME::Base64' => 0,
'Test::More' => 0,
};
dep 'FERREIRA/Exporter-5.59.tar.gz' => provides => { 'Exporter' => '5.59', };
## ExtUtils::MakeMaker --------------
dep 'MSCHWERN/ExtUtils-MakeMaker-6.17.tar.gz' => provides => { 'ExtUtils::MakeMaker' => '6.17', };
dep 'MSCHWERN/ExtUtils-MakeMaker-6.32.tar.gz' => provides => { 'ExtUtils::MakeMaker' => '6.32', };
dep 'MSCHWERN/ExtUtils-MakeMaker-6.42.tar.gz' => provides => { 'ExtUtils::MakeMaker' => '6.42', };
dep 'SBURKE/File-HomeDir-0.03.tar.gz' => provides => { 'File::HomeDir' => '0.03' };
dep 'ADAMK/File-HomeDir-0.58.tar.gz' => provides => { 'File::HomeDir' => '0.58' },
requires => {
'Test::More' => '0.47',
'ExtUtils::MakeMaker' => '6.17' # pm_to_blib sub
};
## File::Temp -----------------------
dep 'TJENNESS/File-Temp-0.13.tar.gz' => provides => { 'File::Temp' => '0.13' };
dep 'TJENNESS/File-Temp-0.16.tar.gz' => provides => { 'File::Temp' => '0.16' },
requires => { 'Test::More' => 0, };
dep 'TJENNESS/File-Temp-0.20.tar.gz' => provides => { 'File::Temp' => '0.20' },
requires => { 'Test::More' => 0 };
# First version over 5.6.1
dep 'JV/Getopt-Long-2.26.tar.gz' => provides => { 'Getopt::Long' => '2.26' };
## HTTP::Tiny ----------------------
dep 'DAGOLDEN/HTTP-Tiny-0.002.tar.gz' => provides => { 'HTTP::Tiny' => '0.002' },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Test::Simple' => '0.88',
};
dep 'DAGOLDEN/HTTP-Tiny-0.005.tar.gz' => provides => { 'HTTP::Tiny' => '0.005' },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Test::Simple' => '0.88',
};
dep 'ILYAZ/modules/if-0.0601.tar.gz' => provides => { 'if' => '0.0601' };
## IO-stringy ----------------------
if ( $ENV{ASKING_FOR_PROBLEMS} ) {
# Versions before 2.110 have values of $VERSION larger than 40 internally == not going to work
dep 'ERYQ/IO-stringy-1.104.tar.gz' => provides => { 'IO::Scalar' => '1.104' };
dep 'ERYQ/IO-stringy-2.105.tar.gz' => provides => { 'IO::Scalar' => '2.105' };
}
dep 'DSKOLL/IO-stringy-2.110.tar.gz' => provides => { 'IO::Scalar' => '2.110' };
dep 'DSKOLL/IO-stringy-2.111.tar.gz' => provides => { 'IO::Scalar' => '2.111' };
##
dep 'BEHROOZI/IO-Socket-SSL-0.97.tar.gz' => provides => { 'IO::Socket::SSL' => '0.97' },
requires => { 'Net::SSLeay' => '1.21', };
## JSON-PP --------------------
dep 'MAKAMAKA/JSON-PP-2.27101.tar.gz' => provides => { 'JSON::PP' => '2.27101', },
requires => {
'JSON::PP::Compat5006' => 0,
'Test::More' => 0,
};
dep 'MAKAMAKA/JSON-PP-2.27103.tar.gz' => provides => { 'JSON::PP' => '2.27103', },
requires => {
'JSON::PP::Compat5006' => 0,
'Test::More' => 0,
};
##
dep 'MAKAMAKA/JSON-PP-Compat5006-1.09.tar.gz' => provides => { 'JSON::PP::Compat5006' => '1.09', },
requires => { 'Test::More' => 0, };
dep 'AUTRIJUS/Locale-Maketext-Simple-0.01.tar.gz' => provides => { 'Locale::Maketext::Simple' => '0.01', };
dep 'GAAS/MIME-Base64-2.00.tar.gz' => provides => { 'MIME::Base64' => '2.00' };
# First version that passes tests without -fPIC relocation issues
dep 'KWILLIAMS/Module-Build-0.22.tar.gz' => provides => { 'Module::Build' => 0.22 },
requires => { 'Archive::Tar' => 0.22, YAML => '0.35' };
## Module::Load -------------
dep 'KANE/Module-Load-0.05.tar.gz' => provides => { 'Module::Load' => '0.05' },
requires => { 'Test::More' => 0, };
dep 'KANE/Module-Load-0.12.tar.gz' => provides => { 'Module::Load' => '0.12' },
requires => { 'Test::More' => 0, };
## Module::Load::Conditional -----
dep 'KANE/Module-Load-Conditional-0.02.tar.gz' => provides => { 'Module::Load::Conditional' => '0.02' },
requires => {
'Test::More' => 0,
'Params::Check' => 0,
'Module::Load' => 0,
'Locale::Maketext::Simple' => 0,
};
dep 'KANE/Module-Load-Conditional-0.24.tar.gz' => provides => { 'Module::Load::Conditional' => '0.24' },
requires => {
'Test::More' => 0,
'Params::Check' => 0,
'Module::Load' => '0.11',
'Locale::Maketext::Simple' => 0,
'version' => '0.69',
};
dep 'KANE/Module-Load-Conditional-0.26.tar.gz' => provides => { 'Module::Load::Conditional' => '0.26' },
requires => {
'Test::More' => 0,
'Params::Check' => 0,
'Module::Load' => '0.11',
'Locale::Maketext::Simple' => 0,
'version' => '0.69',
};
## Net-SSLeay -------------------
dep 'FLORA/Net-SSLeay-1.36.tar.gz' => provides => { 'Net::SSLeay' => '1.36' },
requires => {
'ExtUtils::MakeMaker' => '6.42',
'MIME::Base64' => 0,
'Test::More' => '0.50',
};
dep 'MIKEM/Net-SSLeay-1.42.tar.gz' => provides => { 'Net::SSLeay' => '1.42' },
requires => {
'ExtUtils::MakeMaker' => '6.42',
'Test::More' => '0.50',
'MIME::Base64' => 0,
};
##
dep 'KANE/Params-Check-0.02.tar.gz' => provides => { 'Params::Check' => '0.02', },
requires => {
'Test::More' => 0,
'Locale::Maketext::Simple' => 0,
};
## parent ------------------------
dep 'CORION/parent-0.215.tar.gz' => provides => { parent => '0.215' },
requires => { 'Test::More' => '0.40' };
dep 'CORION/parent-0.217.tar.gz' => provides => { parent => '0.217' },
requires => { 'Test::More' => '0.40' };
## Parse-CPAN-Meta ---------------
dep 'ADAMK/Parse-CPAN-Meta-0.01.tar.gz' => provides => { 'Parse::CPAN::Meta' => '0.01' },
requires => { 'Test::More' => '0.47', 'YAML::Tiny' => 0 };
dep 'DAGOLDEN/Parse-CPAN-Meta-1.4400.tar.gz' => provides => { 'Parse::CPAN::Meta' => '1.4400' },
requires => {
'Test::More' => '0.47',
'JSON::PP' => '2.27103',
'CPAN::Meta::YAML' => '0.002',
'Module::Load::Conditional' => '0.26',
};
## Scalar-List-Utils ---------------
# First with ::Util
dep 'GBARR/Scalar-List-Utils-1.00.tar.gz' => provides => { 'Scalar::Util' => '1.00' };
# First with refaddr
dep 'GBARR/Scalar-List-Utils-1.08.tar.gz' => provides => { 'Scalar::Util' => '1.08' };
##
dep 'RAM/Storable-0.6.5.tar.gz' => provides => { 'Storable' => '0.605' };
dep 'MSCHWERN/Sub-Uplevel-0.03.tar.gz' => provides => { 'Sub::Uplevel' => '0.03' };
dep 'DAGOLDEN/Tee-0.10.tar.gz' => provides => { 'Tee' => '0.10' },
requires => { 'Test::More' => '0.45', };
## Test-Simple ----------------------
dep 'MSCHWERN/Test-Simple-0.41.tar.gz' => provides => {
'Test::More' => '0.41',
'Test::Simple' => '0.41',
},
requires => { 'Test::Harness' => '2.03' };
dep 'MSCHWERN/Test-Simple-0.43.tar.gz' => provides => {
'Test::Builder' => '0.13',
'Test::More' => '0.42',
'Test::Simple' => '0.43',
},
requires => { 'Test::Harness' => '2.03' };
dep 'MSCHWERN/Test-Simple-0.45.tar.gz' => provides => {
'Test::Builder' => '0.15',
'Test::More' => '0.42',
'Test::Simple' => '0.45',
},
requires => { 'Test::Harness' => '2.03' };
dep 'MSCHWERN/Test-Simple-0.50.tar.gz' => provides => {
'Test::Builder' => '0.19',
'Test::More' => '0.50',
'Test::Simple' => '0.50',
},
requires => { 'Test::Harness' => '2.03' };
dep 'MSCHWERN/Test-Simple-0.62.tar.gz' => provides => {
'Test::Builder' => '0.32',
'Test::More' => '0.62',
'Test::Simple' => '0.62',
'Test::Builder::Tester' => '1.02',
},
requires => { 'Test::Harness' => '2.04' };
dep 'MSCHWERN/Test-Simple-0.88.tar.gz' => provides => {
'Test::Builder' => '0.88',
'Test::More' => '0.88',
'Test::Simple' => '0.88',
'Test::Builder::Tester' => '1.18',
},
requires => { 'Test::Harness' => '2.03' };
dep 'MSCHWERN/Test-Simple-0.96.tar.gz' => provides => {
'Test::Builder' => '0.96',
'Test::More' => '0.96',
'Test::Simple' => '0.96',
'Test::Builder::Tester' => '1.20',
},
requires => { 'Test::Harness' => '2.03' };
##
dep 'ADIE/Test-Exception-0.07.tar.gz' => provides => { 'Test::Exception' => '0.07', },
requires => {
'Test::Builder' => 0,
'Test::Builder::Tester' => 0,
};
## Test-Harness ---------------------------
dep 'MSCHWERN/Test-Harness-2.03.tar.gz' => provides => { 'Test::Harness' => '2.03', };
dep 'MSCHWERN/Test-Harness-2.04.tar.gz' => provides => { 'Test::Harness' => '2.04', };
dep 'PETDANCE/Test-Harness-2.62.tar.gz' => provides => { 'Test::Harness' => '2.62', };
##
dep 'FDALY/Test-NoWarnings-0.05.tar.gz' => provides => { 'Test::NoWarnings' => '0.05', },
requires => {
'Test::More' => 0,
'Test::Tester' => '0.06',
};
## Test-Tester ----------------------------
dep 'FDALY/Test-Tester-0.03.tar.gz' => provides => { 'Test::Tester' => '0.03' },
requires => { 'Test::Builder' => 0 };
dep 'FDALY/Test-Tester-0.06.tar.gz' => provides => { 'Test::Tester' => '0.06' },
requires => { 'Test::Builder' => 0, };
##
dep 'BIGJ/Test-Warn-0.01.tar.gz' => provides => { 'Test::Warn' => '0.01' },
requires => {
'Array::Compare' => 0,
'Test::Builder' => 0,
'Test::Builder::Tester' => 0,
'Test::Exception' => 0,
};
dep 'DEWEG/Time-HiRes-01.10.tar.gz' => provides => { 'Time::HiRes' => '01.10' };
dep 'SBURKE/Tree-DAG_Node-0.73.tar.gz' => provides => { 'Tree::DAG_Node' => '0.73' };
## Version::Requirements ------------------------
dep 'RJBS/Version-Requirements-0.100510.tar.gz' => provides => { 'Version::Requirements' => '0.100510' },
requires => {
'ExtUtils::MakeMaker' => '6.11',
'Test::More' => '0.88',
'version' => 0,
'Carp' => 0,
'Scalar::Util' => 0,
};
dep 'RJBS/Version-Requirements-0.101020.tar.gz' => provides => { 'Version::Requirements' => '0.101020' },
requires => {
'ExtUtils::MakeMaker' => '6.31',
'Test::More' => '0.88',
'version' => '0.77',
'Carp' => 0,
'Scalar::Util' => 0,
};
## version ---------------------------------------
dep 'JPEACOCK/version-0.78.tar.gz' => provides => { version => '0.78' },
requires => {
'Test::More' => '0.45',
'File::Temp' => '0.13',
};
dep 'JPEACOCK/version-0.88.tar.gz' => provides => { version => '0.88' },
requires => {
'Test::More' => '0.45',
'File::Temp' => '0.13',
};
## YAML ----------------------------------------
dep 'INGY/YAML-0.25.tar.gz' => provides => { 'YAML' => '0.25' };
dep 'INGY/YAML-0.35.tar.gz' => provides => { 'YAML' => '0.35' };
dep 'ADAMK/YAML-Tiny-0.10.tar.gz' => provides => { 'YAML::Tiny' => '0.10' },
requires => { 'Test::More' => '0.47', };
## END OF DEPS ################################
## Integrity check
if ( $ENV{INTEGRITY_CHECK} ) {
for my $pair ( Dep->get_module_pairs ) {
Dep->resolve_dependency( @{$pair} );
}
for my $distname ( Dep->get_distnames ) {
my $dist = Dep->get_dist($distname);
for my $module ( keys %{ $dist->requires } ) {
Dep->resolve_dependency( $module, $dist->requires->{$module} );
}
}
exit;
}
##
open my $fh, '>', 'bork_cpan.pm' or die "cant open bork_cpan.pm";
print {$fh} <<'EOF';
#!/usr/bin/env perl
use strict;
use warnings;
package bork_cpan;
require CPAN;
my ( $orig ) = \&CPAN::Distribution::unsat_prereq;
{
no warnings q[redefine];
*CPAN::Distribution::unsat_prereq = sub {
my ( $self, @args ) = @_;
my ( @return ) = $self->$orig(@args);
@return = grep { defined $_ and length $_ and !/\A\s*\z/ } @return;
if ( @return ) {
die qq[Unsatisfied Prereqs @return];
}
return @return;
};
}
1;
EOF
close $fh;
print <<"EOF";
# vim: syntax=sh
cpan() {
perl -I. -Mbork_cpan -MCPAN -e 'install(\@ARGV)' \$@
return \$?
}
cpan_force() {
perl -I. -Mbork_cpan -MCPAN -e 'force(install=>\@ARGV)' \$@
return \$?
}
has_version() {
local ok;
if [ "\$2" == "0" ]; then
perl -M\$1 -e 1 2>/dev/null \\
&& echo -e "\\e[32m \$1 \$2 OK\\e[0m" \\
&& return;
fi
perl -M\$1\\ \$2 -e 1 2>/dev/null \\
&& echo -e "\\e[32m \$1 \$2 OK\\e[0m" \\
&& return;
echo -e "\\e[33m \$1 v \$2 Not installed\\e[0m"
return 1
}
set -euo pipefail
EOF
print Dep->dep_as_bash( $ARGV[0], $ARGV[1] || '0' );
print "\n#end\n";
exit;
BEGIN {
package Dep::Version;
sub fast_numify {
my ($version) = @_;
if ( $version =~ /\A\d+\z/ ) {
return $version;
}
if ( $version =~ /\A\d+\.\d+\z/ ) {
return $version;
}
if ( $version =~ /_/ ) {
my $stripped = $version;
$stripped =~ s/_//g;
if ( $stripped =~ /\A\d+\.\d+\z/ ) {
return $stripped;
}
}
$version =~ s/\Av//g; #strip leading v
my (@parts) = split /_|\./, $version; # Alpha V-Strings ahoy!
my $major = shift @parts;
return sprintf "%s.%s", $major, join q[], map { sprintf "%03d", $_ } @parts;
}
}
BEGIN {
package Dep::Module;
*_fast_numify = \&Dep::Version::fast_numify;
sub new {
my ( $self, @args ) = @_;
my $obj = bless {@args}, $self;
die "_name_ required" unless $obj->{name};
$obj->{versions} = {};
return $obj;
}
sub register {
my ( $self, $version, $dep ) = @_;
$self->{versions}->{$version} = $dep;
}
sub versions {
my ($self) = @_;
return sort { _fast_numify($a) <=> _fast_numify($b) } keys %{ $self->{versions} };
}
sub version_pairs {
my ($self) = @_;
return map { [ $self->{name}, $_ ] } $self->versions;
}
sub version_satisfies {
my ( $self, $version ) = @_;
my $minver = _fast_numify($version);
for my $version ( $self->versions ) {
my $choice = _fast_numify($version);
if ( $choice >= $minver ) {
return $self->{versions}->{$version};
}
}
return;
}
}
BEGIN {
package Dep;
my $DEP_CACHE = {};
my $DIST_CACHE = {};
sub new {
my ( $self, @args ) = @_;
my $obj = bless {@args}, $self;
die "_name_ required" unless $obj->{name};
die "_provides_ required" unless $obj->{provides};
$obj->{requires} ||= {};
$obj->_register_provides;
$obj->_register_dist;
return $obj;
}
sub name { $_[0]->{name} }
sub requires { $_[0]->{requires} }
sub provides {
ref $_[0]->{provides} eq 'HASH'
? %{ $_[0]->{provides} }
: @{ $_[0]->{provides} };
}
sub _register_provides {
my (@provides) = $_[0]->provides;
while (@provides) {
my ( $module, $version ) = splice @provides, 0, 2, ();
$DEP_CACHE->{$module} = Dep::Module->new( name => $module ) unless exists $DEP_CACHE->{$module};
$DEP_CACHE->{$module}->register( $version, $_[0] );
}
}
sub _register_dist {
$DIST_CACHE->{ $_[0]->{name} } = $_[0];
}
sub get_dist {
return $DIST_CACHE->{ $_[1] } if exists $DIST_CACHE->{ $_[1] };
}
sub get_module {
return $DEP_CACHE->{ $_[1] } if exists $DEP_CACHE->{ $_[1] };
}
sub get_distnames {
sort keys %{$DIST_CACHE};
}
sub get_modulenames {
sort keys %{$DEP_CACHE};
}
sub get_module_pairs {
map { $DEP_CACHE->{$_}->version_pairs } sort keys %{$DEP_CACHE};
}
our @context;
sub resolve_dependency {
my ( $self, $module, $version ) = @_;
if ( not exists $DEP_CACHE->{$module} ) {
die "No mapping for $module";
}
my $reso = $DEP_CACHE->{$module}->version_satisfies($version);
if ( not defined $reso ) {
die "No version >= $version for $module (" . ( join q[, ], $DEP_CACHE->{$module}->versions ) . ')' . join qq[], @context;
}
return $reso;
}
sub dep_as_bash_lines {
my ( $self, $module, $version, $indent ) = @_;
$indent = '' if not defined $indent;
my @out;
my $root = $self->resolve_dependency( $module, $version );
push @out, $indent . 'has_version ' . $module . ' ' . $version . ' || (';
for my $child ( sort { int( rand 2 ) - 1 } keys %{ $root->{requires} || {} } ) {
local @context = ( "Resolving deps for $module $version", @context );
push @out, $self->dep_as_bash_lines( $child, $root->{requires}->{$child}, $indent . q[ ] );
}
push @out, $indent . q[ ] . 'cpan ' . $root->name;
push @out, $indent . ')';
return @out;
}
sub dep_as_bash {
my ( $self, $module, $version ) = @_;
return join qq[\n], $self->dep_as_bash_lines( $module, $version, '' ), '';
}
}
# vim: syntax=sh
cpan() {
perl -I. -Mbork_cpan -MCPAN -e 'install(@ARGV)' $@
return $?
}
cpan_force() {
perl -I. -Mbork_cpan -MCPAN -e 'force(install=>@ARGV)' $@
return $?
}
has_version() {
local ok;
if [ "$2" == "0" ]; then
perl -M$1 -e 1 2>/dev/null \
&& echo -e "\e[32m $1 $2 OK\e[0m" \
&& return;
fi
perl -M$1\ $2 -e 1 2>/dev/null \
&& echo -e "\e[32m $1 $2 OK\e[0m" \
&& return;
echo -e "\e[33m $1 v $2 Not installed\e[0m"
return 1
}
set -euo pipefail
has_version CPAN::Meta 0 || (
has_version ExtUtils::MakeMaker 6.31 || (
cpan MSCHWERN/ExtUtils-MakeMaker-6.32.tar.gz
)
has_version Scalar::Util 0 || (
cpan GBARR/Scalar-List-Utils-1.00.tar.gz
)
has_version File::Temp 0.20 || (
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan TJENNESS/File-Temp-0.20.tar.gz
)
has_version Storable 0 || (
cpan RAM/Storable-0.6.5.tar.gz
)
has_version Parse::CPAN::Meta 1.43 || (
has_version CPAN::Meta::YAML 0.002 || (
has_version Scalar::Util 1.08 || (
cpan GBARR/Scalar-List-Utils-1.08.tar.gz
)
has_version File::Temp 0 || (
cpan TJENNESS/File-Temp-0.13.tar.gz
)
has_version ExtUtils::MakeMaker 6.31 || (
cpan MSCHWERN/ExtUtils-MakeMaker-6.32.tar.gz
)
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan DAGOLDEN/CPAN-Meta-YAML-0.002.tar.gz
)
has_version Module::Load::Conditional 0.26 || (
has_version version 0.69 || (
has_version File::Temp 0.13 || (
cpan TJENNESS/File-Temp-0.13.tar.gz
)
has_version Test::More 0.45 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.50.tar.gz
)
cpan JPEACOCK/version-0.78.tar.gz
)
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
has_version Module::Load 0.11 || (
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan KANE/Module-Load-0.12.tar.gz
)
has_version Locale::Maketext::Simple 0 || (
cpan AUTRIJUS/Locale-Maketext-Simple-0.01.tar.gz
)
has_version Params::Check 0 || (
has_version Locale::Maketext::Simple 0 || (
cpan AUTRIJUS/Locale-Maketext-Simple-0.01.tar.gz
)
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan KANE/Params-Check-0.02.tar.gz
)
cpan KANE/Module-Load-Conditional-0.26.tar.gz
)
has_version JSON::PP 2.27103 || (
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
has_version JSON::PP::Compat5006 0 || (
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan MAKAMAKA/JSON-PP-Compat5006-1.09.tar.gz
)
cpan MAKAMAKA/JSON-PP-2.27103.tar.gz
)
has_version Test::More 0.47 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.50.tar.gz
)
cpan DAGOLDEN/Parse-CPAN-Meta-1.4400.tar.gz
)
has_version Test::More 0.96 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.96.tar.gz
)
has_version Carp 0 || (
has_version Exporter 0 || (
cpan FERREIRA/Exporter-5.59.tar.gz
)
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan ZEFRAM/Carp-1.22.tar.gz
)
has_version version 0.82 || (
has_version File::Temp 0.13 || (
cpan TJENNESS/File-Temp-0.13.tar.gz
)
has_version Test::More 0.45 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.50.tar.gz
)
cpan JPEACOCK/version-0.88.tar.gz
)
has_version Version::Requirements 0.101020 || (
has_version version 0.77 || (
has_version Test::More 0.45 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.50.tar.gz
)
has_version File::Temp 0.13 || (
cpan TJENNESS/File-Temp-0.13.tar.gz
)
cpan JPEACOCK/version-0.78.tar.gz
)
has_version Test::More 0.88 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.88.tar.gz
)
has_version Scalar::Util 0 || (
cpan GBARR/Scalar-List-Utils-1.00.tar.gz
)
has_version ExtUtils::MakeMaker 6.31 || (
cpan MSCHWERN/ExtUtils-MakeMaker-6.32.tar.gz
)
has_version Carp 0 || (
has_version Exporter 0 || (
cpan FERREIRA/Exporter-5.59.tar.gz
)
has_version Test::More 0 || (
has_version Test::Harness 2.03 || (
cpan MSCHWERN/Test-Harness-2.03.tar.gz
)
cpan MSCHWERN/Test-Simple-0.41.tar.gz
)
cpan ZEFRAM/Carp-1.22.tar.gz
)
cpan RJBS/Version-Requirements-0.101020.tar.gz
)
cpan DAGOLDEN/CPAN-Meta-2.110360.tar.gz
)
#end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment