]> git.donarmstrong.com Git - debbugs.git/blob - cgi/common.pl
[project @ 1999-10-25 06:18:13 by gecko]
[debbugs.git] / cgi / common.pl
1 #!/usr/bin/perl -w
2
3 sub quit {
4         my $msg = shift;
5         print header . start_html("Error");
6         print "An error occurred. Dammit.\n";
7         print "Error was: $msg.\n";
8         print end_html;
9         exit 0;
10 }
11
12 sub abort {
13         my $msg = shift;
14         my $archive = shift;
15         print header . start_html("Sorry");
16         print "Sorry bug #$msg doesn't seem to be in the $archive database.\n";
17         print end_html;
18         exit 0;
19 }
20
21 sub htmlindexentry {
22     my $ref = shift;
23         my $archive = shift;
24
25     my %status = getbugstatus($ref, $archive );
26     my $result = "";
27
28     if  ($status{severity} eq 'normal') {
29         $showseverity = '';
30     } elsif (grep($status{severity} eq $_, @debbugs::gStrongSeverities)) {
31         $showseverity = "<strong>Severity: $status{severity}</strong>;\n";
32     } else {
33         $showseverity = "Severity: <em>$status{severity}</em>;\n";
34     }
35
36     $result .= "Package: <a href=\"" . pkgurl($status{"package"}) . "\"><strong>"
37                . htmlsanit($status{"package"}) . "</strong></a>;\n"
38                        if (length($status{"package"}));
39     $result .= $showseverity;
40     $result .= "Reported by: " . htmlsanit($status{originator});
41     $result .= ";\nKeywords: " . htmlsanit($status{keywords})
42                        if (length($status{keywords}));
43
44     my @merged= split(/ /,$status{mergedwith});
45     if (@merged) {
46         my $mseparator= ";\nmerged with ";
47         for my $m (@merged) {
48             $result .= $mseparator."<A href=\"" . bugurl($m) . "\">#$m</A>";
49             $mseparator= ", ";
50         }
51     }
52
53     if (length($status{done})) {
54         $result .= ";\n<strong>Done:</strong> " . htmlsanit($status{done});
55     } elsif (length($status{forwarded})) {
56         $result .= ";\n<strong>Forwarded</strong> to "
57                    . htmlsanit($status{forwarded});
58     } else {
59         my $daysold = int((time - $status{date}) / 86400);   # seconds to days
60         if ($daysold >= 7) {
61             my $font = "";
62             my $efont = "";
63             $font = "em" if ($daysold > 30);
64             $font = "strong" if ($daysold > 60);
65             $efont = "</$font>" if ($font);
66             $font = "<$font>" if ($font);
67
68             my $yearsold = int($daysold / 364);
69             $daysold = $daysold - $yearsold * 364;
70
71             $result .= ";\n $font";
72             $result .= "1 year and " if ($yearsold == 1);
73             $result .= "$yearsold years and " if ($yearsold > 1);
74             $result .= "1 day old" if ($daysold == 1);
75             $result .= "$daysold days old" if ($daysold != 1);
76             $result .= "$efont";
77         }
78     }
79
80     $result .= ".";
81
82     return $result;
83 }
84
85 sub pkgurl {
86     my $ref = shift;
87     my $params = "pkg=$ref";
88     foreach my $val (@_) { 1 }
89     
90     return $debbugs::gCGIDomain . "pkgreport.cgi" . "?" . "$params";
91 }
92
93 %saniarray= ('<','lt', '>','gt', '&','amp', '"','quot');
94
95 sub htmlsanit {
96     my $in = shift;
97     my $out;
98     while ($in =~ m/[<>&"]/) {
99         $out.= $`. '&'. $saniarray{$&}. ';';
100         $in=$';
101     }
102     $out .= $in;
103     return $out;
104 }
105
106 sub bugurl {
107     my $ref = shift;
108     my $params = "bug=$ref";
109     foreach my $val (@_) {
110         $params .= "\&msg=$1" if ($val =~ /^msg=([0-9]+)/);
111         $params .= "\&archive=yes" if ($val =~ /^archive=1/);
112     }
113         
114     return $debbugs::gCGIDomain . "bugreport.cgi" . "?" . "$params";
115 }
116
117 sub packageurl {
118     my $ref = shift;
119     return $debbugs::gCGIDomain . "package.cgi" . "?" . "package=$ref";
120 }
121
122 sub allbugs {
123     my @bugs = ();
124
125     opendir(D, "$debbugs::gSpoolDir/db") || &quit("opendir db: $!");
126     @bugs = sort { $a <=> $b }
127                  grep s/\.status$//,
128                  (grep m/^[0-9]+\.status$/,
129                  (readdir(D)));
130     closedir(D);
131
132     return @bugs;
133 }
134
135 sub pkgbugs {
136     my $pkg = shift;
137         my $archive = shift;
138         if ( $archive ) { open I, "<$debbugs::gSpoolDir/index.archive" || &quit("bugindex: $!"); } 
139         else { open I, "<$debbugs::gSpoolDir/index.db" || &quit("bugindex: $!"); } 
140     
141     while(<I>) 
142         {       if (/^$pkg\s+(\d+)\s+(.+)/)
143                 {       
144                         my $tmpstr = sprintf( "%d: %s", $1, $2 );
145                         $descstr{ $1 } = $tmpstr;
146                 }
147     }
148     return %descstr;
149 }
150
151 sub pkgbugsindex {
152         my $archive = shift;
153     my @bugs = ();
154         if ( $archive ) { open I, "<$debbugs::gSpoolDir/index.archive" || &quit("bugindex: $!"); } 
155         else { open I, "<$debbugs::gSpoolDir/index.db" || &quit("bugindex: $!"); } 
156     while(<I>) { $descstr{ $1 } = 1 if (/^(\S+)/); }
157     return %descstr;
158 }
159
160 sub maintencoded {
161     my $input = $_;
162         my $encoded = '';
163
164     while ($input =~ m/\W/) 
165         {       $encoded.=$`.sprintf("-%02x_",unpack("C",$&));
166         $input= $';
167     }
168     $encoded.= $input;
169     $encoded =~ s/-2e_/\./g;
170     $encoded =~ s/^([^,]+)-20_-3c_(.*)-40_(.*)-3e_/$1,$2,$3,/;
171     $encoded =~ s/^(.*)-40_(.*)-20_-28_([^,]+)-29_$/,$1,$2,$3/;
172     $encoded =~ s/-20_/_/g;
173     $encoded =~ s/-([^_]+)_-/-$1/g;
174         return $input;
175 }
176 sub getmaintainers {
177     my %maintainer;
178
179     open(MM,"$gMaintainerFile") || &quit("open $gMaintainerFile: $!");
180     while(<MM>) {
181         m/^(\S+)\s+(\S.*\S)\s*$/ || &quit("$gMaintainerFile: \`$_'");
182         ($a,$b)=($1,$2);
183         $a =~ y/A-Z/a-z/;
184         $maintainer{$a}= $b;
185     }
186     close(MM);
187
188     return %maintainer;
189 }
190
191 sub getbugstatus {
192         my $bugnum = shift;
193         my $archive = shift;
194
195         my %status;
196
197         if ( $archive )
198         {       my $archdir = $bugnum % 100;
199                 open(S,"$gSpoolDir/archive/$archdir/$bugnum.status" ) || &abort("$bugnum", "archive" );
200         } else
201                 { open(S,"$gSpoolDir/db/$bugnum.status") || &abort("$bugnum"); }
202         my @lines = qw(originator date subject msgid package keywords done
203                         forwarded mergedwith severity);
204         while(<S>) {
205                 chomp;
206                 $status{shift @lines} = $_;
207         }
208         close(S);
209         $status{shift @lines} = '' while(@lines);
210
211         $status{package} =~ s/\s*$//;
212         $status{package} = 'unknown' if ($status{package} eq '');
213         $status{severity} = 'normal' if ($status{severity} eq '');
214
215         $status{pending} = 'pending';
216         $status{pending} = 'forwarded' if (length($status{forwarded}));
217         $status{pending} = 'done'      if (length($status{done}));
218
219         return %status;
220 }
221
222 sub buglog {
223         my $bugnum = shift;
224         my $archive = shift;
225         if ( $archive )
226         {       my $archdir = $bugnum % 100;
227                 return "$gSpoolDir/archive/$archdir/$bugnum.log";
228         } else { return "$gSpoolDir/db/$bugnum.log"; }
229 }
230
231 1