]> git.donarmstrong.com Git - debbugs.git/blobdiff - cgi/pkgreport.cgi
* Add html template directory
[debbugs.git] / cgi / pkgreport.cgi
index eb33dc1f3fae32691025d4a6670d70461f4e924c..a841b2089cb4d3f060d6fe61f4b6a7c5b955e86f 100755 (executable)
@@ -19,8 +19,8 @@ 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::Bugs qw(get_bugs bug_filter);
+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);
@@ -41,7 +41,7 @@ our %param = cgi_parameters(query => $q,
                            single => [qw(ordering archive repeatmerged),
                                       qw(bug-rev pend-rev sev-rev),
                                       qw(maxdays mindays version),
-                                      qw(data which dist),
+                                      qw(data which dist newest),
                                      ],
                            default => {ordering => 'normal',
                                        archive  => 0,
@@ -85,7 +85,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 +165,7 @@ our %cats = (
 );
 
 my @select_key = (qw(submitter maint pkg package src usertag),
-                 qw(status tag maintenc owner severity)
+                 qw(status tag maintenc owner severity newest)
                 );
 
 if (exists $param{which} and exists $param{data}) {
@@ -201,15 +201,16 @@ 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" : "";
@@ -303,24 +304,37 @@ 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;
      }
      push @title,$value.' '.join(' or ', @entries);
 }
-my $title = join(' and ', map {/ or /?"($_)":$_} @title);
+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=@_;
@@ -330,7 +344,12 @@ if (defined $param{maint} and $param{maint} eq "") {
                           return 0;
                      }
                     );
-     $title = 'in packages with no maintainer';
+     $title = $gBugs.' in packages with no maintainer';
+}
+elsif (defined $param{newest}) {
+     my $newest_bug = newest_bug();
+     @bugs = ($newest_bug - $param{newest} + 1) .. $newest_bug;
+     $title = @bugs.' newest '.$gBugs;
 }
 else {
      #yeah for magick!
@@ -368,7 +387,7 @@ print "<HTML><HEAD>\n" .
     "</HEAD>\n" .
     '<BODY onload="pagemain();">' .
     "\n";
-print "<H1>" . "$gProject$Archived $gBug report logs: $gBugs $title" .
+print "<H1>" . "$gProject$Archived $gBug report logs: $title" .
       "</H1>\n";
 
 my $showresult = 1;
@@ -392,9 +411,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 "
@@ -405,12 +432,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 ) {
@@ -421,7 +442,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;
@@ -436,11 +457,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) {
@@ -453,9 +474,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;
     }
@@ -515,12 +535,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";
 }
@@ -551,7 +571,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>
@@ -635,9 +654,9 @@ 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";
 
@@ -677,7 +696,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
@@ -744,13 +763,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;
     }
 
@@ -759,7 +786,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,
@@ -797,7 +824,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";
@@ -838,7 +865,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]} ) {
@@ -850,7 +877,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} );
@@ -871,7 +898,7 @@ 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
            );
@@ -1090,9 +1117,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;