summaryrefslogtreecommitdiffstats
path: root/install-module.pl
diff options
context:
space:
mode:
authormkanat%bugzilla.org <>2007-10-24 02:33:30 +0200
committermkanat%bugzilla.org <>2007-10-24 02:33:30 +0200
commit212433f27ac422f79924d03b5d047236f6cdd308 (patch)
tree75f2acf6063b8fcc8b6739a0201a1447de778f6d /install-module.pl
parent9f8e0ce687bfc85339fc6c9ae3728e03527963b3 (diff)
downloadbugzilla-212433f27ac422f79924d03b5d047236f6cdd308.tar.gz
bugzilla-212433f27ac422f79924d03b5d047236f6cdd308.tar.xz
Bug 262269: A tool to auto-install missing perl packages on non-Windows systems
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner)
Diffstat (limited to 'install-module.pl')
-rw-r--r--install-module.pl157
1 files changed, 157 insertions, 0 deletions
diff --git a/install-module.pl b/install-module.pl
new file mode 100644
index 000000000..eb9ae38e4
--- /dev/null
+++ b/install-module.pl
@@ -0,0 +1,157 @@
+#!/usr/bin/perl -w
+# -*- 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.
+#
+# The Initial Developer of the Original Code is Everything Solved, Inc.
+# Portions created by Everything Solved are Copyright (C) 2007
+# Everything Solved, Inc. All Rights Reserved.
+#
+# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+
+use strict;
+use warnings;
+
+# Have to abs_path('.') or calls to Bugzilla modules won't work once
+# 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 lib abs_path('.');
+use Bugzilla::Constants;
+use lib abs_path(bz_locations()->{ext_libpath});
+
+use Bugzilla::Install::CPAN;
+
+use Bugzilla::Constants;
+use Bugzilla::Install::Requirements;
+
+use Data::Dumper;
+use Getopt::Long;
+use Pod::Usage;
+
+our %switch;
+
+GetOptions(\%switch, 'all|a', 'upgrade-all|u', 'show-config|s', 'global|g',
+ 'help|h');
+
+pod2usage({ -verbose => 1 }) if $switch{'help'};
+pod2usage({ -verbose => 0 }) if (!%switch && !@ARGV);
+
+set_cpan_config($switch{'global'});
+
+if ($switch{'show-config'}) {
+ print Dumper($CPAN::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";
+}
+
+if ($switch{'all'} || $switch{'upgrade-all'}) {
+ my @modules;
+ if ($switch{'upgrade-all'}) {
+ @modules = (@{REQUIRED_MODULES()}, @{OPTIONAL_MODULES()});
+ push(@modules, DB_MODULE->{$_}->{dbd}) foreach (keys %{DB_MODULE()});
+ }
+ else {
+ # This is the only time we need a Bugzilla-related module, so
+ # we require them down here. Otherwise this script can be run from
+ # any directory, even outside of Bugzilla itself.
+ my $reqs = check_requirements(0);
+ @modules = (@{$reqs->{missing}}, @{$reqs->{optional}});
+ my $dbs = DB_MODULE;
+ foreach my $db (keys %$dbs) {
+ push(@modules, $dbs->{$db}->{dbd})
+ if !have_vers($dbs->{$db}->{dbd}, 0);
+ }
+ }
+ foreach my $module (@modules) {
+ my $cpan_name = $module->{module};
+ # --all shouldn't include mod_perl2, because it can have some complex
+ # configuration, and really should be installed on its own.
+ next if $cpan_name eq 'mod_perl2';
+ install_module($cpan_name, $can_notest);
+ }
+ my $dbs = DB_MODULE;
+ foreach my $db (keys %$dbs) {
+ install_module($dbs->{$db}->{dbd}->{module}, $can_notest)
+ unless have_vers($dbs->{$db}->{dbd}, 0);
+ }
+}
+
+foreach my $module (@ARGV) {
+ install_module($module, $can_notest);
+}
+
+__END__
+
+=head1 NAME
+
+install-module.pl - Installs or upgrades modules from CPAN
+
+=head1 SYNOPSIS
+
+ ./install-module.pl Module::Name [--global]
+ ./install-module.pl --all [--global]
+ ./install-module.pl --all-upgrade [--global]
+ ./install-module.pl --show-config
+
+ Do "./install-module.pl --help" for more information.
+
+=head1 OPTIONS
+
+=over
+
+=item B<Module::Name>
+
+The name of a module that you want to install from CPAN. This is the
+same thing that you'd give to the C<install> command in the CPAN shell.
+
+You can specify multiple module names separated by a space to install
+multiple modules.
+
+=item B<--global>
+
+This makes install-module install modules globally for all applications,
+instead of just for Bugzilla.
+
+On most systems, you have to be root for C<--global> to work.
+
+=item B<--all>
+
+This will make install-module do its best to install every required
+and optional module that is not installed that Bugzilla can use.
+
+Some modules may fail to install. You can run checksetup.pl to see
+which installed properly.
+
+=item B<--upgrade-all>
+
+This is like C<--all>, except it forcibly installs the very latest
+version of every Bugzilla prerequisite, whether or not you already
+have them installed.
+
+=item B<--show-config>
+
+Prints out the CPAN configuration in raw Perl format. Useful for debugging.
+
+=item B<--help>
+
+Shows this help.
+
+=back