716a11e88074882f4ae83a987aeee664a164bd3d
[WebKit-https.git] / Websites / bugs.webkit.org / show_bug.cgi
1 #!/usr/bin/env perl -wT
2 # -*- Mode: perl; indent-tabs-mode: nil -*-
3 #
4 # The contents of this file are subject to the Mozilla Public
5 # License Version 1.1 (the "License"); you may not use this file
6 # except in compliance with the License. You may obtain a copy of
7 # the License at http://www.mozilla.org/MPL/
8 #
9 # Software distributed under the License is distributed on an "AS
10 # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11 # implied. See the License for the specific language governing
12 # rights and limitations under the License.
13 #
14 # The Original Code is the Bugzilla Bug Tracking System.
15 #
16 # The Initial Developer of the Original Code is Netscape Communications
17 # Corporation. Portions created by Netscape are
18 # Copyright (C) 1998 Netscape Communications Corporation. All
19 # Rights Reserved.
20 #
21 # Contributor(s): Terry Weissman <terry@mozilla.org>
22
23 use strict;
24
25 use lib qw(. lib);
26
27 use Bugzilla;
28 use Bugzilla::Constants;
29 use Bugzilla::Error;
30 use Bugzilla::User;
31 use Bugzilla::Keyword;
32 use Bugzilla::Bug;
33
34 my $cgi = Bugzilla->cgi;
35 my $template = Bugzilla->template;
36 my $vars = {};
37
38 my $user = Bugzilla->login();
39
40 my $format = $template->get_format("bug/show", scalar $cgi->param('format'),
41                                    scalar $cgi->param('ctype'));
42
43 # Editable, 'single' HTML bugs are treated slightly specially in a few places
44 my $single = !$format->{format} && $format->{extension} eq 'html';
45
46 # If we don't have an ID, _AND_ we're only doing a single bug, then prompt
47 if (!$cgi->param('id') && $single) {
48     print Bugzilla->cgi->header();
49     $template->process("bug/choose.html.tmpl", $vars) ||
50       ThrowTemplateError($template->error());
51     exit;
52 }
53
54 my @bugs = ();
55 my %marks;
56
57 if ($single) {
58     my $id = $cgi->param('id');
59     # Its a bit silly to do the validation twice - that functionality should
60     # probably move into Bug.pm at some point
61     ValidateBugID($id);
62     push @bugs, new Bugzilla::Bug($id);
63     if (defined $cgi->param('mark')) {
64         foreach my $range (split ',', $cgi->param('mark')) {
65             if ($range =~ /^(\d+)-(\d+)$/) {
66                foreach my $i ($1..$2) {
67                    $marks{$i} = 1;
68                }
69             } elsif ($range =~ /^(\d+)$/) {
70                $marks{$1} = 1;
71             }
72         }
73     }
74 } else {
75     foreach my $id ($cgi->param('id')) {
76         # Be kind enough and accept URLs of the form: id=1,2,3.
77         my @ids = split(/,/, $id);
78         foreach (@ids) {
79             my $bug = new Bugzilla::Bug($_);
80             # This is basically a backwards-compatibility hack from when
81             # Bugzilla::Bug->new used to set 'NotPermitted' if you couldn't
82             # see the bug.
83             if (!$bug->{error} && !$user->can_see_bug($bug->bug_id)) {
84                 $bug->{error} = 'NotPermitted';
85             }
86             push(@bugs, $bug);
87         }
88     }
89 }
90
91 # Determine if Patch Viewer is installed, for Diff link
92 eval {
93   require PatchReader;
94   $vars->{'patchviewerinstalled'} = 1;
95 };
96
97 $vars->{'bugs'} = \@bugs;
98 $vars->{'marks'} = \%marks;
99 $vars->{'use_keywords'} = 1 if Bugzilla::Keyword::keyword_count();
100
101 my @bugids = map {$_->bug_id} grep {!$_->error} @bugs;
102 $vars->{'bugids'} = join(", ", @bugids);
103
104 # Next bug in list (if there is one)
105 my @bug_list;
106 if ($cgi->cookie("BUGLIST")) {
107     @bug_list = split(/:/, $cgi->cookie("BUGLIST"));
108 }
109
110 $vars->{'bug_list'} = \@bug_list;
111
112 # Work out which fields we are displaying (currently XML only.)
113 # If no explicit list is defined, we show all fields. We then exclude any
114 # on the exclusion list. This is so you can say e.g. "Everything except 
115 # attachments" without listing almost all the fields.
116 my @fieldlist = (Bugzilla::Bug->fields, 'group', 'long_desc', 
117                  'attachment', 'attachmentdata', 'token');
118 my %displayfields;
119
120 if ($cgi->param("field")) {
121     @fieldlist = $cgi->param("field");
122 }
123
124 unless (Bugzilla->user->in_group(Bugzilla->params->{"timetrackinggroup"})) {
125     @fieldlist = grep($_ !~ /(^deadline|_time)$/, @fieldlist);
126 }
127
128 foreach (@fieldlist) {
129     $displayfields{$_} = 1;
130 }
131
132 foreach ($cgi->param("excludefield")) {
133     $displayfields{$_} = undef;    
134 }
135
136 $vars->{'displayfields'} = \%displayfields;
137
138 print $cgi->header($format->{'ctype'});
139
140 $template->process($format->{'template'}, $vars)
141   || ThrowTemplateError($template->error());