+$opts{h_suites} = { $suite => 1 };
+$opts{h_archs} = { map { $_ => 1 } @archs };
+$opts{h_sections} = { map { $_ => 1 } @sections };
+$opts{h_archives} = { map { $_ => 1 } @archives };
+
+my $DL_URL = "$pkg/download";
+my $FILELIST_URL = "$pkg/files";
+
+our (%packages_all, %sources_all);
+my (@results, @non_results);
+my $page = $opts{source} ?
+ new Packages::SrcPage( $pkg ) :
+ new Packages::Page( $pkg );
+my $package_page = "";
+my ($short_desc, $version, $archive, $section, $subsection) = ("")x5;
+
+sub gettext { return $_[0]; };
+
+my $st0 = new Benchmark;
+unless (@Packages::CGI::fatal_errors) {
+ tie %packages_all, 'DB_File', "$DBDIR/packages_all_$suite.db",
+ O_RDONLY, 0666, $DB_BTREE
+ or die "couldn't tie DB $DBDIR/packages_all_$suite.db: $!";
+ tie %sources_all, 'DB_File', "$DBDIR/sources_all_$suite.db",
+ O_RDONLY, 0666, $DB_BTREE
+ or die "couldn't tie DB $DBDIR/sources_all_$suite.db: $!";
+
+ unless ($opts{source}) {
+ read_entry_all( \%packages, $pkg, \@results, \@non_results, \%opts );
+
+ unless (@results || @non_results ) {
+ fatal_error( "No such package".
+ "{insert link to search page with substring search}" );
+ } else {
+ unless (@results) {
+ fatal_error( "Package not available in this suite" );
+ } else {
+ for my $entry (@results) {
+ debug( join(":", @$entry), 1 );
+ my (undef, $archive, undef, $arch, $section, $subsection,
+ $priority, $version, $provided_by) = @$entry;
+
+ if ($arch ne 'virtual') {
+ my %data = split /\000/, $packages_all{"$pkg $arch $version"};
+ $data{package} = $pkg;
+ $data{architecture} = $arch;
+ $data{version} = $version;
+ $page->merge_package(\%data) or debug( "Merging $pkg $arch $version FAILED", 2 );
+ } else {
+ $page->add_provided_by([split /\s+/, $provided_by]);
+ }
+ }
+
+ unless ($page->is_virtual()) {
+ $version = $page->{newest};
+ my $source = $page->get_newest( 'source' );
+ $archive = $page->get_newest( 'archive' );
+ debug( "find source package: source=$source", 1);
+ my $src_data = $sources_all{"$archive $suite $source"};
+ $page->add_src_data( $source, $src_data )
+ if $src_data;
+
+ my $st1 = new Benchmark;
+ my $std = timediff($st1, $st0);
+ debug( "Data search and merging took ".timestr($std) );
+
+ my $encodedpkg = uri_escape( $pkg );
+ my ($v_str, $v_str_arch, $v_str_arr) = $page->get_version_string();
+ my $did = $page->get_newest( 'description' );
+ $section = $page->get_newest( 'section' );
+ $subsection = $page->get_newest( 'subsection' );
+ my $filenames = $page->get_arch_field( 'filename' );
+ my $file_md5sums = $page->get_arch_field( 'md5sum' );
+ my $archives = $page->get_arch_field( 'archive' );
+ my $sizes_inst = $page->get_arch_field( 'installed-size' );
+ my $sizes_deb = $page->get_arch_field( 'size' );
+ my @archs = sort $page->get_architectures;
+
+ # process description
+ #
+ my $desc = $descriptions{$did};
+ $short_desc = encode_entities( $1, "<>&\"" )
+ if $desc =~ s/^(.*)$//m;
+ my $long_desc = encode_entities( $desc, "<>&\"" );
+
+ $long_desc =~ s,((ftp|http|https)://[\S~-]+?/?)((\>\;)?[)]?[']?[:.\,]?(\s|$)),<a href=\"$1\">$1</a>$3,go; # syntax highlighting -> '];
+ $long_desc =~ s/\A //o;
+ $long_desc =~ s/\n /\n/sgo;
+ $long_desc =~ s/\n.\n/\n<p>\n/go;
+ $long_desc =~ s/(((\n|\A) [^\n]*)+)/\n<pre>$1\n<\/pre>/sgo;
+# $long_desc = conv_desc( $lang, $long_desc );
+# $short_desc = conv_desc( $lang, $short_desc );
+
+ my %all_suites;
+ foreach (@results, @non_results) {
+ my $a = $_->[1];
+ my $s = $_->[2];
+ if ($a =~ /^(?:us|security|non-US)$/o) {
+ $all_suites{$s}++;
+ } else {
+ $all_suites{"$s/$a"}++;
+ }
+ }
+ foreach (suites_sort(keys %all_suites)) {
+ if (("$suite/$archive" eq $_)
+ || (!$all_suites{"$suite/$archive"} && ($suite eq $_))) {
+ $package_page .= "[ <strong>$_</strong> ] ";
+ } else {
+ $package_page .=
+ "[ <a href=\"$ROOT/$_/".uri_escape($pkg)."\">$_</a> ] ";
+ }
+ }
+ $package_page .= '<br>';
+
+ $package_page .= simple_menu( [ gettext( "Distribution:" ),
+ gettext( "Overview over this suite" ),
+ "$ROOT/$suite/",
+ $suite ],
+ [ gettext( "Section:" ),
+ gettext( "All packages in this section" ),
+ "$ROOT/$suite/$subsection/",
+ $subsection ],
+ );
+
+ my $title .= sprintf( gettext( "Package: %s (%s)" ), $pkg, $v_str );
+ $title .= " ".marker( $archive ) if $archive ne 'us';
+ $title .= " ".marker( $subsection ) if $subsection eq 'non-US'
+ and $archive ne 'non-US'; # non-US/security
+ $title .= " ".marker( $section ) if $section ne 'main';
+ $package_page .= title( $title );
+
+ $package_page .= "<h2>".gettext( "Versions:" )." $v_str_arch</h2>\n"
+ unless $version eq $v_str;
+ if (my $provided_by = $page->{provided_by}) {
+ note( gettext( "This is also a virtual package provided by ").join( ', ', map { "<a href=\"$ROOT/$suite/$_\">$_</a>" } @$provided_by) );
+ }
+
+ if ($suite eq "experimental") {
+ note( gettext( "Experimental package"),
+ gettext( "Warning: This package is from the <span class=\"pred\">experimental</span> distribution. That means it is likely unstable or buggy, and it may even cause data loss. If you ignore this warning and install it nevertheless, you do it on your own risk.")."</p><p>".
+ gettext( "Users of experimental packages are encouraged to contact the package maintainers directly in case of problems." )