diff options
author | Max Kanat-Alexander <mkanat@bugzilla.org> | 2010-03-14 01:32:32 +0100 |
---|---|---|
committer | Max Kanat-Alexander <mkanat@bugzilla.org> | 2010-03-14 01:32:32 +0100 |
commit | 217beee45f5ba22aea80c8a61a639b55fe53293c (patch) | |
tree | e7865b6ac2b112cb6f5e22f6cb5d4e7aa77fe3f8 | |
parent | f276a11f82d1670eea4014f4d87b289d4b7921ca (diff) | |
download | bugzilla-217beee45f5ba22aea80c8a61a639b55fe53293c.tar.gz bugzilla-217beee45f5ba22aea80c8a61a639b55fe53293c.tar.xz |
Bug 498309: Speed up show_bug.cgi when there are many comments by caching
field-descs globally for all template calls
r=LpSolit, a=LpSolit
-rw-r--r-- | Bugzilla/Template.pm | 7 | ||||
-rw-r--r-- | Bugzilla/Util.pm | 30 | ||||
-rw-r--r-- | extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl | 5 | ||||
-rw-r--r-- | template/en/default/global/field-descs.none.tmpl | 157 |
4 files changed, 121 insertions, 78 deletions
diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index 79382ece2..618af4726 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -236,7 +236,7 @@ sub quoteUrls { # we have to do this in one pattern, and so this is semi-messy. # Also, we can't use $bug_re?$comment_re? because that will match the # empty string - my $bug_word = get_text('term', { term => 'bug' }); + my $bug_word = template_var('terms')->{bug}; my $bug_re = qr/\Q$bug_word\E\s*\#?\s*(\d+)/i; my $comment_re = qr/comment\s*\#?\s*(\d+)/i; $text =~ s~\b($bug_re(?:\s*,?\s*$comment_re)?|$comment_re) @@ -774,6 +774,11 @@ sub create { 'feature_enabled' => sub { return Bugzilla->feature(@_); }, + # field_descs can be somewhat slow to generate, so we generate + # it only once per-language no matter how many times + # $template->process() is called. + 'field_descs' => sub { return template_var('field_descs') }, + 'install_string' => \&Bugzilla::Install::Util::install_string, # These don't work as normal constants. diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 437979c85..35a5c0aea 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -44,7 +44,7 @@ use base qw(Exporter); file_mod_time is_7bit_clean bz_crypt generate_random_password validate_email_syntax clean_text - get_text disable_utf8); + get_text template_var disable_utf8); use Bugzilla::Constants; @@ -621,6 +621,26 @@ sub get_text { return $message; } +sub template_var { + my $name = shift; + my $cache = Bugzilla->request_cache->{util_template_var} ||= {}; + my $template = Bugzilla->template_inner; + my $lang = $template->context->{bz_language}; + return $cache->{$lang}->{$name} if defined $cache->{$lang}; + my %vars; + # Note: If we suddenly start needing a lot of template_var variables, + # they should move into their own template, not field-descs. + my $result = $template->process('global/field-descs.none.tmpl', + { vars => \%vars, in_template_var => 1 }); + # Bugzilla::Error can't be "use"d in Bugzilla::Util. + if (!$result) { + require Bugzilla::Error; + Bugzilla::Error::ThrowTemplateError($template->error); + } + $cache->{$lang} = \%vars; + return $vars{$name}; +} + sub disable_utf8 { if (Bugzilla->params->{'utf8'}) { binmode STDOUT, ':bytes'; # Turn off UTF8 encoding. @@ -902,6 +922,14 @@ A string. =back + +=item C<template_var> + +This is a method of getting the value of a variable from a template in +Perl code. The available variables are in the C<global/field-descs.none.tmpl> +template. Just pass in the name of the variable that you want the value of. + + =back =head2 Formatting Time diff --git a/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl b/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl index 2fd798084..1becab4da 100644 --- a/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl +++ b/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl @@ -18,5 +18,6 @@ # Max Kanat-Alexander <mkanat@bugzilla.org> #%] -[% field_descs.votes = "Votes" %] - +[% IF in_template_var %] + [% vars.field_descs.votes = "Votes" %] +[% END %] diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index 2c93c3d8a..6c6b93a9f 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -23,80 +23,6 @@ [% PROCESS global/variables.none.tmpl %] -[% field_descs = { "[Bug creation]" => "[$terms.Bug creation]", - "actual_time" => "Actual Hours", - "alias" => "Alias", - "assigned_to" => "Assignee", - "attach_data.thedata" => "Attachment data", - "attachments.description" => "Attachment description", - "attachments.filename" => "Attachment filename", - "attachments.mimetype" => "Attachment mime type", - "attachments.ispatch" => "Attachment is patch", - "attachments.isobsolete" => "Attachment is obsolete", - "attachments.isprivate" => "Attachment is private", - "attachments.isurl" => "Attachment is a URL", - "attachments.submitter" => "Attachment creator", - "blocked" => "Blocks", - "bug_file_loc" => "URL", - "bug_group" => "Group", - "bug_id" => "$terms.Bug ID", - "bug_severity" => "Severity", - "bug_status" => "Status", - "changeddate" => "Changed", - "cc" => "CC", - "classification" => "Classification", - "cclist_accessible" => "CC list accessible", - "commenter" => "Commenter", - "component_id" => "Component ID", - "component" => "Component", - "content" => "Content", - "creation_ts" => "Creation date", - "deadline" => "Deadline", - "delta_ts" => "Changed", - "dependson" => "Depends on", - "dup_id" => "Duplicate", - "estimated_time" => "Orig. Est.", - "everconfirmed" => "Ever confirmed", - "flagtypes.name" => "Flags", - "keywords" => "Keywords", - "longdesc" => "Comment", - "longdescs.isprivate" => "Comment is private", - "newcc" => "CC", - "op_sys" => "OS", - "opendate" => "Opened", - "owner_idle_time" => "Time Since Assignee Touched", - "percentage_complete" => "%Complete", - "priority" => "Priority", - "product_id" => "Product ID", - "product" => "Product", - "qa_contact" => "QA Contact", - "remaining_time" => "Hours Left", - "rep_platform" => "Hardware", - "reporter" => "Reporter", - "reporter_accessible" => "Reporter accessible", - "requestees.login_name" => "Flag Requestee", - "resolution" => "Resolution", - "see_also" => "See Also", - "setters.login_name" => "Flag Setter", - "setting" => "Setting", - "settings" => "Settings", - "short_desc" => "Summary", - "status_whiteboard" => "Whiteboard", - "target_milestone" => "Target Milestone", - "version" => "Version", - "work_time" => "Hours Worked"} %] - -[%# Also include any custom fields or fields which don't have a - Description here, by copying their Description from the - database. If you want to override this for your language - or your installation, just use a hook. %] -[% UNLESS Param('shutdownhtml') %] - [% FOREACH bz_field = bug_fields.values %] - [% SET field_descs.${bz_field.name} = bz_field.description - IF !field_descs.${bz_field.name}.defined %] - [% END %] -[% END %] - [% SET search_descs = { "noop" => "---", "equals" => "is equal to", @@ -162,4 +88,87 @@ [% END %] [% END %][% END %] +[% IF in_template_var %] + [% vars.terms = terms %] + + [%# field_descs is loaded as a global template variable and cached + # across all templates--see VARIABLES in Bugzilla/Template.pm. + #%] + [% vars.field_descs = { + "[Bug creation]" => "[$terms.Bug creation]", + "actual_time" => "Actual Hours", + "alias" => "Alias", + "assigned_to" => "Assignee", + "attach_data.thedata" => "Attachment data", + "attachments.description" => "Attachment description", + "attachments.filename" => "Attachment filename", + "attachments.mimetype" => "Attachment mime type", + "attachments.ispatch" => "Attachment is patch", + "attachments.isobsolete" => "Attachment is obsolete", + "attachments.isprivate" => "Attachment is private", + "attachments.isurl" => "Attachment is a URL", + "attachments.submitter" => "Attachment creator", + "blocked" => "Blocks", + "bug_file_loc" => "URL", + "bug_group" => "Group", + "bug_id" => "$terms.Bug ID", + "bug_severity" => "Severity", + "bug_status" => "Status", + "changeddate" => "Changed", + "cc" => "CC", + "classification" => "Classification", + "cclist_accessible" => "CC list accessible", + "commenter" => "Commenter", + "component_id" => "Component ID", + "component" => "Component", + "content" => "Content", + "creation_ts" => "Creation date", + "deadline" => "Deadline", + "delta_ts" => "Changed", + "dependson" => "Depends on", + "dup_id" => "Duplicate", + "estimated_time" => "Orig. Est.", + "everconfirmed" => "Ever confirmed", + "flagtypes.name" => "Flags", + "keywords" => "Keywords", + "longdesc" => "Comment", + "longdescs.isprivate" => "Comment is private", + "newcc" => "CC", + "op_sys" => "OS", + "opendate" => "Opened", + "owner_idle_time" => "Time Since Assignee Touched", + "percentage_complete" => "%Complete", + "priority" => "Priority", + "product_id" => "Product ID", + "product" => "Product", + "qa_contact" => "QA Contact", + "remaining_time" => "Hours Left", + "rep_platform" => "Hardware", + "reporter" => "Reporter", + "reporter_accessible" => "Reporter accessible", + "requestees.login_name" => "Flag Requestee", + "resolution" => "Resolution", + "see_also" => "See Also", + "setters.login_name" => "Flag Setter", + "setting" => "Setting", + "settings" => "Settings", + "short_desc" => "Summary", + "status_whiteboard" => "Whiteboard", + "target_milestone" => "Target Milestone", + "version" => "Version", + "work_time" => "Hours Worked", + } %] + + [%# Also include any custom fields or fields which don't have a + Description here, by copying their Description from the + database. If you want to override this for your language + or your installation, just use a hook. %] + [% UNLESS Param('shutdownhtml') %] + [% FOREACH bz_field = bug_fields.values %] + [% SET vars.field_descs.${bz_field.name} = bz_field.description + IF !vars.field_descs.${bz_field.name}.defined %] + [% END %] + [% END %] +[% END %] + [% Hook.process("end") %] |