]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 509053: Implement Bugzilla->feature (feature_enabled in the templates), and use...
authormkanat%bugzilla.org <>
Wed, 30 Sep 2009 22:39:28 +0000 (22:39 +0000)
committermkanat%bugzilla.org <>
Wed, 30 Sep 2009 22:39:28 +0000 (22:39 +0000)
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=LpSolit

Bugzilla.pm
Bugzilla/Template.pm
attachment.cgi
post_bug.cgi
process_bug.cgi
show_bug.cgi
template/en/default/attachment/edit.html.tmpl
template/en/default/attachment/list.html.tmpl
template/en/default/global/code-error.html.tmpl

index 671cda38d1a0d9116e1c240ab886b7abf293567d..43a9b39ae9492600225e21ad9312ff3100ac0043 100644 (file)
@@ -42,6 +42,7 @@ use Bugzilla::Auth::Persist::Cookie;
 use Bugzilla::CGI;
 use Bugzilla::DB;
 use Bugzilla::Install::Localconfig qw(read_localconfig);
+use Bugzilla::Install::Requirements qw(OPTIONAL_MODULES);
 use Bugzilla::JobQueue;
 use Bugzilla::Template;
 use Bugzilla::User;
@@ -187,6 +188,40 @@ sub template_inner {
     return $class->request_cache->{"template_inner_$lang"};
 }
 
+sub feature {
+    my ($class, $feature) = @_;
+    my $cache = $class->request_cache;
+    return $cache->{feature}->{$feature}
+        if exists $cache->{feature}->{$feature};
+
+    my $feature_map = $cache->{feature_map};
+    if (!$feature_map) {
+        foreach my $package (@{ OPTIONAL_MODULES() }) {
+            foreach my $f (@{ $package->{feature} }) {
+                $feature_map->{$f} ||= [];
+                push(@{ $feature_map->{$f} }, $package->{module});
+            }
+        }
+        $cache->{feature_map} = $feature_map;
+    }
+
+    if (!$feature_map->{$feature}) {
+        ThrowCodeError('invalid_feature', { feature => $feature });
+    }
+
+    my $success = 1;
+    foreach my $module (@{ $feature_map->{$feature} }) {
+        # We can't use a string eval and "use" here (it kills Template-Toolkit,
+        # see https://rt.cpan.org/Public/Bug/Display.html?id=47929), so we have
+        # to do a block eval.
+        $module =~ s{::}{/}g;
+        $module .= ".pm";
+        eval { require $module; 1; } or $success = 0;
+    }
+    $cache->{feature}->{$feature} = $success;
+    return $success;
+}
+
 sub cgi {
     my $class = shift;
     $class->request_cache->{cgi} ||= new Bugzilla::CGI();
@@ -759,4 +794,9 @@ Returns a L<Bugzilla::JobQueue> that you can use for queueing jobs.
 Will throw an error if job queueing is not correctly configured on
 this Bugzilla installation.
 
+=item C<feature>
+
+Tells you whether or not a specific feature is enabled. For names
+of features, see C<OPTIONAL_MODULES> in C<Bugzilla::Install::Requirements>.
+
 =back
index d6f6659524d18fce6ffa93ec5431138e764826de..bea1639f32c00a0633ec51d32a3c25219e2d5a68 100644 (file)
@@ -281,12 +281,8 @@ sub get_attachment_link {
         # If the attachment is a patch, try to link to the diff rather
         # than the text, by default.
         my $patchlink = "";
-        if ($is_patch) {
-            # Determine if PatchReader is installed
-            my $patchviewer_installed = eval { require PatchReader; };
-            if ($patchviewer_installed) {
-                $patchlink = '&amp;action=diff';
-            }
+        if ($is_patch and Bugzilla->feature('patch_viewer')) {
+            $patchlink = '&amp;action=diff';
         }
 
         # Whitespace matters here because these links are in <pre> tags.
@@ -745,6 +741,8 @@ sub create {
                 return \@bug_list;
             },
 
+            'feature_enabled' => sub { return Bugzilla->feature(@_); },
+
             # These don't work as normal constants.
             DB_MODULE        => \&Bugzilla::Constants::DB_MODULE,
             REQUIRED_MODULES => 
index 2e952746e79ba0c31f4960438ef248df072c6814..be82294d7a0087665ec0aa4c7c9d6b4a51c3d1c3 100755 (executable)
@@ -86,12 +86,6 @@ if ($action ne 'view') {
     Bugzilla->login();
 }
 
-# Determine if PatchReader is installed
-eval {
-    require PatchReader;
-    $vars->{'patchviewerinstalled'} = 1;
-};
-
 # When viewing an attachment, do not request credentials if we are on
 # the alternate host. Let view() decide when to call Bugzilla->login.
 if ($action eq "view")
index f3b31e9a8db97ce608159d87f441df61fd3e29ac..323e005f46b13df839d331e12924ce34e06bf080 100755 (executable)
@@ -240,12 +240,6 @@ if (defined($cgi->upload('data')) || $cgi->param('attachurl')) {
     else {
         $vars->{'message'} = 'attachment_creation_failed';
     }
-
-    # Determine if Patch Viewer is installed, for Diff link
-    eval {
-        require PatchReader;
-        $vars->{'patchviewerinstalled'} = 1;
-    };
 }
 
 # Set bug flags.
index c0ee54938b1a066989610630d53135fcb2015910..36091b892a87ee91fa51d7cb2e421c4dbd6ac263 100755 (executable)
@@ -634,13 +634,6 @@ foreach my $bug (@bug_objects) {
     }
 }
 
-# Determine if Patch Viewer is installed, for Diff link
-# (NB: Duplicate code with show_bug.cgi.)
-eval {
-    require PatchReader;
-    $vars->{'patchviewerinstalled'} = 1;
-};
-
 if (Bugzilla->usage_mode == USAGE_MODE_EMAIL) {
     # Do nothing.
 }
index 4a530269e73b70de19eab29b3cc93e6950acdfef..ddb41ffec341742cbb9a2cb32ffe7ff9f81b03db 100755 (executable)
@@ -91,12 +91,6 @@ if ($single) {
     }
 }
 
-# Determine if Patch Viewer is installed, for Diff link
-eval {
-  require PatchReader;
-  $vars->{'patchviewerinstalled'} = 1;
-};
-
 $vars->{'bugs'} = \@bugs;
 $vars->{'marks'} = \%marks;
 
index fadf3e3086e00aa2f6e0af8f435da41188cd48f2..bbdf248663cbfcedafd2668304bcbbc0d5494489 100644 (file)
@@ -40,7 +40,7 @@
 %]
 
 [%# No need to display the Diff button and iframe if the attachment is not a patch. %]
-[% patchviewerinstalled = (patchviewerinstalled && attachment.ispatch) %]
+[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) %]
 
 <form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
   <input type="hidden" name="id" value="[% attachment.id %]">
         <input type="submit" value="Submit" id="update"><br><br>
         <strong>Actions:</strong>
         <a href="attachment.cgi?id=[% attachment.id %]">View</a>
-        [% IF attachment.ispatch && patchviewerinstalled %]
+        [% IF use_patchviewer %]
          | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
         [% END %]
         [% IF Param("allow_attachment_deletion")
             var patchviewerinstalled = 0;
             var attachment_id = [% attachment.id %];
             if (typeof document.getElementById == "function") {
-[% IF patchviewerinstalled %]
+[% IF use_patchviewer %]
               var patchviewerinstalled = 1;
               document.write('<iframe id="viewDiffFrame" style="height: 400px; width: 100%; display: none;"><\/iframe>');
 [% END %]
               document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Edit Attachment As Comment<\/button>');
               document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" style="display: none;">Undo Edit As Comment<\/button>');
               document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" style="display: none;">Redo Edit As Comment<\/button>');
-[% IF patchviewerinstalled %]
+[% IF use_patchviewer %]
               document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">View Attachment As Diff<\/button>');
 [% END %]
               document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" style="display: none;">View Attachment As Raw<\/button>');
index 04894ff8d354a9c99d7bff0f22061acdd849101e..bd597e48b58904fa661cc257f04321a54ac0044e 100644 (file)
@@ -117,7 +117,7 @@ function toggle_display(link) {
 
         <td valign="top">
           <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">Details</a>
-          [% IF attachment.ispatch && patchviewerinstalled %]
+          [% IF attachment.ispatch && feature_enabled('patch_viewer') %]
             | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
           [% END %]
           [% Hook.process("action") %]
index d75ca4432b9522eee5bfad5a719d1ae289d94435..8ad0c4ae934c6441389f9e33e18b76d2d92c2ee0 100644 (file)
     [% title = "Invalid Dimensions" %]
     The width or height specified is not a positive integer.
 
+  [% ELSIF error == "invalid_feature" %]
+    [% title = "Invalid Feature Name" %]
+    [% feature FILTER html %] is not a valid feature name. See
+    <code>OPTIONAL_MODULES</code> in 
+    <code>Bugzilla::Install::Requirements</code> for valid names.
+
   [% ELSIF error == "invalid_flag_association" %]
     [% title = "Invalid Flag Association" %]
     Some flags do not belong to