From: Max Kanat-Alexander Date: Tue, 20 Apr 2010 22:03:29 +0000 (-0700) Subject: Bug 560330: Make sure that we always have a modern version of CPAN X-Git-Tag: bugzilla-3.6.1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf75397cdcedda0dd102a4d3ac994a6cde6c88b7;p=thirdparty%2Fbugzilla.git Bug 560330: Make sure that we always have a modern version of CPAN installed when running install-module.pl. Otherwise, certain modules (like DateTime) weren't getting their XS compiled or their dependencies installed with Perl 5.8.8 and earlier. This also updates the urllist to remove perl.secsup.org (which was hanging when used with curl) and add a few more mirrors (including some in Europe). r=mkanat, a=mkanat (module owner) --- diff --git a/Bugzilla/Install/CPAN.pm b/Bugzilla/Install/CPAN.pm index a3f83564b9..f7828c49e2 100644 --- a/Bugzilla/Install/CPAN.pm +++ b/Bugzilla/Install/CPAN.pm @@ -21,9 +21,16 @@ package Bugzilla::Install::CPAN; use strict; use base qw(Exporter); -our @EXPORT = qw(set_cpan_config install_module BZ_LIB); +our @EXPORT = qw( + BZ_LIB + + check_cpan_requirements + set_cpan_config + install_module +); use Bugzilla::Constants; +use Bugzilla::Install::Requirements qw(have_vers); use Bugzilla::Install::Util qw(bin_loc install_string); use CPAN; @@ -31,6 +38,24 @@ use Cwd qw(abs_path); use File::Path qw(rmtree); use List::Util qw(shuffle); +# These are required for install-module.pl to be able to install +# all modules properly. +use constant REQUIREMENTS => ( + { + module => 'CPAN', + package => 'CPAN', + version => '1.81', + }, + { + # When Module::Build isn't installed, the YAML module allows + # CPAN to read META.yml to determine that Module::Build first + # needs to be installed to compile a module. + module => 'YAML', + package => 'YAML', + version => 0, + }, +); + # We need the absolute path of ext_libpath, because CPAN chdirs around # and so we can't use a relative directory. # @@ -46,6 +71,7 @@ use constant CPAN_DEFAULTS => { auto_commit => 0, # We always force builds, so there's no reason to cache them. build_cache => 0, + build_requires_install_policy => 'yes', cache_metadata => 1, index_expire => 1, scan_cache => 'atstart', @@ -53,6 +79,7 @@ use constant CPAN_DEFAULTS => { inhibit_startup_message => 1, mbuild_install_build_command => './Build', + bzip2 => bin_loc('bzip2'), curl => bin_loc('curl'), gzip => bin_loc('gzip'), links => bin_loc('links'), @@ -66,13 +93,37 @@ use constant CPAN_DEFAULTS => { urllist => [shuffle qw( http://cpan.pair.com/ http://mirror.hiwaay.net/CPAN/ + http://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN/ ftp://ftp.dc.aleron.net/pub/CPAN/ - http://perl.secsup.org/ - http://mirrors.kernel.org/cpan/)], + http://mirrors.kernel.org/cpan/ + http://mirrors2.kernel.org/cpan/)], }; +sub check_cpan_requirements { + my ($original_dir, $original_args) = @_; + + my @install; + foreach my $module (REQUIREMENTS) { + my $installed = have_vers($module, 1); + push(@install, $module) if !$installed; + } + + return if !@install; + + my $restart_required; + foreach my $module (@install) { + $restart_required = 1 if $module->{module} eq 'CPAN'; + install_module($module->{module}, 1); + } + + if ($restart_required) { + chdir $original_dir; + exec($^X, $0, @$original_args); + } +} + sub install_module { - my ($name, $notest) = @_; + my ($name, $test) = @_; my $bzlib = BZ_LIB; # Certain modules require special stuff in order to not prompt us. @@ -95,11 +146,11 @@ sub install_module { my $module = CPAN::Shell->expand('Module', $name); print install_string('install_module', { module => $name, version => $module->cpan_version }) . "\n"; - if ($notest) { - CPAN::Shell->notest('install', $name); + if ($test) { + CPAN::Shell->force('install', $name); } else { - CPAN::Shell->force('install', $name); + CPAN::Shell->notest('install', $name); } # If it installed any binaries in the Bugzilla directory, delete them. @@ -218,7 +269,7 @@ Bugzilla::Install::CPAN - Routines to install Perl modules from CPAN. use Bugzilla::Install::CPAN; set_cpan_config(); - install_module('Module::Name', 1); + install_module('Module::Name'); =head1 DESCRIPTION @@ -245,8 +296,9 @@ Installs a module from CPAN. Takes two arguments: =item C<$name> - The name of the module, just like you'd pass to the C command in the CPAN shell. -=item C<$notest> - If true, we skip running tests on this module. This -can greatly speed up the installation time. +=item C<$test> - If true, we run tests on this module before installing, +but we still force the install if the tests fail. This is only used +when we internally install a newer CPAN module. =back diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm index dfdeafb70a..6223c95435 100644 --- a/Bugzilla/Install/Requirements.pm +++ b/Bugzilla/Install/Requirements.pm @@ -549,6 +549,10 @@ sub have_vers { if ($module eq 'CGI' && $vnum =~ /(2\.7\d)(\d+)/) { $vnum = $1 . "." . $2; } + # CPAN did a similar thing, where it has versions like 1.9304. + if ($module eq 'CPAN' and $vnum =~ /^(\d\.\d{2})\d{2}$/) { + $vnum = $1; + } my $vstr; if ($vnum eq "-1") { # string compare just in case it's non-numeric diff --git a/install-module.pl b/install-module.pl index bfee113b75..ee36117913 100755 --- a/install-module.pl +++ b/install-module.pl @@ -26,7 +26,7 @@ use warnings; # CPAN has chdir'ed around. We do all of this in this funny order to # make sure that we use the lib/ modules instead of the base Perl modules, # in case the lib/ modules are newer. -use Cwd qw(abs_path); +use Cwd qw(abs_path cwd); use lib abs_path('.'); use Bugzilla::Constants; use lib abs_path(bz_locations()->{ext_libpath}); @@ -35,14 +35,17 @@ use Bugzilla::Install::CPAN; use Bugzilla::Constants; use Bugzilla::Install::Requirements; -use Bugzilla::Install::Util qw(bin_loc); +use Bugzilla::Install::Util qw(bin_loc init_console vers_cmp); use Data::Dumper; use Getopt::Long; use Pod::Usage; -our %switch; +init_console(); +my @original_args = @ARGV; +my $original_dir = cwd(); +our %switch; GetOptions(\%switch, 'all|a', 'upgrade-all|u', 'show-config|s', 'global|g', 'shell', 'help|h'); @@ -63,12 +66,7 @@ if ($switch{'show-config'}) { exit; } -my $can_notest = 1; -if (substr(CPAN->VERSION, 0, 3) < 1.8) { - $can_notest = 0; - print "* Note: If you upgrade your CPAN module, installs will be faster.\n"; - print "* You can upgrade CPAN by doing: $^X install-module.pl CPAN\n"; -} +check_cpan_requirements($original_dir, \@original_args); if ($switch{'shell'}) { CPAN::shell(); @@ -100,12 +98,12 @@ if ($switch{'all'} || $switch{'upgrade-all'}) { next if $cpan_name eq 'mod_perl2'; next if $cpan_name eq 'DBD::Oracle' and !$ENV{ORACLE_HOME}; next if $cpan_name eq 'DBD::Pg' and !bin_loc('pg_config'); - install_module($cpan_name, $can_notest); + install_module($cpan_name); } } foreach my $module (@ARGV) { - install_module($module, $can_notest); + install_module($module); } __END__