Created
July 23, 2015 11:14
-
-
Save kentfredric/6909949e7fdc91dd47e6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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, '' ), ''; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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