Removed /usr/local from CDPATH
[clearscm.git] / cq / cqd / releasenotes.cgi
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         releasenotes.cgi,v
5 # Revision:     1.1.1.1
6 # Description:  Produce an HTML table of bugs for a release page
7 # Author:       Andrew@DeFaria.com
8 # Created:      Fri May 31 15:34:50  2002
9 # Modified:     2007/05/17 07:45:48
10 # Language:     Perl
11 #
12 # (c) Copyright 2007, ClearSCM, Inc., all rights reserved.
13 #
14 ################################################################################
15 use strict;
16 use CGI qw/:standard *table/;
17 use Cwd;
18 use lib qw(//sonscentral/users/adefaria/www/cgi-bin);
19 use cqc;
20
21 #%cqc::fields;
22 #$cqc::command;
23
24 my $page = new CGI;
25
26 my $release = $page->param ("release");
27 my @intro_notes;
28 my @buglines;
29
30 # Colors
31 my $header_background = "#ffffcc";
32 my $header_foreground = "#000000";
33 my $data_background   = "#ffffff";
34 my $data_foreground   = "#000000";
35
36 sub Error;
37 sub Footing;
38
39 sub ReleaseForm {
40   print
41     start_form ({-action => "/Release/releasenotes.cgi",
42                  -method => "post"}) . 
43       h4 ("Look up other Release:",
44           textfield ({-name  => "release",
45                       -size  => 12,
46                       -value => "Please specify"}),
47           submit ({-value => "Display"})
48            ) . end_form . "\n";
49 } # ReleaseForm
50
51 sub Heading {
52   my $release = shift;
53
54   if ($release) {
55     print header     (-title   => "Release $release")          . "\n" .
56           start_html (-title   => "Release $release",
57                       -author  => "Andrew\@DeFaria.com",
58                       -link    => "#0000ee",
59                       -vlink   => "#cc33cc",
60                       -alink   => "#ff0000",
61                       -bgcolor => "#eeffff",
62                       -text    => "#000000",
63                       -script  => {-language => "JavaScript1.2",
64                                    -src      => "/Javascript/Heading.js"}),
65           p          ({-align => "right"},
66                      a ({-href => "/Release/addbug"}, "Add a bug to a release") . "\n" . br
67                      a ({-href => "file://///sons-clearcase/Views/official/Tools/bin/clearcase/triggers/data/rel_2.2.lst"}, "Official US 2.2 list") . "\n" . br
68                      a ({-href => "file://///sons-cc/Views/official/Tools/bin/clearcase/triggers/data/china_2.2.lst"}, "Official Shanghai 2.2 list")) . "\n" .
69           h1         ({-align=>"CENTER"}, "Release $release") . "\n" .
70           h2         ("Introduction")                         . "\n";
71   } else {
72     print header     (-title  => "Release $release")          . "\n" .
73           start_html (-title  => "Release $release",
74                       -author => "Andrew\@DeFaria.com")                . "\n";
75     Error "Release not specified!";
76   } # if
77 } # Heading
78
79 sub Footing {
80   ReleaseForm;
81   print script ({-language => "JavaScript1.2",
82                  -src      => "/JavaScript/Footing.js"}) . "\n";
83   print end_html;
84 } # Footing
85
86 sub PrintIntroNotes {
87   (scalar (@intro_notes) == 0) ? return : print ul (@intro_notes) . "\n";
88 } # PrintIntroNotes
89
90 sub LockedLabel {
91   my $bugid = shift;
92
93   # We need to set a view context. Use the official view
94   my $cwd = cwd;
95
96   my $vob_server = "sons-clearcase";
97   my $view_path  = "Views";
98   my $view_name  = "official";
99   my $vob        = "salira";
100   my $official_view = '\\\\'       .
101                       $vob_server  .
102                       '\\'         .
103                       $view_path   .
104                       '\\'         .
105                       $view_name   .
106                       '\\'         .
107                       $vob;
108
109   chdir $official_view or die "Unable to set view context";
110   my $output = `cleartool lslock -short lbtype:$bugid`;
111   chomp $output;
112   chdir $cwd or die "Unable to return from view context\n";
113
114   # lslock returns the label if it is locked, otherwise it returns
115   # an empty string
116   return $output;
117 } # LabelLocked
118
119 sub ParseBugFile {
120   my $buglist = shift;
121   my ($result, $owner, $description, $bugid, $state, $line);
122   my $bugnbr = 0;
123   my $locked;
124
125   open BUGLIST, "$buglist" or Error "Unable to open buglist: $buglist";
126
127   while ($line = <BUGLIST>) {
128     next if $line =~ /^\#/;     # Skip comments
129     chomp $line;
130     if ($line =~ /^\*/) {
131       ($result, $line) = split (/\* /, $line);
132       push (@intro_notes, li ([$line]) . "\n");
133     } else {
134       ($bugid) = split (/\s+/, $line);
135       $result = cqc::GetBugRecord ($bugid, %fields);
136       ($result <= 0) ? $owner = "Unknown" : $owner = $fields {owner};
137       if ($result < 0) {
138         $description = "Unable to connect to server!";
139       } elsif ($result > 0) {
140         $description = "Bug ID not found in Clearquest!";
141       } else {
142         # Description's too large. Use headline instead.
143         $description = $fields {headline};
144       } # if
145
146       if (LockedLabel ($bugid)) {
147         $locked = img ({-src => "/Images/CheckMark.gif"});
148       } else {
149         $locked = "&nbsp;";
150       } #if
151
152       if ($fields {state} eq "Verified" or $fields {state} eq "Closed") {
153         $state = $fields {state};
154         $locked = img ({-src => "/Images/CheckMark.gif"});
155       } else {
156         $state = b (font ({-color => "Red"}, $fields {state}));
157       } # if
158
159       push (@buglines,
160         td ({-width   => "25",
161              -align   => "center",
162              -bgcolor => $data_background},
163             small ++$bugnbr) .
164         td ({-bgcolor => $data_background},
165             small (a ({-href => "/cgi-bin/bugdetails.cgi?bugid=$bugid"}, $bugid))) .
166         td ({-bgcolor => $data_background},
167             small $state) .
168         td ({-align   => "center",
169              -bgcolor => $data_background},
170             small (a ({-href => "mailto:$owner\@salira.com"}, $owner))) .
171         td ({-align   => "center",
172              -valign  => "center",
173              -bgcolor => $data_background},
174             $locked) . 
175         td ({-bgcolor => $data_background},
176             small $description) . "\n");
177     } # if
178   } # while
179 } # ParseBugFile
180
181 sub PrintBugTable {
182   if (scalar (@buglines) == 0) {
183     print h3 ("No bugs found!");
184   } else {
185     my $bugs = (scalar (@buglines) > 1) ? " bugs" : " bug";
186     print "<table cellpadding=0 cellspacing=1 border=0 width=95% align=center bgcolor=Black>\n";
187     print caption (small (strong (scalar (@buglines) . $bugs . " in this release"))) . "\n";
188     print "<tbody><tr><td valign=top>\n";
189     print start_table({-align       => "center",
190                        -border      => 1,
191                        -cellspacing => 1,
192                        -cellpadding => 2,
193                        -width       => "100%"}) . "\n" .
194       Tr ({-valign => "top", -bgcolor => $header_background}, [
195         th ({-width => "25"}, 
196              font ({-color => $header_foreground}, small ("#"))) .
197         th (font ({-color => $header_foreground}, small ("Bug ID"))) .
198         th (font ({-color => $header_foreground}, small ("State"))) .
199         th (font ({-color => $header_foreground}, small ("Owner"))) .
200         th (font ({-color => $header_foreground}, small ("Locked?"))) .
201         th (font ({-color => $header_foreground}, small ("Description")))
202         ]) . "\n" .  
203       Tr({-valign=>"TOP"}, \@buglines) . "\n" .
204       end_table . "\n" .
205       end_table;
206   } # if
207 } # PrintBugTable
208
209 sub Error {
210   my $errmsg = shift;
211   print h3 ({-style => "Color: red;",
212              -align => "CENTER"}, "ERROR: " . $errmsg);
213   Footing;
214   exit 1;
215 } # Error
216
217 # Main
218 Heading $release;
219 if ($release) {
220   ParseBugFile ($release . ".bugs");
221   PrintIntroNotes (@intro_notes);
222   PrintBugTable (@buglines);
223   Footing;
224 } # if