-if (defined $pkg) {
- $title = "package $pkg";
- add_user("$pkg\@packages.debian.org");
- if (defined $version) {
- $title .= " (version $version)";
- } elsif (defined $dist) {
- $title .= " in $dist";
- my $verdesc = getversiondesc($pkg);
- $title .= " ($verdesc)" if defined $verdesc;
- }
- my @pkgs = split /,/, $pkg;
- @bugs = @{getbugs(sub {my %d=@_;
- foreach my $try (splitpackages($d{"pkg"})) {
- return 1 if grep($try eq $_, @pkgs);
- }
- return 0;
- }, 'package', @pkgs)};
-} elsif (defined $src) {
- add_user("$src\@packages.debian.org");
- $title = "source $src";
- set_option('arch', 'source');
- if (defined $version) {
- $title .= " (version $version)";
- } elsif (defined $dist) {
- $title .= " in $dist";
- my $verdesc = getversiondesc($src);
- $title .= " ($verdesc)" if defined $verdesc;
- }
- my @pkgs = ();
- my @srcs = split /,/, $src;
- foreach my $try (@srcs) {
- push @pkgs, getsrcpkgs($try);
- push @pkgs, $try if ( !grep(/^\Q$try\E$/, @pkgs) );
- }
- @bugs = @{getbugs(sub {my %d=@_;
- foreach my $try (splitpackages($d{"pkg"})) {
- return 1 if grep($try eq $_, @pkgs);
- }
- return 0;
- }, 'package', @pkgs)};
-} elsif (defined $maint) {
- my %maintainers = %{getmaintainers()};
- add_user($maint);
- $title = "maintainer $maint";
- $title .= " in $dist" if defined $dist;
- if ($maint eq "") {
- @bugs = @{getbugs(sub {my %d=@_;
- foreach my $try (splitpackages($d{"pkg"})) {
- return 1 if !getparsedaddrs($maintainers{$try});
- }
- return 0;
- })};
- } else {
- my @maints = split /,/, $maint;
- my @pkgs = ();
- foreach my $try (@maints) {
- foreach my $p (keys %maintainers) {
- my @me = getparsedaddrs($maintainers{$p});
- push @pkgs, $p if grep { $_->address eq $try } @me;
- }
- }
- @bugs = @{getbugs(sub {my %d=@_;
- foreach my $try (splitpackages($d{"pkg"})) {
- my @me = getparsedaddrs($maintainers{$try});
- return 1 if grep { $_->address eq $maint } @me;
- }
- return 0;
- }, 'package', @pkgs)};
- }
-} elsif (defined $maintenc) {
- my %maintainers = %{getmaintainers()};
- $title = "encoded maintainer $maintenc";
- $title .= " in $dist" if defined $dist;
- @bugs = @{getbugs(sub {my %d=@_;
- foreach my $try (splitpackages($d{"pkg"})) {
- my @me = getparsedaddrs($maintainers{$try});
- return 1 if grep {
- maintencoded($_->address) eq $maintenc
- } @me;
- }
- return 0;
- })};
-} elsif (defined $submitter) {
- add_user($submitter);
- $title = "submitter $submitter";
- $title .= " in $dist" if defined $dist;
- my @submitters = split /,/, $submitter;
- @bugs = @{getbugs(sub {my %d=@_;
- my @se = getparsedaddrs($d{"submitter"} || "");
- foreach my $try (@submitters) {
- return 1 if grep { $_->address eq $try } @se;
- }
- }, 'submitter-email', @submitters)};
-} elsif (defined($severity) && defined($status)) {
- $title = "$status $severity bugs";
- $title .= " in $dist" if defined $dist;
- my @severities = split /,/, $severity;
- my @statuses = split /,/, $status;
- @bugs = @{getbugs(sub {my %d=@_;
- return (grep($d{"severity"} eq $_, @severities))
- && (grep($d{"status"} eq $_, @statuses));
- })};
-} elsif (defined($severity)) {
- $title = "$severity bugs";
- $title .= " in $dist" if defined $dist;
- my @severities = split /,/, $severity;
- @bugs = @{getbugs(sub {my %d=@_;
- return (grep($d{"severity"} eq $_, @severities));
- }, 'severity', @severities)};
-} elsif (defined($tag)) {
- $title = "bugs tagged $tag";
- $title .= " in $dist" if defined $dist;
- my @tags = split /,/, $tag;
- my %bugs = ();
- for my $t (@tags) {
- for my $b (@{$ut{$t}}) {
- $bugs{$b} = 1;
- }
- }
- @bugs = @{getbugs(sub {my %d = @_;
- return 1 if $bugs{$d{"bug"}};
- my %tags = map { $_ => 1 } split ' ', $d{"tags"};
- return grep(exists $tags{$_}, @tags);
- })};
+
+# addusers for source and binary packages being searched for
+my $pkgsrc = getpkgsrc();
+my $srcpkg = getsrcpkgs();
+for my $package (# For binary packages, add the binary package
+ # and corresponding source package
+ make_list($param{package}||[]),
+ (map {defined $pkgsrc->{$_}?($pkgsrc->{$_}):()}
+ make_list($param{package}||[]),
+ ),
+ # For source packages, add the source package
+ # and corresponding binary packages
+ make_list($param{src}||[]),
+ (map {defined $srcpkg->{$_}?($srcpkg->{$_}):()}
+ make_list($param{src}||[]),
+ ),
+ ) {
+ next unless defined $package;
+ add_user($package.'@'.$config{usertag_package_domain})
+ if defined $config{usertag_package_domain};
+}
+
+
+# walk through the keys and make the right get_bugs query.
+
+my @search_key_order = (package => 'in package',
+ tag => 'tagged',
+ severity => 'with severity',
+ src => 'in source package',
+ maint => 'in packages maintained by',
+ submitter => 'submitted by',
+ owner => 'owned by',
+ status => 'with status',
+ );
+my %search_keys = @search_key_order;
+
+# Set the title sanely and clean up parameters
+my @title;
+while (my ($key,$value) = splice @search_key_order, 0, 2) {
+ next unless exists $param{$key};
+ my @entries = ();
+ $param{$key} = [map {split /\s*,\s*/} make_list($param{$key})];
+ 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,
+ (exists $param{dist}?(dist => $param{dist}):()),
+ (exists $param{arch}?(arch => $param{arch}):()),
+ ($key eq 'src'?(arch => q(source)):()),
+ );
+ my $verdesc = join(', ',@versions);
+ $verdesc = 'version'.(@versions>1?'s ':' ').$verdesc;
+ $extra= " ($verdesc)" if @versions;
+ }
+ push @entries, $entry.$extra;
+ }
+ push @title,$value.' '.join(' or ', @entries);
+}
+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 "") {
+ my %maintainers = %{getmaintainers()};
+ @bugs = get_bugs(function =>
+ sub {my %d=@_;
+ foreach my $try (splitpackages($d{"pkg"})) {
+ return 1 if !getparsedaddrs($maintainers{$try});
+ }
+ return 0;
+ }
+ );
+ $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!
+ @bugs = get_bugs((map {exists $param{$_}?($_,$param{$_}):()}
+ keys %search_keys, 'archive'),
+ usertags => \%ut,
+ );