diff options
-rw-r--r-- | Bugzilla/Install/Requirements.pm | 270 | ||||
-rwxr-xr-x | checksetup.pl | 161 |
2 files changed, 273 insertions, 158 deletions
diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm new file mode 100644 index 000000000..790739554 --- /dev/null +++ b/Bugzilla/Install/Requirements.pm @@ -0,0 +1,270 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org> + +package Bugzilla::Install::Requirements; + +# NOTE: This package MUST NOT "use" any Bugzilla modules other than +# Bugzilla::Constants, anywhere. We may "use" standard perl modules. +# +# Subroutines may "require" and "import" from modules, but they +# MUST NOT "use." + +use strict; + +use base qw(Exporter); +our @EXPORT = qw( + REQUIRED_MODULES + + vers_cmp + have_vers + install_command +); + +use Bugzilla::Constants; +use constant REQUIRED_MODULES => [ + { + name => 'AppConfig', + version => '1.52' + }, + { + name => 'CGI', + version => '2.93' + }, + { + name => 'Data::Dumper', + version => '0' + }, + { + name => 'Date::Format', + version => '2.21' + }, + { + name => 'DBI', + version => '1.38' + }, + { + name => 'File::Spec', + version => '0.84' + }, + { + name => 'File::Temp', + version => '0' + }, + { + name => 'Template', + version => '2.08' + }, + { + name => 'Text::Wrap', + version => '2001.0131' + }, + { + name => 'Mail::Mailer', + version => '1.67' + }, + { + name => 'MIME::Base64', + version => '3.01' + }, + { + # MIME::Parser is packaged as MIME::Tools on ActiveState Perl + name => $^O =~ /MSWin32/i ? 'MIME::Tools' : 'MIME::Parser', + version => '5.406' + }, + { + name => 'Storable', + version => '0' + }, +]; + +# Remember that you only have to add modules to this hash if their +# names are significantly different on ActiveState than on normal perl. +# If it's just a difference between "::" and "-" in the name, don't worry +# about it--install_command() handles that automatically. +use constant WIN32_MODULE_NAMES => { + 'Chart::Base' => 'Chart', + 'Date::Format' => 'TimeDate', + 'Template' => 'Template-Toolkit', + 'GD::Graph' => 'GDGraph', + 'GD::Text::Align' => 'GDTextUtil', + 'Mail::Mailer' => 'MailTools', +}; + +# This was originally clipped from the libnet Makefile.PL, adapted here to +# use the above vers_cmp routine for accurate version checking. +sub have_vers { + my ($pkg, $wanted) = @_; + my ($msg, $vnum, $vstr); + no strict 'refs'; + printf("Checking for %15s %-9s ", $pkg, !$wanted?'(any)':"(v$wanted)") + unless $::silent; + + # Modules may change $SIG{__DIE__} and $SIG{__WARN__}, so localise them here + # so that later errors display 'normally' + local $::SIG{__DIE__}; + local $::SIG{__WARN__}; + + eval "require $pkg;"; + + # do this twice to avoid a "used only once" error for these vars + $vnum = ${"${pkg}::VERSION"} || ${"${pkg}::Version"} || 0; + $vnum = ${"${pkg}::VERSION"} || ${"${pkg}::Version"} || 0; + $vnum = -1 if $@; + + # CGI's versioning scheme went 2.75, 2.751, 2.752, 2.753, 2.76 + # That breaks the standard version tests, so we need to manually correct + # the version + if ($pkg eq 'CGI' && $vnum =~ /(2\.7\d)(\d+)/) { + $vnum = $1 . "." . $2; + } + + if ($vnum eq "-1") { # string compare just in case it's non-numeric + $vstr = "not found"; + } + elsif (vers_cmp($vnum,"0") > -1) { + $vstr = "found v$vnum"; + } + else { + $vstr = "found unknown version"; + } + + my $vok = (vers_cmp($vnum,$wanted) > -1); + print ((($vok) ? "ok: " : " "), "$vstr\n") unless $::silent; + return $vok ? 1 : 0; +} + +# This is taken straight from Sort::Versions 1.5, which is not included +# with perl by default. +sub vers_cmp { + my @A = ($_[0] =~ /([-.]|\d+|[^-.\d]+)/g); + my @B = ($_[1] =~ /([-.]|\d+|[^-.\d]+)/g); + + my ($A, $B); + while (@A and @B) { + $A = shift @A; + $B = shift @B; + if ($A eq '-' and $B eq '-') { + next; + } elsif ( $A eq '-' ) { + return -1; + } elsif ( $B eq '-') { + return 1; + } elsif ($A eq '.' and $B eq '.') { + next; + } elsif ( $A eq '.' ) { + return -1; + } elsif ( $B eq '.' ) { + return 1; + } elsif ($A =~ /^\d+$/ and $B =~ /^\d+$/) { + if ($A =~ /^0/ || $B =~ /^0/) { + return $A cmp $B if $A cmp $B; + } else { + return $A <=> $B if $A <=> $B; + } + } else { + $A = uc $A; + $B = uc $B; + return $A cmp $B if $A cmp $B; + } + } + @A <=> @B; +} + +sub install_command { + my $module = shift; + if ($^O =~ /MSWin32/i) { + return "ppm install " . WIN32_MODULE_NAMES->{$module} if + WIN32_MODULE_NAMES->{$module}; + $module =~ s/::/-/g; + return "ppm install " . $module; + } else { + return "$^X -MCPAN -e 'install \"$module\"'"; + } +} + + +1; + +__END__ + +=head1 NAME + +Bugzilla::Install::Requirements - Functions and variables dealing + with Bugzilla's perl-module requirements. + +=head1 DESCRIPTION + +This module is used primarily by C<checksetup.pl> to determine whether +or not all of Bugzilla's prerequisites are installed. (That is, all the +perl modules it requires.) + +=head1 CONSTANTS + +=over 4 + +=item C<REQUIRED_MODULES> + +An arrayref of hashrefs that describes the perl modules required by +Bugzilla. The hashes have two keys, C<name> and C<version>, which +represent the name of the module and the version that we require. + +=back + +=head1 SUBROUTINES + +=over 4 + +=item C<vers_cmp($a, $b)> + + Description: This is a comparison function, like you would use in + C<sort>, except that it compares two version numbers. + It's actually identical to versioncmp from + L<Sort::Versions>. + + Params: c<$a> and C<$b> are versions you want to compare. + + Returns: -1 if $a is less than $b, 0 if they are equal, and + 1 if $a is greater than $b. + +=item C<have_vers($pkg, $wanted)> + + Description: Tells you whether or not you have the appropriate + version of the module requested. It also prints + out a message to the user explaining the check + and the result. + + Params: C<$pkg> - A string, the name of the package you're checking. + C<$wanted> - The version of the package you require. + Set this to 0 if you don't require any + particular version. + + Returns: C<1> if you have the module installed and you have the + appropriate version. C<0> otherwise. + + Notes: If you set C<$main::silent> to a true value, this function + won't print out anything. + +=item C<install_command($module)> + + Description: Prints out the appropriate command to install the + module specified, depending on whether you're + on Windows or Linux. + + Params: C<$module> - The name of the module. + + Returns: nothing + +=back diff --git a/checksetup.pl b/checksetup.pl index ba7e2e59a..9033666ee 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -208,170 +208,15 @@ printf "\n*** This is Bugzilla " . BUGZILLA_VERSION . " on perl %vd ***\n", $^V # Check required module ########################################################################### +use Bugzilla::Install::Requirements; + # # Here we check for --MODULES-- # print "\nChecking perl modules ...\n" unless $silent; -# vers_cmp is adapted from Sort::Versions 1.3 1996/07/11 13:37:00 kjahds, -# which is not included with Perl by default, hence the need to copy it here. -# Seems silly to require it when this is the only place we need it... -sub vers_cmp { - if (@_ < 2) { die "not enough parameters for vers_cmp" } - if (@_ > 2) { die "too many parameters for vers_cmp" } - my ($a, $b) = @_; - my (@A) = ($a =~ /(\.|\d+|[^\.\d]+)/g); - my (@B) = ($b =~ /(\.|\d+|[^\.\d]+)/g); - my ($A,$B); - while (@A and @B) { - $A = shift @A; - $B = shift @B; - if ($A eq "." and $B eq ".") { - next; - } elsif ( $A eq "." ) { - return -1; - } elsif ( $B eq "." ) { - return 1; - } elsif ($A =~ /^\d+$/ and $B =~ /^\d+$/) { - return $A <=> $B if $A <=> $B; - } else { - $A = uc $A; - $B = uc $B; - return $A cmp $B if $A cmp $B; - } - } - @A <=> @B; -} - -# This was originally clipped from the libnet Makefile.PL, adapted here to -# use the above vers_cmp routine for accurate version checking. -sub have_vers { - my ($pkg, $wanted) = @_; - my ($msg, $vnum, $vstr); - no strict 'refs'; - printf("Checking for %15s %-9s ", $pkg, !$wanted?'(any)':"(v$wanted)") unless $silent; - - # Modules may change $SIG{__DIE__} and $SIG{__WARN__}, so localise them here - # so that later errors display 'normally' - local $::SIG{__DIE__}; - local $::SIG{__WARN__}; - - eval "require $pkg;"; - - # do this twice to avoid a "used only once" error for these vars - $vnum = ${"${pkg}::VERSION"} || ${"${pkg}::Version"} || 0; - $vnum = ${"${pkg}::VERSION"} || ${"${pkg}::Version"} || 0; - $vnum = -1 if $@; - - # CGI's versioning scheme went 2.75, 2.751, 2.752, 2.753, 2.76 - # That breaks the standard version tests, so we need to manually correct - # the version - if ($pkg eq 'CGI' && $vnum =~ /(2\.7\d)(\d+)/) { - $vnum = $1 . "." . $2; - } - - if ($vnum eq "-1") { # string compare just in case it's non-numeric - $vstr = "not found"; - } - elsif (vers_cmp($vnum,"0") > -1) { - $vstr = "found v$vnum"; - } - else { - $vstr = "found unknown version"; - } - - my $vok = (vers_cmp($vnum,$wanted) > -1); - print ((($vok) ? "ok: " : " "), "$vstr\n") unless $silent; - return $vok; -} - -# Check versions of dependencies. 0 for version = any version acceptable -my $modules = [ - { - name => 'AppConfig', - version => '1.52' - }, - { - name => 'CGI', - version => '2.93' - }, - { - name => 'Data::Dumper', - version => '0' - }, - { - name => 'Date::Format', - version => '2.21' - }, - { - name => 'DBI', - version => '1.38' - }, - { - name => 'File::Spec', - version => '0.84' - }, - { - name => 'File::Temp', - version => '0' - }, - { - name => 'Template', - version => '2.08' - }, - { - name => 'Text::Wrap', - version => '2001.0131' - }, - { - name => 'Mail::Mailer', - version => '1.67' - }, - { - name => 'MIME::Base64', - version => '3.01' - }, - { - # MIME::Parser is packaged as MIME::Tools on ActiveState Perl - name => $^O =~ /MSWin32/i ? 'MIME::Tools' : 'MIME::Parser', - version => '5.406' - }, - { - name => 'Storable', - version => '0' - }, -]; - -my %ppm_modules = ( - 'AppConfig' => 'AppConfig', - 'Chart::Base' => 'Chart', - 'CGI' => 'CGI', - 'Data::Dumper' => 'Data-Dumper', - 'Date::Format' => 'TimeDate', - 'DBI' => 'DBI', - 'DBD::mysql' => 'DBD-mysql', - 'Template' => 'Template-Toolkit', - 'PatchReader' => 'PatchReader', - 'GD' => 'GD', - 'GD::Graph' => 'GDGraph', - 'GD::Text::Align' => 'GDTextUtil', - 'Mail::Mailer' => 'MailTools', - 'Mail::Base64' => 'MIME-Base64', - 'MIME::Tools' => 'MIME-Tools', - 'XML::Twig' => 'XML-Twig', - 'LWP::UserAgent' => 'LWP-UserAgent' -); - -sub install_command { - my $module = shift; - if ($^O =~ /MSWin32/i) { - return "ppm install " . $ppm_modules{$module} if exists $ppm_modules{$module}; - return "ppm install " . $module; - } else { - return "$^X -MCPAN -e 'install \"$module\"'"; - } -} +my $modules = REQUIRED_MODULES; $::root = ($^O =~ /MSWin32/i ? 'Administrator' : 'root'); |