2 # BEGIN BPS TAGGED BLOCK {{{
6 # This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
7 # <jesse@bestpractical.com>
9 # (Except where explicitly superseded by other copyright notices)
14 # This work is made available to you under the terms of Version 2 of
15 # the GNU General Public License. A copy of that license should have
16 # been provided with this software, but in any event can be snarfed
19 # This work is distributed in the hope that it will be useful, but
20 # WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 # General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with this program; if not, write to the Free Software
26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
27 # 02110-1301 or visit their web page on the internet at
28 # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
31 # CONTRIBUTION SUBMISSION POLICY:
33 # (The following paragraph is not intended to limit the rights granted
34 # to you to modify and distribute this software under the terms of
35 # the GNU General Public License and is only of importance to you if
36 # you choose to contribute your changes and enhancements to the
37 # community by submitting them to Best Practical Solutions, LLC.)
39 # By intentionally submitting any modifications, corrections or
40 # derivatives to this work, or any other work intended for use with
41 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
42 # you are the copyright holder for those contributions and you grant
43 # Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
44 # royalty-free, perpetual, license to use, copy, create derivative
45 # works based on those contributions, and sublicense and distribute
46 # those contributions and any derivatives thereof.
48 # END BPS TAGGED BLOCK }}}
50 # This is just a basic script that checks to make sure that all
51 # the modules needed by RT before you can install it.
55 no warnings qw(numeric redefine);
61 'install', 'with-MYSQL',
62 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE',
63 'with-ORACLE', 'with-FASTCGI', 'with-FASTCGI-SERVER',
64 'with-SPEEDYCGI', 'with-MODPERL1',
65 'with-MODPERL2', 'with-DEV',
91 'with-DEV' => @RT_DEVEL_MODE@,
92 'with-STANDALONE' => 1,
93 'with-GPG' => @RT_GPG@,
96 'with-GRAPHVIZ' => @RT_GRAPHVIZ@,
98 'with-DASHBOARDS' => 1
100 $args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default;
104 my %always_show_sections = (
112 print "$s:\n" unless $args{'list-deps'};
120 unless ( $args{'list-deps'} ) {
121 if ( $args{'v'} or not $test or $always_show_sections{$section} ) {
123 print $test ? "found" : "MISSING";
127 print "\t\t$extra\n" if defined $extra;
133 my %missing_by_type = @_;
135 unless ( $args{'list-deps'} ) {
136 unless ( keys %missing_by_type ) {
137 print "\nAll dependencies have been found.\n";
141 print "\nSOME DEPENDENCIES WERE MISSING.\n";
143 for my $type ( keys %missing_by_type ) {
144 my $missing = $missing_by_type{$type};
146 print "$type missing dependencies:\n";
147 for my $name ( keys %$missing ) {
148 my $module = $missing->{$name};
149 my $version = $module->{version};
150 my $error = $module->{error};
151 print_found( $name . ( $version && !$error ? " >= $version" : "" ),
152 0, $module->{error} );
164 By default, testdeps determine whether you have
165 installed all the perl modules RT needs to run.
167 --install Install missing modules
169 The following switches will tell the tool to check for specific dependencies
171 --with-mysql Database interface for MySQL
172 --with-postgresql Database interface for PostgreSQL
173 --with-oracle Database interface for Oracle
174 --with-sqlite Database interface and driver for SQLite (unsupported)
176 --with-standalone Libraries needed to support the standalone simple pure perl server
177 --with-fastcgi-server Libraries needed to support the external fastcgi server
178 --with-fastcgi Libraries needed to support the fastcgi handler
179 --with-speedycgi Libraries needed to support the speedycgi handler
180 --with-modperl1 Libraries needed to support the modperl 1 handler
181 --with-modperl2 Libraries needed to support the modperl 2 handler
183 --with-dev Tools needed for RT development
185 You can also specify -v or --verbose to list the status of all dependencies,
186 rather than just the missing ones.
188 The "RT_FIX_DEPS_CMD" environment variable, if set, will be used
189 instead of the standard CPAN shell by --install to install any
190 required modules. It will be called with the module name, or, if
191 "RT_FIX_DEPS_CMD" contains a "%s", will replace the "%s" with the
192 module name before calling the program.
199 for my $line ( split /\n/, $_[0] ) {
200 my($key, $value) = $line =~ /(\S+)\s*(\S*)/;
202 $hash{$key} = $value;
208 $deps{'CORE'} = [ text_to_hash( << '.') ];
212 Class::ReturnValue 0.40
213 DBIx::SearchBuilder 1.54
221 Locale::Maketext 1.06
222 Locale::Maketext::Lexicon 0.32
223 Locale::Maketext::Fuzzy
236 Module::Versions::Report 1.05
237 Cache::Simple::TimedExpiry
242 Devel::StackTrace 1.19
245 $deps{'MASON'} = [ text_to_hash( << '.') ];
253 Text::WikiFormat 0.76
255 Devel::StackTrace 1.19
258 $deps{'STANDALONE'} = [ text_to_hash( << '.') ];
259 HTTP::Server::Simple 0.34
260 HTTP::Server::Simple::Mason 0.09
264 $deps{'MAILGATE'} = [ text_to_hash( << '.') ];
272 $deps{'CLI'} = [ text_to_hash( << '.') ];
275 HTTP::Request::Common
281 $deps{'DEV'} = [ text_to_hash( << '.') ];
285 Test::WWW::Mechanize 1.04
290 Test::Deep 0 # needed for shredder tests
291 String::ShellQuote 0 # needed for gnupg-incoming.t
292 Test::HTTP::Server::Simple 0.09
293 Test::HTTP::Server::Simple::StashWarnings 0.02
296 Test::Builder 0.77 # needed to fix TODO test
299 HTTP::Server::Simple::Mason 0.13
303 $deps{'FASTCGI'} = [ text_to_hash( << '.') ];
309 $deps{'FASTCGI-SERVER'} = [ text_to_hash( << '.') ];
319 $deps{'SPEEDYCGI'} = [ text_to_hash( << '.') ];
325 $deps{'MODPERL1'} = [ text_to_hash( << '.') ];
331 $deps{'MODPERL2'} = [ text_to_hash( << '.') ];
337 $deps{'MYSQL'} = [ text_to_hash( << '.') ];
341 $deps{'ORACLE'} = [ text_to_hash( << '.') ];
345 $deps{'POSTGRESQL'} = [ text_to_hash( << '.') ];
349 $deps{'SQLITE'} = [ text_to_hash( << '.') ];
353 $deps{'GPG'} = [ text_to_hash( << '.') ];
358 $deps{'ICAL'} = [ text_to_hash( << '.') ];
362 $deps{'SMTP'} = [ text_to_hash( << '.') ];
366 $deps{'DASHBOARDS'} = [ text_to_hash( << '.') ];
367 HTML::RewriteAttributes 0.02
371 $deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ];
374 IPC::Run::SafeHandles
377 $deps{'GD'} = [ text_to_hash( << '.') ];
384 'DBD::Oracle' => [qw(1.23)],
387 if ($args{'download'}) {
392 check_perl_version();
396 my %Missing_By_Type = ();
397 foreach my $type (sort grep $args{$_}, keys %args) {
398 next unless ($type =~ /^with-(.*?)$/);
401 section("$type dependencies");
404 my @deps = @{ $deps{$type} };
406 my %missing = test_deps(@deps);
408 if ( $args{'install'} ) {
409 for my $module (keys %missing) {
410 resolve_dep($module, $missing{$module}{version});
411 delete $missing{$module}
412 if test_dep($module, $missing{$module}{version}, $AVOID{$module});
416 $Missing_By_Type{$type} = \%missing if keys %missing;
419 conclude(%Missing_By_Type);
426 my $module = shift @deps;
427 my $version = shift @deps;
428 my($test, $error) = test_dep($module, $version, $AVOID{$module});
429 my $msg = $module . ($version && !$error ? " >= $version" : '');
430 print_found($msg, $test, $error);
432 $missing{$module} = { version => $version, error => $error } unless $test;
443 if ( $args{'list-deps'} ) {
444 print $module, ': ', $version || 0, "\n";
447 eval "use $module $version ()";
448 if ( my $error = $@ ) {
449 return 0 unless wantarray;
451 $error =~ s/\n(.*)$//s;
452 $error =~ s/at \(eval \d+\) line \d+\.$//;
453 undef $error if $error =~ /this is only/;
455 return ( 0, $error );
459 my $version = $module->VERSION;
460 if ( grep $version eq $_, @$avoid ) {
461 return 0 unless wantarray;
462 return (0, "It's known that there are problems with RT and version '$version' of '$module' module. If it's the latest available version of the module then you have to downgrade manually.");
474 print "\nInstall module $module\n";
476 my $ext = $ENV{'RT_FIX_DEPS_CMD'};
481 if ( $ENV{'HOME'} ) {
482 unshift @INC, "$ENV{'HOME'}/.cpan";
484 $configured = eval { require CPAN::MyConfig } || eval { require CPAN::Config };
486 unless ( $configured ) {
488 You haven't configured the CPAN shell yet.
489 Please run `@PERL@ -MCPAN -e shell` to configure it.
493 my $rv = eval { require CPAN; CPAN::Shell->install($module) };
494 return $rv unless $@;
497 Failed to load module CPAN.
499 -------- Error ---------
501 ------------------------
503 When we tried to start installing RT's perl dependencies,
504 we were unable to load the CPAN client. This module is usually distributed
505 with Perl. This usually indicates that your vendor has shipped an unconfigured
506 or incorrectly configured CPAN client.
507 The error above may (or may not) give you a hint about what went wrong
509 You have several choices about how to install dependencies in
512 1) use a different tool to install dependencies by running setting the following
513 shell environment variable and rerunning this tool:
514 RT_FIX_DEPS_CMD='@PERL@ -MCPAN -e"install %s"'
515 2) Attempt to configure CPAN by running:
516 `@PERL@ -MCPAN -e shell` program from shell.
517 If this fails, you may have to manually upgrade CPAN (see below)
518 3) Try to update the CPAN client. Download it from:
519 http://search.cpan.org/dist/CPAN and try again
520 4) Install each dependency manually by downloading them one by one from
521 http://search.cpan.org
528 $ext =~ s/\%s/$module/g; # sprintf( $ext, $module );
532 print "\t\tcommand: '$ext'\n";
533 return scalar `$ext 1>&2`;
540 foreach my $key (keys %deps) {
541 my @deps = (@{$deps{$key}});
543 my $mod = shift @deps;
544 my $ver = shift @deps;
545 next if ($mod =~ /^(DBD-|Apache-Request)/);
546 $modules{$mod} = $ver;
549 my @mods = keys %modules;
551 my $moddir = $args{'download'};
552 foreach my $mod (@mods) {
553 $CPAN::Config->{'build_dir'} = $moddir;
557 opendir(DIR, $moddir);
558 while ( my $dir = readdir(DIR)) {
559 print "Dir is $dir\n";
560 next if ( $dir =~ /^\.\.?$/);
562 # Skip things we've previously tagged
563 my $out = `svn ls $args{'repository'}/tags/$dir`;
566 if ($dir =~ /^(.*)-(.*?)$/) {
567 `svn_load_dirs -no_user_input -t tags/$dir -v $args{'repository'} dists/$1 $moddir/$dir`;
568 `rm -rf $moddir/$dir`;
577 sub check_perl_version {
579 eval {require 5.008003};
581 print_found("5.8.3", 0,"RT is known to be non-functional on versions of perl older than 5.8.3. Please upgrade to 5.8.3 or newer.");
584 print_found( sprintf(">=5.8.3(%vd)", $^V), 1 );
590 print_found("rt group (@RTGROUP@)", defined getgrnam("@RTGROUP@"));
591 print_found("bin owner (@BIN_OWNER@)", defined getpwnam("@BIN_OWNER@"));
592 print_found("libs owner (@LIBS_OWNER@)", defined getpwnam("@LIBS_OWNER@"));
593 print_found("libs group (@LIBS_GROUP@)", defined getgrnam("@LIBS_GROUP@"));
594 print_found("web owner (@WEB_USER@)", defined getpwnam("@WEB_USER@"));
595 print_found("web group (@WEB_GROUP@)", defined getgrnam("@WEB_GROUP@"));