+# walk through the keys and make the right get_bugs query.
+
+my $form_option_variables = {};
+$form_option_variables->{search_key_order} = [@package_search_key_order];
+
+# Set the title sanely and clean up parameters
+my @title;
+my @temp = @package_search_key_order;
+while (my ($key,$value) = splice @temp, 0, 2) {
+ next unless exists $param{$key};
+ my @entries = ();
+ for my $entry (make_list($param{$key})) {
+ # we'll handle newest below
+ 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}):(arch => $config{default_architectures})),
+ ($key eq 'src'?(arch => q(source)):()),
+ no_source_arch => 1,
+ return_archs => 1,
+ @schema_arg,
+ );
+ 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;
+ }
+ if ($key eq 'maint' and $entry eq '') {
+ push @entries, "no one (packages without maintainers)"
+ }
+ else {
+ push @entries, $entry.$extra;
+ }
+ }
+ if ($key eq 'newest') {
+ push @title, 'in '.join(' or ',@entries).' newest reports';
+ } else {
+ push @title,$value.' '.join(' or ', @entries) if @entries;
+ }
+}
+
+my $title = $gBugs.' '.join(' and ', map {/ or /?"($_)":$_} @title);
+@title = ();
+
+#yeah for magick!
+@bugs = get_bugs((map {exists $param{$_}?($_,$param{$_}):()}
+ keys %package_search_keys, 'archive'),
+ usertags => \%ut,
+ @schema_arg,
+ );
+
+# shove in bugs which affect this package if there is a package or a
+# source given (by default), but no affects options given
+if (not exists $param{affects} and not exists $param{noaffects} and
+ (exists $param{src} or
+ exists $param{package})) {
+ push @bugs, get_bugs((map {my $key = $_;
+ exists $param{$key}?($key =~ /^(?:package|src)$/?'affects':$key,
+ ($key eq 'src'?[map {"src:$_"}make_list($param{$key})]:$param{$_})):()}
+ grep {$_ ne 'newest'}
+ keys %package_search_keys, 'archive'),
+ usertags => \%ut,
+ @schema_arg,
+ );
+}
+
+# filter out included or excluded bugs
+
+
+if (defined $param{version}) {
+ $title .= " at version $param{version}";
+}
+elsif (defined $param{dist}) {
+ $title .= " in $param{dist}";
+}
+
+$title = html_escape($title);
+
+my @names; my @prior; my @order;
+determine_ordering(cats => \%cats,
+ param => \%param,
+ ordering => \$ordering,
+ names => \@names,
+ prior => \@prior,
+ title => \@title,
+ order => \@order,
+ );
+
+# strip out duplicate bugs
+my %bugs;
+@bugs{@bugs} = @bugs;
+@bugs = keys %bugs;
+
+my $bugs = Debbugs::Collection::Bug->
+ new(bugs => \@bugs,
+ @schema_arg,
+ users => [map {my $u = Debbugs::User->new($_);
+ $u->has_bug_tags()?($u):()
+ } @users],
+ );
+
+$bugs->load_related_packages_and_versions();