]> git.donarmstrong.com Git - debbugs.git/blobdiff - cgi/pkgreport.cgi
* Add lock support to read_bug
[debbugs.git] / cgi / pkgreport.cgi
index 47a10997ecd820102754afb1abcc2cc7df41de04..3c6afe36178b5d7137150d0fa99f21e24794d1df 100755 (executable)
@@ -19,24 +19,24 @@ use POSIX qw(strftime nice);
 use Debbugs::Config qw(:globals :text :config);
 use Debbugs::User;
 use Debbugs::CGI qw(version_url maint_decode);
-use Debbugs::Common qw(getparsedaddrs :date make_list getmaintainers);
+use Debbugs::Common qw(getparsedaddrs :date make_list getmaintainers getpseudodesc);
 use Debbugs::Bugs qw(get_bugs bug_filter newest_bug);
 use Debbugs::Packages qw(getsrcpkgs getpkgsrc get_versions);
 use Debbugs::Status qw(:status);
 use Debbugs::CGI qw(:all);
 
-use vars qw($gPackagePages $gWebDomain %gSeverityDisplay @gSeverityList);
-
-if (defined $ENV{REQUEST_METHOD} and $ENV{REQUEST_METHOD} eq 'HEAD') {
-    print "Content-Type: text/html; charset=utf-8\n\n";
-    exit 0;
-}
-
-nice(5);
+use Debbugs::Text qw(:templates);
 
 use CGI::Simple;
 my $q = new CGI::Simple;
 
+if ($q->request_method() eq 'HEAD') {
+     print $q->header(-type => "text/html",
+                     -charset => 'utf-8',
+                    );
+     exit 0;
+}
+
 our %param = cgi_parameters(query => $q,
                            single => [qw(ordering archive repeatmerged),
                                       qw(bug-rev pend-rev sev-rev),
@@ -46,6 +46,8 @@ our %param = cgi_parameters(query => $q,
                            default => {ordering => 'normal',
                                        archive  => 0,
                                        repeatmerged => 1,
+                                       include      => [],
+                                       exclude      => [],
                                       },
                           );
 
@@ -69,7 +71,6 @@ elsif (lc($param{archive}) eq 'yes') {
 }
 
 
-my $archive = ($param{'archive'} || "no") eq "yes";
 my $include = $param{'&include'} || $param{'include'} || "";
 my $exclude = $param{'&exclude'} || $param{'exclude'} || "";
 
@@ -85,7 +86,7 @@ unless (defined $ordering) {
    $ordering = "raw" if $raw_sort;
    $ordering = 'age' if $age_sort;
 }
-my ($bug_order) = $ordering =~ /(age(?:rev)?)/;
+our ($bug_order) = $ordering =~ /(age(?:rev)?)/;
 $bug_order = '' if not defined $bug_order;
 
 my $bug_rev = ($param{'bug-rev'} || "no") eq "yes";
@@ -165,7 +166,8 @@ our %cats = (
 );
 
 my @select_key = (qw(submitter maint pkg package src usertag),
-                 qw(status tag maintenc owner severity newest)
+                 qw(status tag maintenc owner severity newest),
+                 qw(correspondent),
                 );
 
 if (exists $param{which} and exists $param{data}) {
@@ -201,18 +203,19 @@ for my $user (map {split /[\s*,\s*]+/} make_list($param{users}||[])) {
 }
 
 if (defined $param{usertag}) {
-    my %select_ut = ();
-    my ($u, $t) = split /:/, $param{usertag}, 2;
-    Debbugs::User::read_usertags(\%select_ut, $u);
-    unless (defined $t && $t ne "") {
-        $t = join(",", keys(%select_ut));
-    }
-
-    add_user($u);
-    push @{$param{tag}}, split /,/, $t;
+     for my $usertag (make_list($param{usertag})) {
+         my %select_ut = ();
+         my ($u, $t) = split /:/, $usertag, 2;
+         Debbugs::User::read_usertags(\%select_ut, $u);
+         unless (defined $t && $t ne "") {
+              $t = join(",", keys(%select_ut));
+         }
+         add_user($u);
+         push @{$param{tag}}, split /,/, $t;
+     }
 }
 
-my $Archived = $archive ? " Archived" : "";
+my $Archived = $param{archive} ? " Archived" : "";
 
 our $this = munge_url('pkgreport.cgi?',
                      %param,
@@ -303,14 +306,27 @@ while (my ($key,$value) = splice @search_key_order, 0, 2) {
      for my $entry (make_list($param{$key})) {
          my $extra = '';
          if (exists $param{dist} and ($key eq 'package' or $key eq 'src')) {
-              my @versions = get_versions(package => $entry,
+              my %versions = get_versions(package => $entry,
                                           (exists $param{dist}?(dist => $param{dist}):()),
-                                          (exists $param{arch}?(arch => $param{arch}):()),
+                                          (exists $param{arch}?(arch => $param{arch}):(arch => $config{default_architectures})),
                                           ($key eq 'src'?(arch => q(source)):()),
+                                          no_source_arch => 1,
+                                          return_archs => 1,
                                          );
-              my $verdesc = join(', ',@versions);
-              $verdesc = 'version'.(@versions>1?'s ':' ').$verdesc;
-              $extra= " ($verdesc)" if @versions;
+              my $verdesc;
+              if (keys %versions > 1) {
+                   $verdesc = 'versions '. join(', ',
+                                   map { $_ .' ['.join(', ',
+                                                   sort @{$versions{$_}}
+                                                  ).']';
+                                  } keys %versions);
+              }
+              else {
+                   $verdesc = 'version '.join(', ',
+                                              keys %versions
+                                             );
+              }
+              $extra= " ($verdesc)" if keys %versions;
          }
          push @entries, $entry.$extra;
      }
@@ -320,12 +336,12 @@ my $title = $gBugs.' '.join(' and ', map {/ or /?"($_)":$_} @title);
 @title = ();
 
 # we have to special case the maint="" search, unfortunatly.
-if (defined $param{maint} and $param{maint} eq "") {
+if (defined $param{maint} and $param{maint} eq "" or ref($param{maint}) and not @{$param{maint}}) {
      my %maintainers = %{getmaintainers()};
      @bugs = get_bugs(function =>
                      sub {my %d=@_;
                           foreach my $try (splitpackages($d{"pkg"})) {
-                               return 1 if !getparsedaddrs($maintainers{$try});
+                               return 1 if not exists $maintainers{$try};
                           }
                           return 0;
                      }
@@ -397,9 +413,17 @@ for my $package (make_list($param{src}||[])) {
 
 sub output_package_info{
     my ($srcorbin,$package) = @_;
+
+    my %pkgsrc = %{getpkgsrc()};
+    my $srcforpkg = $package;
+    if ($srcorbin eq 'binary') {
+        $srcforpkg = $pkgsrc{$package};
+        defined $srcforpkg or $srcforpkg = $package;
+    }
+
     my $showpkg = html_escape($package);
     my $maintainers = getmaintainers();
-    my $maint = $maintainers->{$package};
+    my $maint = $maintainers->{$srcforpkg};
     if (defined $maint) {
         print '<p>';
         print htmlize_maintlinks(sub { $_[0] == 1 ? "Maintainer for $showpkg is "
@@ -410,12 +434,6 @@ sub output_package_info{
     } else {
         print "<p>No maintainer for $showpkg. Please do not report new bugs against this package.</p>\n";
     }
-    my %pkgsrc = %{getpkgsrc()};
-    my $srcforpkg = $package;
-    if ($srcorbin eq 'binary') {
-        $srcforpkg = $pkgsrc{$package};
-        defined $srcforpkg or $srcforpkg = $package;
-    }
     my @pkgs = getsrcpkgs($srcforpkg);
     @pkgs = grep( !/^\Q$package\E$/, @pkgs );
     if ( @pkgs ) {
@@ -426,7 +444,7 @@ sub output_package_info{
              print "<p>You may want to refer to the following individual bug pages:\n";
         }
         #push @pkgs, $src if ( $src && !grep(/^\Q$src\E$/, @pkgs) );
-        print join( ", ", map( "<A href=\"" . html_escape(munge_url($this,package=>$_)) . "\">$_</A>", @pkgs ) );
+        print join( ", ", map( "<A href=\"" . html_escape(munge_url($this,package=>$_,src=>[],newest=>[])) . "\">$_</A>", @pkgs ) );
         print ".\n";
     }
     my @references;
@@ -441,11 +459,11 @@ sub output_package_info{
         }
         if (defined $gSubscriptionDomain) {
              my $ptslink = $package ? $srcforpkg : $src;
-             push @references, "to the <a href=\"http://$gSubscriptionDomain/$ptslink\">Package Tracking System</a>";
+             push @references, q(to the <a href="http://).html_escape("$gSubscriptionDomain/$ptslink").q(">Package Tracking System</a>);
         }
         # Only output this if the source listing is non-trivial.
         if ($srcorbin eq 'binary' and $srcforpkg) {
-             push @references, sprintf "to the source package <a href=\"%s\">%s</a>'s bug page", html_escape(munge_url($this,src=>$srcforpkg,package=>[])), html_escape($srcforpkg);
+             push @references, sprintf "to the source package <a href=\"%s\">%s</a>'s bug page", html_escape(munge_url($this,src=>$srcforpkg,package=>[],newest=>[])), html_escape($srcforpkg);
         }
     }
     if (@references) {
@@ -458,9 +476,8 @@ sub output_package_info{
              html_escape("http://${debbugs::gWebDomain}/Reporting${debbugs::gHTMLSuffix}");
     }
     if (not $maint and not @bugs) {
-        print "<p>There is no record of the " .
-             ($srcorbin eq 'binary' ? html_escape($package) . " package"
-              : html_escape($src) . " source package").
+        print "<p>There is no record of the " . html_escape($package) .
+             ($srcorbin eq 'binary' ? " package" : " source package") .
                    ", and no bugs have been filed against it.</p>";
         $showresult = 0;
     }
@@ -520,12 +537,12 @@ print "    <td><input id=\"b_1_2\" name=vt value=bysuite type=radio onchange=\"e
 
 if (defined $pkg) {
     my $v = html_escape($version) || "";
-    my $pkgsane = html_escape($pkg);
+    my $pkgsane = html_escape($pkg->[0]);
     print "<tr><td></td>";
     print "    <td><input id=\"b_1_3\" name=vt value=bypkg type=radio onchange=\"enable(1);\" $checked_ver>$pkgsane version <input id=\"b_1_3_1\" name=version value=\"$v\"></td></tr>\n";
 } elsif (defined $src) {
     my $v = html_escape($version) || "";
-    my $srcsane = html_escape($src);
+    my $srcsane = html_escape($src->[0]);
     print "<tr><td></td>";
     print "    <td><input name=vt value=bysrc type=radio onchange=\"enable(1);\" $checked_ver>$srcsane version <input id=\"b_1_3_1\" name=version value=\"$v\"></td></tr>\n";
 }
@@ -556,7 +573,6 @@ print <<EOF;
 
 <tr><td>&nbsp;</td></tr>
 
-</td></tr>
 <tr><td>Merged bugs should be</td><td>
 <select name=repeatmerged>
 <option value=yes$sel_rmy>displayed separately</option>
@@ -640,16 +656,15 @@ sub pkg_htmlindexentrystatus {
         $showversions .= join ', ', map {s{/}{ }; html_escape($_)} @fixed;
     }
     $result .= ' (<a href="'.
-        version_url($status{package},
-                    $status{found_versions},
-                    $status{fixed_versions},
+        version_url(package => $status{package},
+                    found   => $status{found_versions},
+                    fixed   => $status{fixed_versions},
                    ).qq{">$showversions</a>)} if length $showversions;
     $result .= ";\n";
 
     $result .= $showseverity;
-    $result .= pkg_htmladdresslinks("Reported by: ", \&submitterurl,
-                                $status{originator});
-    $result .= ";\nOwned by: " . html_escape($status{owner})
+    $result .= "Reported by: ".package_links(submitter=>$status{originator});
+    $result .= ";\nOwned by: " . package_links(owner => $status{owner})
                if length $status{owner};
     $result .= ";\nTags: <strong>" 
                  . html_escape(join(", ", sort(split(/\s+/, $status{tags}))))
@@ -682,7 +697,7 @@ sub pkg_htmlindexentrystatus {
             $result .= ";\n<strong>Forwarded</strong> to "
                        . join(', ',
                              map {maybelink($_)}
-                             split /[,\s]+/,$status{forwarded}
+                             split /\,\s+/,$status{forwarded}
                             );
         }
        # Check the age of the logfile
@@ -749,13 +764,21 @@ sub pkg_htmlizebugs {
     my %include;
     my %exclude;
     for my $include (make_list($param{include})) {
+        next unless defined $include;
         my ($key,$value) = split /\s*:\s*/,$include,2;
-        next unless defined $value;
+        unless (defined $value) {
+            $key = 'tags';
+            $value = $include;
+        }
         push @{$include{$key}}, split /\s*,\s*/, $value;
     }
     for my $exclude (make_list($param{exclude})) {
+        next unless defined $exclude;
         my ($key,$value) = split /\s*:\s*/,$exclude,2;
-        next unless defined $value;
+        unless (defined $value) {
+            $key = 'tags';
+            $value = $exclude;
+        }
         push @{$exclude{$key}}, split /\s*,\s*/, $value;
     }
 
@@ -764,7 +787,7 @@ sub pkg_htmlizebugs {
                                      (exists $param{dist}?(dist => $param{dist}):()),
                                      bugusertags => \%bugusertags,
                                      (exists $param{version}?(version => $param{version}):()),
-                                     (exists $param{arch}?(arch => $param{arch}):()),
+                                     (exists $param{arch}?(arch => $param{arch}):(arch => $config{default_architectures})),
                                     )};
         next unless %status;
         next if bug_filter(bug => $bug,
@@ -802,7 +825,7 @@ sub pkg_htmlizebugs {
     if ($ordering eq "raw") {
         $result .= "<UL class=\"bugs\">\n" . join("", map( { $_->[ 2 ] } @status ) ) . "</UL>\n";
     } else {
-        $header .= "<ul>\n<div class=\"msgreceived\">\n";
+        $header .= "<div class=\"msgreceived\">\n<ul>\n";
        my @keys_in_order = ("");
        for my $o (@order) {
            push @keys_in_order, "X";
@@ -843,7 +866,7 @@ sub pkg_htmlizebugs {
         } 
         $header .= "</ul></div>\n";
 
-        $footer .= "<ul>\n<div class=\"msgreceived\">";
+        $footer .= "<div class=\"msgreceived\">\n<ul>\n";
         for my $i (0..$#prior) {
             my $local_result = '';
             foreach my $key ( @{$order[$i]} ) {
@@ -855,7 +878,7 @@ sub pkg_htmlizebugs {
                 $footer .= "<li>$names[$i]<ul>\n$local_result</ul></li>\n";
             }
         }
-        $footer .= "</div></ul>\n";
+        $footer .= "</ul>\n</div>\n";
     }
 
     $result = $header . $result if ( $common{show_list_header} );
@@ -876,16 +899,12 @@ sub pkg_htmlpackagelinks {
     return 'Package' . (@pkglist > 1 ? 's' : '') . ': ' .
            join(', ',
                 map {
-                    '<a class="submitter" href="' . munge_url($this,src=>[],package=>$_) . '">' .
+                    '<a class="submitter" href="' . munge_url($this,src=>[],package=>$_,newest=>[]) . '">' .
                     $openstrong . html_escape($_) . $closestrong . '</a>'
                 } @pkglist
            );
 }
 
-sub pkg_htmladdresslinks {
-     htmlize_addresslinks(@_,'submitter');
-}
-
 sub pkg_javascript {
     return <<EOF ;
 <script type="text/javascript">
@@ -1008,7 +1027,7 @@ sub pkg_htmlselectarch {
 sub myurl {
      return html_escape(pkg_url(map {exists $param{$_}?($_,$param{$_}):()}
                             qw(archive repeatmerged mindays maxdays),
-                            qw(version dist arch pkg src tag maint submitter)
+                            qw(version dist arch package src tag maint submitter)
                            )
                    );
 }
@@ -1095,9 +1114,9 @@ sub determine_ordering {
 
            ($h->{"nam"}) = make_list($param{"nam$i"})
                 if (defined $param{"nam$i"});
-            $h->{"ord"} = [ split /\s*,\s*/, make_list($param{"ord$i"}) ]
+            $h->{"ord"} = [ map {split /\s*,\s*/} make_list($param{"ord$i"}) ]
                 if (defined $param{"ord$i"});
-            $h->{"ttl"} = [ split /\s*,\s*/, make_list($param{"ttl$i"}) ]
+           $h->{"ttl"} = [ map {split /\s*,\s*/} make_list($param{"ttl$i"}) ]
                 if (defined $param{"ttl$i"});
 
             push @c, $h;