]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 281494: Create Bugzilla::Install::Requirements for requirements-checking subrouti...
authormkanat%bugzilla.org <>
Fri, 14 Jul 2006 04:50:08 +0000 (04:50 +0000)
committermkanat%bugzilla.org <>
Fri, 14 Jul 2006 04:50:08 +0000 (04:50 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=colin, r=wicked, a=myk

Bugzilla/Install/Requirements.pm [new file with mode: 0644]
checksetup.pl

diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm
new file mode 100644 (file)
index 0000000..7907395
--- /dev/null
@@ -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
index ba7e2e59af987dbcd4f9b287ca3d5e5fb48f60ee..9033666ee6b270431085ed3f21c98e064462ca01 100755 (executable)
@@ -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');