Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bugzilla
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Lysator
bugzilla
Commits
640e2f5e
Commit
640e2f5e
authored
Jul 11, 2014
by
Per Cederqvist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Imported Bugzilla 4.4.
parent
f297f575
Changes
284
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
284 changed files
with
4661 additions
and
1914 deletions
+4661
-1914
.bzr/README
.bzr/README
+1
-1
.bzr/branch/location
.bzr/branch/location
+1
-1
.bzr/checkout/dirstate
.bzr/checkout/dirstate
+0
-0
Bugzilla.pm
Bugzilla.pm
+38
-10
Bugzilla/Attachment.pm
Bugzilla/Attachment.pm
+15
-22
Bugzilla/Bug.pm
Bugzilla/Bug.pm
+146
-64
Bugzilla/BugMail.pm
Bugzilla/BugMail.pm
+9
-0
Bugzilla/BugUrl/Debian.pm
Bugzilla/BugUrl/Debian.pm
+1
-1
Bugzilla/BugUrl/GitHub.pm
Bugzilla/BugUrl/GitHub.pm
+1
-1
Bugzilla/BugUrl/Google.pm
Bugzilla/BugUrl/Google.pm
+1
-1
Bugzilla/BugUrl/Launchpad.pm
Bugzilla/BugUrl/Launchpad.pm
+1
-1
Bugzilla/BugUrl/SourceForge.pm
Bugzilla/BugUrl/SourceForge.pm
+1
-1
Bugzilla/Comment.pm
Bugzilla/Comment.pm
+1
-1
Bugzilla/Component.pm
Bugzilla/Component.pm
+14
-11
Bugzilla/Config/GroupSecurity.pm
Bugzilla/Config/GroupSecurity.pm
+8
-0
Bugzilla/Config/MTA.pm
Bugzilla/Config/MTA.pm
+6
-0
Bugzilla/Constants.pm
Bugzilla/Constants.pm
+4
-2
Bugzilla/DB.pm
Bugzilla/DB.pm
+4
-2
Bugzilla/DB/Mysql.pm
Bugzilla/DB/Mysql.pm
+4
-3
Bugzilla/DB/Oracle.pm
Bugzilla/DB/Oracle.pm
+25
-15
Bugzilla/DB/Pg.pm
Bugzilla/DB/Pg.pm
+5
-4
Bugzilla/DB/Schema.pm
Bugzilla/DB/Schema.pm
+10
-5
Bugzilla/DB/Sqlite.pm
Bugzilla/DB/Sqlite.pm
+1
-0
Bugzilla/Field.pm
Bugzilla/Field.pm
+9
-1
Bugzilla/Field/Choice.pm
Bugzilla/Field/Choice.pm
+1
-1
Bugzilla/Field/ChoiceInterface.pm
Bugzilla/Field/ChoiceInterface.pm
+1
-0
Bugzilla/Flag.pm
Bugzilla/Flag.pm
+8
-27
Bugzilla/FlagType.pm
Bugzilla/FlagType.pm
+6
-42
Bugzilla/Group.pm
Bugzilla/Group.pm
+3
-1
Bugzilla/Hook.pm
Bugzilla/Hook.pm
+33
-0
Bugzilla/Install/DB.pm
Bugzilla/Install/DB.pm
+45
-6
Bugzilla/Install/Requirements.pm
Bugzilla/Install/Requirements.pm
+13
-24
Bugzilla/Install/Util.pm
Bugzilla/Install/Util.pm
+4
-2
Bugzilla/JobQueue.pm
Bugzilla/JobQueue.pm
+62
-1
Bugzilla/JobQueue/Runner.pm
Bugzilla/JobQueue/Runner.pm
+16
-10
Bugzilla/Mailer.pm
Bugzilla/Mailer.pm
+6
-0
Bugzilla/Migrate.pm
Bugzilla/Migrate.pm
+1
-1
Bugzilla/Milestone.pm
Bugzilla/Milestone.pm
+6
-4
Bugzilla/Object.pm
Bugzilla/Object.pm
+13
-7
Bugzilla/Search.pm
Bugzilla/Search.pm
+348
-53
Bugzilla/Search/Clause.pm
Bugzilla/Search/Clause.pm
+26
-17
Bugzilla/Search/ClauseGroup.pm
Bugzilla/Search/ClauseGroup.pm
+96
-0
Bugzilla/Search/Condition.pm
Bugzilla/Search/Condition.pm
+8
-1
Bugzilla/Search/Quicksearch.pm
Bugzilla/Search/Quicksearch.pm
+8
-3
Bugzilla/Search/Recent.pm
Bugzilla/Search/Recent.pm
+7
-6
Bugzilla/Template.pm
Bugzilla/Template.pm
+30
-55
Bugzilla/User.pm
Bugzilla/User.pm
+41
-3
Bugzilla/Util.pm
Bugzilla/Util.pm
+18
-15
Bugzilla/Version.pm
Bugzilla/Version.pm
+5
-3
Bugzilla/WebService.pm
Bugzilla/WebService.pm
+10
-1
Bugzilla/WebService/Bug.pm
Bugzilla/WebService/Bug.pm
+68
-23
Bugzilla/WebService/Bugzilla.pm
Bugzilla/WebService/Bugzilla.pm
+2
-0
Bugzilla/WebService/Classification.pm
Bugzilla/WebService/Classification.pm
+195
-0
Bugzilla/WebService/Constants.pm
Bugzilla/WebService/Constants.pm
+13
-5
Bugzilla/WebService/Product.pm
Bugzilla/WebService/Product.pm
+124
-12
Bugzilla/WebService/Server.pm
Bugzilla/WebService/Server.pm
+3
-1
Bugzilla/WebService/User.pm
Bugzilla/WebService/User.pm
+84
-27
Bugzilla/WebService/Util.pm
Bugzilla/WebService/Util.pm
+14
-5
attachment.cgi
attachment.cgi
+0
-1
buglist.cgi
buglist.cgi
+24
-22
chart.cgi
chart.cgi
+3
-3
collectstats.pl
collectstats.pl
+1
-2
contrib/bugzilla-queue.rhel
contrib/bugzilla-queue.rhel
+4
-4
contrib/bz_webservice_demo.pl
contrib/bz_webservice_demo.pl
+19
-11
contrib/convert-workflow.pl
contrib/convert-workflow.pl
+46
-3
docs/bugzilla.ent
docs/bugzilla.ent
+8
-8
docs/bugzilla.ent.tmpl
docs/bugzilla.ent.tmpl
+3
-3
docs/en/html/Bugzilla-Guide.html
docs/en/html/Bugzilla-Guide.html
+49
-79
docs/en/html/Bugzilla-Guide.proc
docs/en/html/Bugzilla-Guide.proc
+0
-0
docs/en/html/about.html
docs/en/html/about.html
+1
-2
docs/en/html/administration.html
docs/en/html/administration.html
+1
-1
docs/en/html/api/Bugzilla.html
docs/en/html/api/Bugzilla.html
+7
-1
docs/en/html/api/Bugzilla/Component.html
docs/en/html/api/Bugzilla/Component.html
+12
-11
docs/en/html/api/Bugzilla/DB/Schema.html
docs/en/html/api/Bugzilla/DB/Schema.html
+10
-2
docs/en/html/api/Bugzilla/Flag.html
docs/en/html/api/Bugzilla/Flag.html
+0
-32
docs/en/html/api/Bugzilla/FlagType.html
docs/en/html/api/Bugzilla/FlagType.html
+0
-28
docs/en/html/api/Bugzilla/Hook.html
docs/en/html/api/Bugzilla/Hook.html
+38
-0
docs/en/html/api/Bugzilla/Milestone.html
docs/en/html/api/Bugzilla/Milestone.html
+7
-5
docs/en/html/api/Bugzilla/Object.html
docs/en/html/api/Bugzilla/Object.html
+9
-11
docs/en/html/api/Bugzilla/Search.html
docs/en/html/api/Bugzilla/Search.html
+145
-0
docs/en/html/api/Bugzilla/User.html
docs/en/html/api/Bugzilla/User.html
+38
-2
docs/en/html/api/Bugzilla/Version.html
docs/en/html/api/Bugzilla/Version.html
+4
-2
docs/en/html/api/Bugzilla/WebService.html
docs/en/html/api/Bugzilla/WebService.html
+10
-3
docs/en/html/api/Bugzilla/WebService/Bug.html
docs/en/html/api/Bugzilla/WebService/Bug.html
+38
-12
docs/en/html/api/Bugzilla/WebService/Bugzilla.html
docs/en/html/api/Bugzilla/WebService/Bugzilla.html
+1
-1
docs/en/html/api/Bugzilla/WebService/Classification.html
docs/en/html/api/Bugzilla/WebService/Classification.html
+183
-0
docs/en/html/api/Bugzilla/WebService/Product.html
docs/en/html/api/Bugzilla/WebService/Product.html
+92
-1
docs/en/html/api/Bugzilla/WebService/User.html
docs/en/html/api/Bugzilla/WebService/User.html
+56
-11
docs/en/html/api/Bugzilla/WebService/Util.html
docs/en/html/api/Bugzilla/WebService/Util.html
+1
-1
docs/en/html/api/contrib/bz_webservice_demo.html
docs/en/html/api/contrib/bz_webservice_demo.html
+1
-1
docs/en/html/api/index.html
docs/en/html/api/index.html
+28
-20
docs/en/html/api/jobqueue.html
docs/en/html/api/jobqueue.html
+1
-0
docs/en/html/attachments.html
docs/en/html/attachments.html
+1
-1
docs/en/html/bug_page.html
docs/en/html/bug_page.html
+1
-1
docs/en/html/bug_status_workflow.html
docs/en/html/bug_status_workflow.html
+1
-1
docs/en/html/bugreports.html
docs/en/html/bugreports.html
+1
-1
docs/en/html/classifications.html
docs/en/html/classifications.html
+1
-1
docs/en/html/cmdline-bugmail.html
docs/en/html/cmdline-bugmail.html
+1
-1
docs/en/html/cmdline.html
docs/en/html/cmdline.html
+1
-1
docs/en/html/components.html
docs/en/html/components.html
+1
-1
docs/en/html/configuration.html
docs/en/html/configuration.html
+9
-9
docs/en/html/conventions.html
docs/en/html/conventions.html
+1
-1
docs/en/html/copyright.html
docs/en/html/copyright.html
+1
-1
docs/en/html/credits.html
docs/en/html/credits.html
+1
-1
docs/en/html/cust-change-permissions.html
docs/en/html/cust-change-permissions.html
+1
-1
docs/en/html/cust-skins.html
docs/en/html/cust-skins.html
+1
-1
docs/en/html/cust-templates.html
docs/en/html/cust-templates.html
+5
-5
docs/en/html/custom-fields.html
docs/en/html/custom-fields.html
+1
-1
docs/en/html/customization.html
docs/en/html/customization.html
+1
-1
docs/en/html/disclaimer.html
docs/en/html/disclaimer.html
+1
-1
docs/en/html/edit-values.html
docs/en/html/edit-values.html
+1
-1
docs/en/html/extensions.html
docs/en/html/extensions.html
+1
-1
docs/en/html/extraconfig.html
docs/en/html/extraconfig.html
+2
-2
docs/en/html/flags-overview.html
docs/en/html/flags-overview.html
+1
-1
docs/en/html/flags.html
docs/en/html/flags.html
+1
-1
docs/en/html/general-advice.html
docs/en/html/general-advice.html
+1
-1
docs/en/html/gfdl-0.html
docs/en/html/gfdl-0.html
+1
-1
docs/en/html/gfdl-1.html
docs/en/html/gfdl-1.html
+1
-1
docs/en/html/gfdl-10.html
docs/en/html/gfdl-10.html
+1
-1
docs/en/html/gfdl-2.html
docs/en/html/gfdl-2.html
+1
-1
docs/en/html/gfdl-3.html
docs/en/html/gfdl-3.html
+1
-1
docs/en/html/gfdl-4.html
docs/en/html/gfdl-4.html
+1
-1
docs/en/html/gfdl-5.html
docs/en/html/gfdl-5.html
+1
-1
docs/en/html/gfdl-6.html
docs/en/html/gfdl-6.html
+1
-1
docs/en/html/gfdl-7.html
docs/en/html/gfdl-7.html
+1
-1
docs/en/html/gfdl-8.html
docs/en/html/gfdl-8.html
+1
-1
docs/en/html/gfdl-9.html
docs/en/html/gfdl-9.html
+1
-1
docs/en/html/gfdl-howto.html
docs/en/html/gfdl-howto.html
+1
-1
docs/en/html/gfdl.html
docs/en/html/gfdl.html
+1
-1
docs/en/html/glossary.html
docs/en/html/glossary.html
+1
-1
docs/en/html/groups.html
docs/en/html/groups.html
+2
-2
docs/en/html/hintsandtips.html
docs/en/html/hintsandtips.html
+2
-2
docs/en/html/index.html
docs/en/html/index.html
+4
-6
docs/en/html/install-perlmodules-manual.html
docs/en/html/install-perlmodules-manual.html
+1
-1
docs/en/html/installation.html
docs/en/html/installation.html
+7
-7
docs/en/html/installing-bugzilla.html
docs/en/html/installing-bugzilla.html
+1
-1
docs/en/html/integration.html
docs/en/html/integration.html
+1
-1
docs/en/html/keywords.html
docs/en/html/keywords.html
+1
-1
docs/en/html/lifecycle.html
docs/en/html/lifecycle.html
+1
-1
docs/en/html/milestones.html
docs/en/html/milestones.html
+1
-1
docs/en/html/modules-manual-download.html
docs/en/html/modules-manual-download.html
+3
-5
docs/en/html/modules-manual-instructions.html
docs/en/html/modules-manual-instructions.html
+1
-1
docs/en/html/modules-manual-optional.html
docs/en/html/modules-manual-optional.html
+1
-1
docs/en/html/multiple-bz-dbs.html
docs/en/html/multiple-bz-dbs.html
+1
-1
docs/en/html/myaccount.html
docs/en/html/myaccount.html
+1
-1
docs/en/html/newversions.html
docs/en/html/newversions.html
+3
-5
docs/en/html/nonroot.html
docs/en/html/nonroot.html
+9
-9
docs/en/html/os-specific.html
docs/en/html/os-specific.html
+1
-18
docs/en/html/parameters.html
docs/en/html/parameters.html
+1
-1
docs/en/html/paranoid-security.html
docs/en/html/paranoid-security.html
+1
-1
docs/en/html/patches.html
docs/en/html/patches.html
+1
-1
docs/en/html/products.html
docs/en/html/products.html
+1
-1
docs/en/html/query.html
docs/en/html/query.html
+7
-15
docs/en/html/quips.html
docs/en/html/quips.html
+1
-1
docs/en/html/reporting.html
docs/en/html/reporting.html
+2
-2
docs/en/html/sanitycheck.html
docs/en/html/sanitycheck.html
+1
-1
docs/en/html/security-bugzilla.html
docs/en/html/security-bugzilla.html
+1
-1
docs/en/html/security-os.html
docs/en/html/security-os.html
+1
-1
docs/en/html/security-webserver.html
docs/en/html/security-webserver.html
+1
-1
docs/en/html/security.html
docs/en/html/security.html
+1
-1
docs/en/html/timetracking.html
docs/en/html/timetracking.html
+1
-1
docs/en/html/trbl-dbdSponge.html
docs/en/html/trbl-dbdSponge.html
+1
-1
docs/en/html/trbl-index.html
docs/en/html/trbl-index.html
+1
-1
docs/en/html/trbl-passwd-encryption.html
docs/en/html/trbl-passwd-encryption.html
+1
-1
docs/en/html/trbl-perlmodule.html
docs/en/html/trbl-perlmodule.html
+1
-1
docs/en/html/trbl-relogin-everyone.html
docs/en/html/trbl-relogin-everyone.html
+1
-1
docs/en/html/trbl-testserver.html
docs/en/html/trbl-testserver.html
+1
-1
docs/en/html/troubleshooting.html
docs/en/html/troubleshooting.html
+1
-1
docs/en/html/upgrade.html
docs/en/html/upgrade.html
+1
-1
docs/en/html/useradmin.html
docs/en/html/useradmin.html
+1
-1
docs/en/html/userpreferences.html
docs/en/html/userpreferences.html
+1
-1
docs/en/html/using-intro.html
docs/en/html/using-intro.html
+1
-1
docs/en/html/using.html
docs/en/html/using.html
+1
-1
docs/en/html/versions.html
docs/en/html/versions.html
+1
-1
docs/en/html/voting.html
docs/en/html/voting.html
+1
-1
docs/en/html/whining.html
docs/en/html/whining.html
+2
-2
docs/en/txt/Bugzilla-Guide.txt
docs/en/txt/Bugzilla-Guide.txt
+32
-55
docs/en/xml/Bugzilla-Guide.xml
docs/en/xml/Bugzilla-Guide.xml
+0
-1
docs/en/xml/about.xml
docs/en/xml/about.xml
+2
-4
docs/en/xml/bugzilla.ent
docs/en/xml/bugzilla.ent
+8
-8
docs/en/xml/customization.xml
docs/en/xml/customization.xml
+4
-4
docs/en/xml/installation.xml
docs/en/xml/installation.xml
+2
-29
docs/en/xml/modules.xml
docs/en/xml/modules.xml
+2
-4
docs/en/xml/using.xml
docs/en/xml/using.xml
+6
-14
editkeywords.cgi
editkeywords.cgi
+4
-4
editusers.cgi
editusers.cgi
+2
-3
enter_bug.cgi
enter_bug.cgi
+1
-1
extensions/Example/Extension.pm
extensions/Example/Extension.pm
+47
-3
extensions/Example/template/en/default/hook/global/footer-end.html.tmpl
...mple/template/en/default/hook/global/footer-end.html.tmpl
+7
-11
extensions/MoreBugUrl/lib/GetSatisfaction.pm
extensions/MoreBugUrl/lib/GetSatisfaction.pm
+1
-1
extensions/MoreBugUrl/lib/PHP.pm
extensions/MoreBugUrl/lib/PHP.pm
+2
-2
extensions/MoreBugUrl/lib/RT.pm
extensions/MoreBugUrl/lib/RT.pm
+1
-1
extensions/OldBugMove/Extension.pm
extensions/OldBugMove/Extension.pm
+3
-1
extensions/Voting/Config.pm
extensions/Voting/Config.pm
+19
-0
extensions/Voting/Extension.pm
extensions/Voting/Extension.pm
+1
-1
extensions/create.pl
extensions/create.pl
+1
-0
importxml.pl
importxml.pl
+5
-3
jobqueue.pl
jobqueue.pl
+1
-0
js/attachment.js
js/attachment.js
+4
-6
js/custom-search.js
js/custom-search.js
+157
-17
js/field.js
js/field.js
+62
-8
js/productform.js
js/productform.js
+0
-69
js/util.js
js/util.js
+21
-0
js/yui/swfstore/swfstore.swf
js/yui/swfstore/swfstore.swf
+0
-0
jsonrpc.cgi
jsonrpc.cgi
+1
-1
lib/CGI.pm
lib/CGI.pm
+30
-17
lib/CGI/Carp.pm
lib/CGI/Carp.pm
+34
-35
lib/CGI/Util.pm
lib/CGI/Util.pm
+48
-40
mod_perl.pl
mod_perl.pl
+1
-1
page.cgi
page.cgi
+2
-2
post_bug.cgi
post_bug.cgi
+0
-2
process_bug.cgi
process_bug.cgi
+30
-10
query.cgi
query.cgi
+0
-7
quips.cgi
quips.cgi
+2
-3
report.cgi
report.cgi
+26
-17
reports.cgi
reports.cgi
+1
-1
sanitycheck.cgi
sanitycheck.cgi
+1
-1
show_bug.cgi
show_bug.cgi
+21
-9
showdependencygraph.cgi
showdependencygraph.cgi
+6
-3
showdependencytree.cgi
showdependencytree.cgi
+1
-1
skins/standard/admin.css
skins/standard/admin.css
+6
-0
skins/standard/buglist.css
skins/standard/buglist.css
+15
-0
summarize_time.cgi
summarize_time.cgi
+1
-1
t/012throwables.t
t/012throwables.t
+8
-1
t/Support/Files.pm
t/Support/Files.pm
+8
-0
template/en/default/account/auth/login-small.html.tmpl
template/en/default/account/auth/login-small.html.tmpl
+1
-1
template/en/default/account/prefs/email.html.tmpl
template/en/default/account/prefs/email.html.tmpl
+15
-0
template/en/default/admin/classifications/reclassify.html.tmpl
...ate/en/default/admin/classifications/reclassify.html.tmpl
+4
-4
template/en/default/admin/classifications/select.html.tmpl
template/en/default/admin/classifications/select.html.tmpl
+4
-4
template/en/default/admin/components/confirm-delete.html.tmpl
...late/en/default/admin/components/confirm-delete.html.tmpl
+3
-2
template/en/default/admin/components/list.html.tmpl
template/en/default/admin/components/list.html.tmpl
+2
-2
template/en/default/admin/custom_fields/confirm-delete.html.tmpl
...e/en/default/admin/custom_fields/confirm-delete.html.tmpl
+2
-1
template/en/default/admin/milestones/confirm-delete.html.tmpl
...late/en/default/admin/milestones/confirm-delete.html.tmpl
+4
-6
template/en/default/admin/params/common.html.tmpl
template/en/default/admin/params/common.html.tmpl
+1
-1
template/en/default/admin/params/groupsecurity.html.tmpl
template/en/default/admin/params/groupsecurity.html.tmpl
+3
-0
template/en/default/admin/products/confirm-delete.html.tmpl
template/en/default/admin/products/confirm-delete.html.tmpl
+2
-2
template/en/default/admin/products/edit.html.tmpl
template/en/default/admin/products/edit.html.tmpl
+3
-1
template/en/default/admin/products/groupcontrol/edit.html.tmpl
...ate/en/default/admin/products/groupcontrol/edit.html.tmpl
+106
-113
template/en/default/admin/table.html.tmpl
template/en/default/admin/table.html.tmpl
+14
-29
template/en/default/admin/versions/confirm-delete.html.tmpl
template/en/default/admin/versions/confirm-delete.html.tmpl
+2
-1
template/en/default/attachment/createformcontents.html.tmpl
template/en/default/attachment/createformcontents.html.tmpl
+3
-0
template/en/default/attachment/delete_reason.txt.tmpl
template/en/default/attachment/delete_reason.txt.tmpl
+2
-9
template/en/default/bug/comments.html.tmpl
template/en/default/bug/comments.html.tmpl
+18
-35
template/en/default/bug/create/create.html.tmpl
template/en/default/bug/create/create.html.tmpl
+3
-3
template/en/default/bug/edit.html.tmpl
template/en/default/bug/edit.html.tmpl
+80
-67
template/en/default/bug/field-events.js.tmpl
template/en/default/bug/field-events.js.tmpl
+16
-3
template/en/default/bug/field-help.none.tmpl
template/en/default/bug/field-help.none.tmpl
+1
-1
template/en/default/bug/field.html.tmpl
template/en/default/bug/field.html.tmpl
+2
-1
template/en/default/bug/link.html.tmpl
template/en/default/bug/link.html.tmpl
+3
-1
template/en/default/bug/process/verify-new-product.html.tmpl
template/en/default/bug/process/verify-new-product.html.tmpl
+19
-16
template/en/default/bug/show-header.html.tmpl
template/en/default/bug/show-header.html.tmpl
+5
-2
template/en/default/config.js.tmpl
template/en/default/config.js.tmpl
+9
-2
template/en/default/config.rdf.tmpl
template/en/default/config.rdf.tmpl
+11
-4
template/en/default/email/bugmail-header.txt.tmpl
template/en/default/email/bugmail-header.txt.tmpl
+1
-0
template/en/default/filterexceptions.pl
template/en/default/filterexceptions.pl
+2
-3
template/en/default/flag/list.html.tmpl
template/en/default/flag/list.html.tmpl
+2
-1
template/en/default/global/code-error.html.tmpl
template/en/default/global/code-error.html.tmpl
+0
-73
template/en/default/global/confirm-user-match.html.tmpl
template/en/default/global/confirm-user-match.html.tmpl
+2
-2
template/en/default/global/field-descs.none.tmpl
template/en/default/global/field-descs.none.tmpl
+1
-0
template/en/default/global/footer.html.tmpl
template/en/default/global/footer.html.tmpl
+1
-2
template/en/default/global/header.html.tmpl
template/en/default/global/header.html.tmpl
+8
-33
template/en/default/global/messages.html.tmpl
template/en/default/global/messages.html.tmpl
+5
-3
template/en/default/global/user-error.html.tmpl
template/en/default/global/user-error.html.tmpl
+91
-14
template/en/default/list/list.html.tmpl
template/en/default/list/list.html.tmpl
+9
-7
template/en/default/list/server-push.html.tmpl
template/en/default/list/server-push.html.tmpl
+3
-1
template/en/default/pages/fields.html.tmpl
template/en/default/pages/fields.html.tmpl
+1
-2
template/en/default/pages/release-notes.html.tmpl
template/en/default/pages/release-notes.html.tmpl
+755
-12
template/en/default/reports/components.html.tmpl
template/en/default/reports/components.html.tmpl
+3
-1
template/en/default/reports/report-table.html.tmpl
template/en/default/reports/report-table.html.tmpl
+1
-1
template/en/default/reports/report.html.tmpl
template/en/default/reports/report.html.tmpl
+5
-3
template/en/default/request/queue.html.tmpl
template/en/default/request/queue.html.tmpl
+0
-4
template/en/default/search/boolean-charts.html.tmpl
template/en/default/search/boolean-charts.html.tmpl
+11
-4
template/en/default/search/field.html.tmpl
template/en/default/search/field.html.tmpl
+13
-2
template/en/default/search/form.html.tmpl
template/en/default/search/form.html.tmpl
+2
-2
template/en/default/search/search-report-select.html.tmpl
template/en/default/search/search-report-select.html.tmpl
+0
-7
template/en/default/setup/strings.txt.pl
template/en/default/setup/strings.txt.pl
+0
-18
template/en/default/whine/mail.html.tmpl
template/en/default/whine/mail.html.tmpl
+14
-17
template/en/default/whine/mail.txt.tmpl
template/en/default/whine/mail.txt.tmpl
+18
-10
testserver.pl
testserver.pl
+3
-3
votes.cgi
votes.cgi
+1
-1
whine.pl
whine.pl
+16
-7
xmlrpc.cgi
xmlrpc.cgi
+1
-1
xt/lib/Bugzilla/Test/Search/Constants.pm
xt/lib/Bugzilla/Test/Search/Constants.pm
+95
-9
xt/lib/Bugzilla/Test/Search/FieldTest.pm
xt/lib/Bugzilla/Test/Search/FieldTest.pm
+30
-13
No files found.
.bzr/README
View file @
640e2f5e
This is a Bazaar control directory.
Do not change any files in this directory.
See http://bazaar
.canonical.com
/ for more information about Bazaar.
See http://bazaar
-vcs.org
/ for more information about Bazaar.
.bzr/branch/location
View file @
640e2f5e
bzr://bzr.mozilla.org/bugzilla/trunk/
\ No newline at end of file
bzr://bzr.mozilla.org/bugzilla/4.4/
\ No newline at end of file
.bzr/checkout/dirstate
View file @
640e2f5e
No preview for this file type
Bugzilla.pm
View file @
640e2f5e
...
...
@@ -27,7 +27,7 @@ use Bugzilla::Extension;
use
Bugzilla::
DB
;
use
Bugzilla::Install::
Localconfig
qw(read_localconfig)
;
use
Bugzilla::Install::
Requirements
qw(OPTIONAL_MODULES)
;
use
Bugzilla::Install::
Util
qw(init_console)
;
use
Bugzilla::Install::
Util
qw(init_console
include_languages
)
;
use
Bugzilla::
Template
;
use
Bugzilla::
User
;
use
Bugzilla::
Error
;
...
...
@@ -268,10 +268,8 @@ sub input_params {
return
$cache
->
{
input_params
};
}
our
$_localconfig
;
sub
localconfig
{
$_localconfig
||=
read_localconfig
();
return
$_localconfig
;
return
$_
[
0
]
->
process_cache
->
{
localconfig
}
||=
read_localconfig
();
}
sub
params
{
...
...
@@ -440,6 +438,10 @@ sub languages {
return
Bugzilla::Install::Util::
supported_languages
();
}
sub
current_language
{
return
$_
[
0
]
->
request_cache
->
{
current_language
}
||=
(
include_languages
())[
0
];
}
sub
error_mode
{
my
(
$class
,
$newval
)
=
@_
;
if
(
defined
$newval
)
{
...
...
@@ -593,7 +595,8 @@ sub fields {
}
}
return
$do_by_name
?
\
%requested
:
[
values
%requested
];
return
$do_by_name
?
\
%requested
:
[
sort
{
$a
->
sortkey
<=>
$b
->
sortkey
||
$a
->
name
cmp
$b
->
name
}
values
%requested
];
}
sub
active_custom_fields
{
...
...
@@ -617,11 +620,11 @@ sub has_flags {
sub
local_timezone
{
my
$class
=
shift
;
if
(
!
defined
$class
->
request
_cache
->
{
local_timezone
})
{
$class
->
request
_cache
->
{
local_timezone
}
=
if
(
!
defined
$class
->
process
_cache
->
{
local_timezone
})
{
$class
->
process
_cache
->
{
local_timezone
}
=
DateTime::
TimeZone
->
new
(
name
=>
'
local
');
}
return
$class
->
request
_cache
->
{
local_timezone
};
return
$class
->
process
_cache
->
{
local_timezone
};
}
# This creates the request cache for non-mod_perl installations.
...
...
@@ -642,6 +645,27 @@ sub request_cache {
return
$_request_cache
;
}
sub
clear_request_cache
{
$_request_cache
=
{};
if
(
$ENV
{
MOD_PERL
})
{
require
Apache2::
RequestUtil
;
my
$request
=
eval
{
Apache2::
RequestUtil
->
request
};
if
(
$request
)
{
my
$pnotes
=
$request
->
pnotes
;
delete
@$pnotes
{(
keys
%$pnotes
)};
}
}
}
# This is a per-process cache. Under mod_cgi it's identical to the
# request_cache. When using mod_perl, items in this cache live until the
# worker process is terminated.
our
$_process_cache
=
{};
sub
process_cache
{
return
$_process_cache
;
}
# Private methods
# Per-process cleanup. Note that this is a plain subroutine, not a method,
...
...
@@ -654,7 +678,7 @@ sub _cleanup {
$dbh
->
bz_rollback_transaction
()
if
$dbh
->
bz_in_transaction
;
$dbh
->
disconnect
;
}
undef
$_request_cache
;
clear_request_cache
()
;
# These are both set by CGI.pm but need to be undone so that
# Apache can actually shut down its children if it needs to.
...
...
@@ -848,7 +872,7 @@ in a hashref:
=item C<by_name>
If false (or not specified), this method will return an arrayref of
the requested fields.
The order of the returned fields is random.
the requested fields.
If true, this method will return a hashref of fields, where the keys
are field names and the valules are L<Bugzilla::Field> objects.
...
...
@@ -915,6 +939,10 @@ The main database handle. See L<DBI>.
Currently installed languages.
Returns a reference to a list of RFC 1766 language tags of installed languages.
=item C<current_language>
The currently active language.
=item C<switch_to_shadow_db>
Switch from using the main database to using the shadow database.
...
...
Bugzilla/Attachment.pm
View file @
640e2f5e
...
...
@@ -546,6 +546,7 @@ sub _check_content_type {
}
my
$mimetype
=
mimetype
(
$fh
);
$fh
->
seek
(
0
,
0
);
$content_type
=
$mimetype
if
$mimetype
;
}
...
...
@@ -755,7 +756,7 @@ sub validate_obsolete {
$vars
->
{'
attach_id
'}
=
$attachid
;
detaint_natural
(
$attachid
)
||
Throw
CodeError
('
invalid_attach_id_to_obsolete
',
$vars
);
||
Throw
UserError
('
invalid_attach_id
',
$vars
);
# Make sure the attachment exists in the database.
my
$attachment
=
new
Bugzilla::
Attachment
(
$attachid
)
...
...
@@ -765,12 +766,9 @@ sub validate_obsolete {
$attachment
->
validate_can_edit
(
$bug
->
product_id
)
||
ThrowUserError
('
illegal_attachment_edit
',
{
attach_id
=>
$attachment
->
id
});
$vars
->
{'
description
'}
=
$attachment
->
description
;
if
(
$attachment
->
bug_id
!=
$bug
->
bug_id
)
{
$vars
->
{'
my_bug_id
'}
=
$bug
->
bug_id
;
$vars
->
{'
attach_bug_id
'}
=
$attachment
->
bug_id
;
ThrowCodeError
('
mismatched_bug_ids_on_obsolete
',
$vars
);
ThrowUserError
('
mismatched_bug_ids_on_obsolete
',
$vars
);
}
next
if
$attachment
->
isobsolete
;
...
...
@@ -878,7 +876,7 @@ sub run_create_validators {
$params
->
{
creation_ts
}
||=
Bugzilla
->
dbh
->
selectrow_array
('
SELECT LOCALTIMESTAMP(0)
');
$params
->
{
modification_time
}
=
$params
->
{
creation_ts
};
$params
->
{
submitter_id
}
=
Bugzilla
->
user
->
id
||
Throw
Code
Error
('
invalid_user
');
$params
->
{
submitter_id
}
=
Bugzilla
->
user
->
id
||
Throw
User
Error
('
invalid_user
');
return
$params
;
}
...
...
@@ -961,10 +959,18 @@ sub get_content_type {
return
'
text/plain
'
if
(
$cgi
->
param
('
ispatch
')
||
$cgi
->
param
('
attach_text
'));
my
$content_type
;
if
(
!
defined
$cgi
->
param
('
contenttypemethod
'))
{
ThrowUserError
("
missing_content_type_method
");
my
$method
=
$cgi
->
param
('
contenttypemethod
')
||
'';
if
(
$method
eq
'
list
')
{
# The user selected a content type from the list, so use their
# selection.
$content_type
=
$cgi
->
param
('
contenttypeselection
');
}
elsif
(
$cgi
->
param
('
contenttypemethod
')
eq
'
autodetect
')
{
elsif
(
$method
eq
'
manual
')
{
# The user entered a content type manually, so use their entry.
$content_type
=
$cgi
->
param
('
contenttypeentry
');
}
else
{
defined
$cgi
->
upload
('
data
')
||
ThrowUserError
('
file_not_specified
');
# The user asked us to auto-detect the content type, so use the type
# specified in the HTTP request headers.
...
...
@@ -978,19 +984,6 @@ sub get_content_type {
$content_type
=
'
image/png
';
}
}
elsif
(
$cgi
->
param
('
contenttypemethod
')
eq
'
list
')
{
# The user selected a content type from the list, so use their
# selection.
$content_type
=
$cgi
->
param
('
contenttypeselection
');
}
elsif
(
$cgi
->
param
('
contenttypemethod
')
eq
'
manual
')
{
# The user entered a content type manually, so use their entry.
$content_type
=
$cgi
->
param
('
contenttypeentry
');
}
else
{
ThrowCodeError
("
illegal_content_type_method
",
{
contenttypemethod
=>
$cgi
->
param
('
contenttypemethod
')
});
}
return
$content_type
;
}
...
...
Bugzilla/Bug.pm
View file @
640e2f5e
...
...
@@ -151,6 +151,9 @@ sub VALIDATORS {
elsif
(
$field
->
type
==
FIELD_TYPE_BUG_ID
)
{
$validator
=
\
&_check_bugid_field
;
}
elsif
(
$field
->
type
==
FIELD_TYPE_TEXTAREA
)
{
$validator
=
\
&_check_textarea_field
;
}
else
{
$validator
=
\
&_check_default_field
;
}
...
...
@@ -519,17 +522,14 @@ sub possible_duplicates {
if
(
$dbh
->
FULLTEXT_OR
)
{
my
$joined_terms
=
join
(
$dbh
->
FULLTEXT_OR
,
@words
);
(
$where_sql
,
$relevance_sql
)
=
$dbh
->
sql_fulltext_search
('
bugs_fulltext.short_desc
',
$joined_terms
,
1
);
$dbh
->
sql_fulltext_search
('
bugs_fulltext.short_desc
',
$joined_terms
);
$relevance_sql
||=
$where_sql
;
}
else
{
my
(
@where
,
@relevance
);
my
$count
=
0
;
foreach
my
$word
(
@words
)
{
$count
++
;
my
(
$term
,
$rel_term
)
=
$dbh
->
sql_fulltext_search
(
'
bugs_fulltext.short_desc
',
$word
,
$count
);
'
bugs_fulltext.short_desc
',
$word
);
push
(
@where
,
$term
);
push
(
@relevance
,
$rel_term
||
$term
);
}
...
...
@@ -719,7 +719,7 @@ sub create {
# Because MySQL doesn't support transactions on the fulltext table,
# we do this after we've committed the transaction. That way we're
# sure we're inserting a good Bug ID.
$bug
->
_sync_fulltext
(
'
new bug
'
);
$bug
->
_sync_fulltext
(
new_bug
=>
1
);
return
$bug
;
}
...
...
@@ -728,6 +728,17 @@ sub run_create_validators {
my
$class
=
shift
;
my
$params
=
$class
->
SUPER::
run_create_validators
(
@
_
);
# Add classification for checking mandatory fields which depend on it
$params
->
{
classification
}
=
$params
->
{
product
}
->
classification
->
name
;
my
@mandatory_fields
=
@
{
Bugzilla
->
fields
({
is_mandatory
=>
1
,
enter_bug
=>
1
,
obsolete
=>
0
})
};
foreach
my
$field
(
@mandatory_fields
)
{
$class
->
_check_field_is_mandatory
(
$params
->
{
$field
->
name
},
$field
,
$params
);
}
my
$product
=
delete
$params
->
{
product
};
$params
->
{
product_id
}
=
$product
->
id
;
my
$component
=
delete
$params
->
{
component
};
...
...
@@ -747,18 +758,11 @@ sub run_create_validators {
# You can't set these fields.
delete
$params
->
{
lastdiffed
};
delete
$params
->
{
bug_id
};
delete
$params
->
{
classification
};
Bugzilla::Hook::
process
('
bug_end_of_create_validators
',
{
params
=>
$params
});
my
@mandatory_fields
=
@
{
Bugzilla
->
fields
({
is_mandatory
=>
1
,
enter_bug
=>
1
,
obsolete
=>
0
})
};
foreach
my
$field
(
@mandatory_fields
)
{
$class
->
_check_field_is_mandatory
(
$params
->
{
$field
->
name
},
$field
,
$params
);
}
# And this is not a valid DB field, it's just used as part of
# _check_dependencies to avoid running it twice for both blocked
# and dependson.
...
...
@@ -779,6 +783,10 @@ sub update {
my
(
$changes
,
$old_bug
)
=
$self
->
SUPER::
update
(
@
_
);
Bugzilla::Hook::
process
('
bug_start_of_update
',
{
timestamp
=>
$delta_ts
,
bug
=>
$self
,
old_bug
=>
$old_bug
,
changes
=>
$changes
});
# Certain items in $changes have to be fixed so that they hold
# a name instead of an ID.
foreach
my
$field
(
qw(product_id component_id)
)
{
...
...
@@ -1010,9 +1018,10 @@ sub update {
# in the middle of a transaction, and if that transaction is rolled
# back, this change will *not* be rolled back. As we expect rollbacks
# to be extremely rare, that is OK for us.
$self
->
_sync_fulltext
()
if
$self
->
{
added_comments
}
||
$changes
->
{
short_desc
}
||
$self
->
{
comment_isprivate
};
$self
->
_sync_fulltext
(
update_short_desc
=>
$changes
->
{
short_desc
},
update_comments
=>
$self
->
{
added_comments
}
||
$self
->
{
comment_isprivate
}
);
# Remove obsolete internal variables.
delete
$self
->
{'
_old_assigned_to
'};
...
...
@@ -1046,25 +1055,43 @@ sub _extract_multi_selects {
# Should be called any time you update short_desc or change a comment.
sub
_sync_fulltext
{
my
(
$self
,
$new_bug
)
=
@_
;
my
(
$self
,
%options
)
=
@_
;
my
$dbh
=
Bugzilla
->
dbh
;
if
(
$new_bug
)
{
$dbh
->
do
('
INSERT INTO bugs_fulltext (bug_id, short_desc)
SELECT bug_id, short_desc FROM bugs WHERE bug_id = ?
',
undef
,
$self
->
id
);
my
(
$all_comments
,
$public_comments
);
if
(
$options
{
new_bug
}
||
$options
{
update_comments
})
{
my
$comments
=
$dbh
->
selectall_arrayref
(
'
SELECT thetext, isprivate FROM longdescs WHERE bug_id = ?
',
undef
,
$self
->
id
);
$all_comments
=
join
("
\n
",
map
{
$_
->
[
0
]
}
@$comments
);
my
@no_private
=
grep
{
!
$_
->
[
1
]
}
@$comments
;
$public_comments
=
join
("
\n
",
map
{
$_
->
[
0
]
}
@no_private
);
}
else
{
$dbh
->
do
('
UPDATE bugs_fulltext SET short_desc = ? WHERE bug_id = ?
',
undef
,
$self
->
short_desc
,
$self
->
id
);
if
(
$options
{
new_bug
})
{
$dbh
->
do
('
INSERT INTO bugs_fulltext (bug_id, short_desc, comments,
comments_noprivate)
VALUES (?, ?, ?, ?)
',
undef
,
$self
->
id
,
$self
->
short_desc
,
$all_comments
,
$public_comments
);
}
else
{
my
(
@names
,
@values
);
if
(
$options
{
update_short_desc
})
{
push
@names
,
'
short_desc
';
push
@values
,
$self
->
short_desc
;
}
if
(
$options
{
update_comments
})
{
push
@names
,
('
comments
',
'
comments_noprivate
');
push
@values
,
(
$all_comments
,
$public_comments
);
}
if
(
@names
)
{
$dbh
->
do
('
UPDATE bugs_fulltext SET
'
.
join
('
,
',
map
{
"
$_
= ?
"
}
@names
)
.
'
WHERE bug_id = ?
',
undef
,
@values
,
$self
->
id
);
}
}
my
$comments
=
$dbh
->
selectall_arrayref
(
'
SELECT thetext, isprivate FROM longdescs WHERE bug_id = ?
',
undef
,
$self
->
id
);
my
$all
=
join
("
\n
",
map
{
$_
->
[
0
]
}
@$comments
);
my
@no_private
=
grep
{
!
$_
->
[
1
]
}
@$comments
;
my
$nopriv_string
=
join
("
\n
",
map
{
$_
->
[
0
]
}
@no_private
);
$dbh
->
do
('
UPDATE bugs_fulltext SET comments = ?, comments_noprivate = ?
WHERE bug_id = ?
',
undef
,
$all
,
$nopriv_string
,
$self
->
id
);
}
sub
remove_from_db
{
...
...
@@ -1311,11 +1338,12 @@ sub _check_bug_status {
}
# Check if a comment is required for this change.
if
(
$new_status
->
comment_required_on_change_from
(
$old_status
)
&&
!
$comment
)
if
(
$new_status
->
comment_required_on_change_from
(
$old_status
)
&&
!
$comment
->
{'
thetext
'})
{
ThrowUserError
('
comment_required
',
{
old
=>
$old_status
->
name
,
new
=>
$new_status
->
name
,
field
=>
'
bug_status
'
});
{
old
=>
$old_status
?
$old_status
->
name
:
undef
,
new
=>
$new_status
->
name
,
field
=>
'
bug_status
'
});
}
if
(
ref
$invocant
...
...
@@ -1422,8 +1450,12 @@ sub _check_component {
$name
||
ThrowUserError
("
require_component
");
my
$product
=
blessed
(
$invocant
)
?
$invocant
->
product_obj
:
$params
->
{
product
};
my
$obj
=
Bugzilla::
Component
->
check
({
product
=>
$product
,
name
=>
$name
});
return
$obj
;
my
$old_comp
=
blessed
(
$invocant
)
?
$invocant
->
component
:
'';
my
$object
=
Bugzilla::
Component
->
check
({
product
=>
$product
,
name
=>
$name
});
if
(
$object
->
name
ne
$old_comp
&&
!
$object
->
is_active
)
{
ThrowUserError
('
value_inactive
',
{
class
=>
ref
(
$object
),
value
=>
$name
});
}
return
$object
;
}
sub
_check_creation_ts
{
...
...
@@ -1685,7 +1717,6 @@ sub _check_qa_contact {
$qa_contact
=
trim
(
$qa_contact
)
if
!
ref
$qa_contact
;
my
$component
=
blessed
(
$invocant
)
?
$invocant
->
component_obj
:
$params
->
{
component
};
my
$id
;
if
(
!
ref
$invocant
)
{
# Bugs get no QA Contact on creation if useqacontact is off.
return
undef
if
!
Bugzilla
->
params
->
{
useqacontact
};
...
...
@@ -1694,13 +1725,14 @@ sub _check_qa_contact {
if
(
!
Bugzilla
->
user
->
in_group
('
editbugs
',
$component
->
product_id
)
||
!
$qa_contact
)
{
$id
=
$component
->
default_qa_contact
->
id
;
return
$component
->
default_qa_contact
?
$component
->
default_qa_contact
->
id
:
undef
;
}
}
# If a QA Contact was specified or if we're updating, check
# the QA Contact for validity.
if
(
!
defined
$id
&&
$qa_contact
)
{
my
$id
;
if
(
$qa_contact
)
{
$qa_contact
=
Bugzilla::
User
->
check
(
$qa_contact
)
if
!
ref
$qa_contact
;
$id
=
$qa_contact
->
id
;
# create() checks this another way, so we don't have to run this
...
...
@@ -1881,10 +1913,14 @@ sub _check_target_milestone {
my
(
$invocant
,
$target
,
undef
,
$params
)
=
@_
;
my
$product
=
blessed
(
$invocant
)
?
$invocant
->
product_obj
:
$params
->
{
product
};
my
$old_target
=
blessed
(
$invocant
)
?
$invocant
->
target_milestone
:
'';
$target
=
trim
(
$target
);
$target
=
$product
->
default_milestone
if
!
defined
$target
;
my
$object
=
Bugzilla::
Milestone
->
check
(
{
product
=>
$product
,
name
=>
$target
});
if
(
$old_target
&&
$object
->
name
ne
$old_target
&&
!
$object
->
is_active
)
{
ThrowUserError
('
value_inactive
',
{
class
=>
ref
(
$object
),
value
=>
$target
});
}
return
$object
->
name
;
}
...
...
@@ -1907,8 +1943,11 @@ sub _check_version {
$version
=
trim
(
$version
);
my
$product
=
blessed
(
$invocant
)
?
$invocant
->
product_obj
:
$params
->
{
product
};
my
$object
=
Bugzilla::
Version
->
check
({
product
=>
$product
,
name
=>
$version
});
my
$old_vers
=
blessed
(
$invocant
)
?
$invocant
->
version
:
'';
my
$object
=
Bugzilla::
Version
->
check
({
product
=>
$product
,
name
=>
$version
});
if
(
$object
->
name
ne
$old_vers
&&
!
$object
->
is_active
)
{
ThrowUserError
('
value_inactive
',
{
class
=>
ref
(
$object
),
value
=>
$version
});
}
return
$object
->
name
;
}
...
...
@@ -2024,6 +2063,19 @@ sub _check_bugid_field {
return
$checked_id
;
}
sub
_check_textarea_field
{
my
(
$invocant
,
$text
,
$field
)
=
@_
;
$text
=
(
defined
$text
)
?
trim
(
$text
)
:
'';
# Web browsers submit newlines as \r\n.
# Sanitize all input to match the web standard.
# XMLRPC input could be either \n or \r\n
$text
=~
s/\r?\n/\r\n/g
;
return
$text
;
}
sub
_check_relationship_loop
{
# Generates a dependency tree for a given bug. Calls itself recursively
# to generate sub-trees for the bug's dependencies.
...
...
@@ -2445,9 +2497,9 @@ sub _set_product {
milestone
=>
$milestone_ok
?
$self
->
target_milestone
:
$product
->
default_milestone
};
$vars
{
components
}
=
[
map
{
$_
->
name
}
@
{
$product
->
components
}
];
$vars
{
milestones
}
=
[
map
{
$_
->
name
}
@
{
$product
->
milestones
}
];
$vars
{
versions
}
=
[
map
{
$_
->
name
}
@
{
$product
->
versions
}
];
$vars
{
components
}
=
[
map
{
$_
->
name
}
grep
(
$_
->
is_active
,
@
{
$product
->
components
})
];
$vars
{
milestones
}
=
[
map
{
$_
->
name
}
grep
(
$_
->
is_active
,
@
{
$product
->
milestones
})
];
$vars
{
versions
}
=
[
map
{
$_
->
name
}
grep
(
$_
->
is_active
,
@
{
$product
->
versions
})
];
}
if
(
!
$verified
)
{
...
...
@@ -2853,7 +2905,8 @@ sub add_see_also {
# ref bug id for sending changes email.
my
$ref_bug
=
delete
$field_values
->
{
ref_bug
};
if
(
$class
->
isa
('
Bugzilla::BugUrl::Bugzilla::Local
')
and
!
$skip_recursion
)
and
!
$skip_recursion
and
$ref_bug
->
check_can_change_field
('
see_also
',
'',
$self
->
id
,
\
$privs
))
{
$ref_bug
->
add_see_also
(
$self
->
id
,
'
skip_recursion
');
push
@
{
$self
->
{
_update_ref_bugs
}
},
$ref_bug
;
...
...
@@ -2885,12 +2938,15 @@ sub remove_see_also {
# we need to notify changes for that bug too.
$removed_bug_url
=
$removed_bug_url
->
[
0
];
if
(
!
$skip_recursion
and
$removed_bug_url
and
$removed_bug_url
->
isa
('
Bugzilla::BugUrl::Bugzilla::Local
'))
and
$removed_bug_url
->
isa
('
Bugzilla::BugUrl::Bugzilla::Local
')
and
$removed_bug_url
->
ref_bug_url
)
{
my
$ref_bug
=
Bugzilla::
Bug
->
check
(
$removed_bug_url
->
ref_bug_url
->
bug_id
);
if
(
Bugzilla
->
user
->
can_edit_product
(
$ref_bug
->
product_id
))
{
if
(
Bugzilla
->
user
->
can_edit_product
(
$ref_bug
->
product_id
)
and
$ref_bug
->
check_can_change_field
('
see_also
',
$self
->
id
,
'',
\
$privs
))
{
my
$self_url
=
$removed_bug_url
->
local_uri
(
$self
->
id
);
$ref_bug
->
remove_see_also
(
$self_url
,
'
skip_recursion
');
push
@
{
$self
->
{
_update_ref_bugs
}
},
$ref_bug
;
...
...
@@ -3165,8 +3221,6 @@ sub cc {
ORDER BY profiles.login_name}
,
undef
,
$self
->
bug_id
);
$self
->
{'
cc
'}
=
undef
if
!
scalar
(
@
{
$self
->
{'
cc
'}});
return
$self
->
{'
cc
'};
}
...
...
@@ -3418,9 +3472,6 @@ sub qa_contact {
if
(
Bugzilla
->
params
->
{'
useqacontact
'}
&&
$self
->
{'
qa_contact
'})
{
$self
->
{'
qa_contact_obj
'}
=
new
Bugzilla::
User
(
$self
->
{'
qa_contact
'});
}
else
{
# XXX - This is somewhat inconsistent with the assignee/reporter
# methods, which will return an empty User if they get a 0.
# However, we're keeping it this way now, for backwards-compatibility.
$self
->
{'
qa_contact_obj
'}
=
undef
;
}
return
$self
->
{'
qa_contact_obj
'};
...
...
@@ -3693,9 +3744,13 @@ sub bug_alias_to_id {
# Subroutines
#####################################################################
# Represents which fields from the bugs table are handled by process_bug.cgi.
# Returns a list of currently active and editable bug fields,
# including multi-select fields.
sub
editable_bug_fields
{