diff options
author | mkanat%bugzilla.org <> | 2009-11-18 08:01:40 +0100 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2009-11-18 08:01:40 +0100 |
commit | bc19f61c0c33e71a00dcc8e4ca3e791a9e3b661d (patch) | |
tree | 4a6b0e7a7800545f9083fe70fed45e3c9c0d1edf | |
parent | 900f8b1d1eacf44dbfd8d9c8b414b472f492abe8 (diff) | |
download | bugzilla-bc19f61c0c33e71a00dcc8e4ca3e791a9e3b661d.tar.gz bugzilla-bc19f61c0c33e71a00dcc8e4ca3e791a9e3b661d.tar.xz |
Fix for Bug 527505: Make t/001compile.t work even after Bugzilla::Install::CPAN messes with @INC, and make Bugzilla->feature work during mod_perl.pl.
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
-rw-r--r-- | Bugzilla.pm | 6 | ||||
-rw-r--r-- | Bugzilla/Install/Requirements.pm | 70 | ||||
-rwxr-xr-x[-rw-r--r--] | mod_perl.pl | 9 | ||||
-rw-r--r-- | t/001compile.t | 40 |
4 files changed, 89 insertions, 36 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm index dc275b34f..3c547b980 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -555,7 +555,11 @@ sub local_timezone { sub request_cache { if ($ENV{MOD_PERL}) { require Apache2::RequestUtil; - return Apache2::RequestUtil->request->pnotes(); + # Sometimes (for example, during mod_perl.pl), the request + # object isn't available, and we should use $_request_cache instead. + my $request = eval { Apache2::RequestUtil->request }; + return $_request_cache if !$request; + return $request->pnotes(); } return $_request_cache; } diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm index 40ddf9cfe..1fa53de9b 100644 --- a/Bugzilla/Install/Requirements.pm +++ b/Bugzilla/Install/Requirements.pm @@ -35,11 +35,13 @@ use base qw(Exporter); our @EXPORT = qw( REQUIRED_MODULES OPTIONAL_MODULES + FEATURE_FILES check_requirements check_graphviz have_vers install_command + map_files_to_features ); # This is how many *'s are in the top of each "box" message printed @@ -294,6 +296,22 @@ sub OPTIONAL_MODULES { return $all_modules; }; +# This maps features to the files that require that feature in order +# to compile. It is used by t/001compile.t and mod_perl.pl. +use constant FEATURE_FILES => ( + jsonrpc => ['Bugzilla/WebService/Server/JSONRPC.pm', 'jsonrpc.cgi'], + xmlrpc => ['Bugzilla/WebService/Server/XMLRPC.pm', 'xmlrpc.cgi', + 'Bugzilla/WebService.pm', 'Bugzilla/WebService/*.pm'], + moving => ['importxml.pl'], + auth_ldap => ['Bugzilla/Auth/Verify/LDAP.pm'], + auth_radius => ['Bugzilla/Auth/Verify/RADIUS.pm'], + inbound_email => ['email_in.pl'], + jobqueue => ['Bugzilla/Job/*', 'Bugzilla/JobQueue.pm', + 'Bugzilla/JobQueue/*', 'jobqueue.pl'], + patch_viewer => ['Bugzilla/Attachment/PatchReader.pm'], + updates => ['Bugzilla/Update.pm'], +); + # This implements the install-requirements hook described in Bugzilla::Hook. sub _get_extension_requirements { my ($function, $base_modules) = @_; @@ -590,6 +608,21 @@ sub install_command { return sprintf $command, $package; } +# This does a reverse mapping for FEATURE_FILES. +sub map_files_to_features { + my %features = FEATURE_FILES; + my %files; + foreach my $feature (keys %features) { + my @my_files = @{ $features{$feature} }; + foreach my $pattern (@my_files) { + foreach my $file (glob $pattern) { + $files{$file} = $feature; + } + } + } + return \%files; +} + 1; __END__ @@ -607,16 +640,42 @@ perl modules it requires.) =head1 CONSTANTS -=over 4 +=over =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. +Bugzilla. The hashes have three keys: + +=over + +=item C<package> - The name of the Perl package that you'd find on +CPAN for this requirement. + +=item C<module> - The name of a module that can be passed to the +C<install> command in C<CPAN.pm> to install this module. + +=item C<version> - The version of this module that we require, or C<0> +if any version is acceptable. =back +=item C<OPTIONAL_MODULES> + +An arrayref of hashrefs that describes the perl modules that add +additional features to Bugzilla if installed. Its hashes have all +the fields of L</REQUIRED_MODULES>, plus a C<feature> item--an arrayref +of strings that describe what features require this module. + +=item C<FEATURE_FILES> + +A hashref that describes what files should only be compiled if a certain +feature is enabled. The feature is the key, and the values are arrayrefs +of file names (which are passed to C<glob>, so shell patterns work). + +=back + + =head1 SUBROUTINES =over 4 @@ -699,4 +758,9 @@ Returns: C<1> if the check was successful, C<0> otherwise. Returns: nothing +=item C<map_files_to_features> + +Returns a hashref where file names are the keys and the value is the feature +that must be enabled in order to compile that file. + =back diff --git a/mod_perl.pl b/mod_perl.pl index 1e5c7fc63..8ca691f9c 100644..100755 --- a/mod_perl.pl +++ b/mod_perl.pl @@ -34,12 +34,14 @@ use ModPerl::RegistryLoader (); use CGI (); CGI->compile(qw(:cgi -no_xhtml -oldstyle_urls :private_tempfiles :unique_headers SERVER_PUSH :push)); +use File::Basename (); use Template::Config (); Template::Config->preload(); use Bugzilla (); use Bugzilla::Constants (); use Bugzilla::CGI (); +use Bugzilla::Install::Requirements (); use Bugzilla::Mailer (); use Bugzilla::Template (); use Bugzilla::Util (); @@ -75,9 +77,12 @@ my $rl = new ModPerl::RegistryLoader(); # If we try to do this in "new" it fails because it looks for a # Bugzilla/ModPerl/ResponseHandler.pm $rl->{package} = 'Bugzilla::ModPerl::ResponseHandler'; -# Note that $cgi_path will be wrong if somebody puts the libraries -# in a different place than the CGIs. +my $feature_files = Bugzilla::Install::Requirements::map_files_to_features(); foreach my $file (glob "$cgi_path/*.cgi") { + my $base_filename = File::Basename::basename($file); + if (my $feature = $feature_files->{$base_filename}) { + next if !Bugzilla->feature($feature); + } Bugzilla::Util::trick_taint($file); $rl->handler($file, $file); } diff --git a/t/001compile.t b/t/001compile.t index 4a2ea0eda..3e4273492 100644 --- a/t/001compile.t +++ b/t/001compile.t @@ -32,40 +32,18 @@ use Test::More tests => scalar(@Support::Files::testitems); BEGIN { use_ok('Bugzilla::Constants'); + use_ok('Bugzilla::Install::Requirements'); use_ok('Bugzilla'); } -use constant FEATURE_FILES => ( - jsonrpc => ['Bugzilla/WebService/Server/JSONRPC.pm', 'jsonrpc.cgi'], - xmlrpc => ['Bugzilla/WebService/Server/XMLRPC.pm', 'xmlrpc.cgi', - 'Bugzilla/WebService.pm', 'Bugzilla/WebService/*.pm'], - moving => ['importxml.pl'], - auth_ldap => ['Bugzilla/Auth/Verify/LDAP.pm'], - auth_radius => ['Bugzilla/Auth/Verify/RADIUS.pm'], - inbound_email => ['email_in.pl'], - jobqueue => ['Bugzilla/Job/*', 'Bugzilla/JobQueue.pm', - 'Bugzilla/JobQueue/*', 'jobqueue.pl'], - patch_viewer => ['Bugzilla/Attachment/PatchReader.pm'], - updates => ['Bugzilla/Update.pm'], -); - -sub map_files_to_feature { - my %features = FEATURE_FILES; - my %files; - foreach my $feature (keys %features) { - my @my_files = @{ $features{$feature} }; - foreach my $pattern (@my_files) { - foreach my $file (glob $pattern) { - $files{$file} = $feature; - } - } - } - return \%files; -} - sub compile_file { my ($file) = @_; + # Don't allow CPAN.pm to modify the global @INC, which the version + # shipped with Perl 5.8.8 does. (It gets loaded by + # Bugzilla::Install::CPAN.) + local @INC = @INC; + if ($file =~ s/\.pm$//) { $file =~ s{/}{::}g; use_ok($file); @@ -91,12 +69,14 @@ sub compile_file { } my @testitems = @Support::Files::testitems; -my $file_features = map_files_to_feature(); +my $file_features = map_files_to_features(); # Test the scripts by compiling them foreach my $file (@testitems) { # These were already compiled, above. - next if ($file eq 'Bugzilla.pm' or $file eq 'Bugzilla/Constants.pm'); + next if ($file eq 'Bugzilla.pm' + or $file eq 'Bugzilla/Constants.pm' + or $file eq 'Bugzilla/Install/Requirements.pm'); SKIP: { if ($file eq 'mod_perl.pl') { skip 'mod_perl.pl cannot be compiled from the command line', 1; |