]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Fix for Bug 527505: Make t/001compile.t work even after Bugzilla::Install::CPAN messe...
authormkanat%bugzilla.org <>
Wed, 18 Nov 2009 07:01:40 +0000 (07:01 +0000)
committermkanat%bugzilla.org <>
Wed, 18 Nov 2009 07:01:40 +0000 (07:01 +0000)
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat

Bugzilla.pm
Bugzilla/Install/Requirements.pm
mod_perl.pl [changed mode: 0644->0755]
t/001compile.t

index dc275b34f4b25db6ef2d5dff575618dad8660c2d..3c547b9800e132e9bc163ad3c7e1a3e0a8d2ba6b 100644 (file)
@@ -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;
 }
index 40ddf9cfe5353a595c1949d6a32d9c649f2b9c31..1fa53de9bcc50de25320895693cf8ffb81337a8d 100644 (file)
@@ -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
old mode 100644 (file)
new mode 100755 (executable)
index 1e5c7fc..8ca691f
@@ -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);
 }
index 4a2ea0eda05d20c70d1fce8b65749c75d44ea166..3e42734921a72207d2c939aa835daa86ab1e1818 100644 (file)
@@ -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;