X-Git-Url: https://git.deb.at/?a=blobdiff_plain;ds=sidebyside;f=cgi-bin%2Fsearch_packages.pl;h=da41da04cd7950306e85a179c301b8b563f5262e;hb=68f4ac9132dd489ef93927f1453122be66ea75d5;hp=c3877fc04d6ae600602fc1dc05958b15f032c09d;hpb=11d34e2708df7b0bcdfe7d7bcbccdc5d10326457;p=deb%2Fpackages.git diff --git a/cgi-bin/search_packages.pl b/cgi-bin/search_packages.pl index c3877fc..da41da0 100755 --- a/cgi-bin/search_packages.pl +++ b/cgi-bin/search_packages.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -wT -# +# $Id$ # search_packages.pl -- CGI interface to the Packages files on packages.debian.org # # Copyright (C) 1998 James Treacy @@ -26,12 +26,11 @@ use Deb::Versions; use Packages::Search qw( :all ); use Packages::HTML (); -my $thisscript = "search_packages.pl"; +my $thisscript = $Packages::HTML::SEARCH_CGI; my $HOME = "http://www.debian.org"; my $ROOT = ""; my $SEARCHPAGE = "http://packages.debian.org/"; my @SUITES = qw( oldstable stable testing unstable experimental ); -my @DISTS = @SUITES; my @SECTIONS = qw( main contrib non-free ); my @ARCHIVES = qw( us security installer ); my @ARCHITECTURES = qw( alpha amd64 arm hppa hurd-i386 i386 ia64 @@ -44,16 +43,22 @@ my %ARCHITECTURES = map { $_ => 1 } @ARCHITECTURES; $ENV{PATH} = "/bin:/usr/bin"; # Read in all the variables set by the form -my $input = new CGI; +my $input; +if ($ARGV[0] && ($ARGV[0] eq 'php')) { + $input = new CGI(\*STDIN); +} else { + $input = new CGI; +} my $pet0 = new Benchmark; # use this to disable debugging in production mode completly my $debug_allowed = 1; my $debug = $debug_allowed && $input->param("debug"); -$Search::Param::debug = 1 if $debug > 1; +$debug = 0 if not defined($debug); +#$Packages::Search::debug = 1 if $debug > 1; # If you want, just print out a list of all of the variables and exit. -print $input->header if $debug; +#print $input->header if $debug; # print $input->dump; # exit; @@ -73,30 +78,42 @@ if (my $path = $input->param('path')) { } } -my %params_def = ( keywords => { default => undef, match => '^\s*([-+\@\w\/.:]+)\s*$' }, +my ( $format, $keyword, $case, $subword, $exact, $searchon, + @suites, @sections, @archs ); + +my %params_def = ( keywords => { default => undef, + match => '^\s*([-+\@\w\/.:]+)\s*$', + var => \$keyword }, suite => { default => 'stable', match => '^(\w+)$', alias => 'version', array => ',', + var => \@suites, replace => { all => \@SUITES } }, - case => { default => 'insensitive', match => '^(\w+)$' }, - official => { default => 0, match => '^(\w+)$' }, - use_cache => { default => 1, match => '^(\w+)$' }, - subword => { default => 0, match => '^(\w+)$' }, - exact => { default => undef, match => '^(\w+)$' }, - searchon => { default => 'all', match => '^(\w+)$' }, + case => { default => 'insensitive', match => '^(\w+)$', + var => \$case }, +# official => { default => 0, match => '^(\w+)$' }, +# use_cache => { default => 1, match => '^(\w+)$' }, + subword => { default => 0, match => '^(\w+)$', + var => \$subword }, + exact => { default => undef, match => '^(\w+)$', + var => \$exact }, + searchon => { default => 'all', match => '^(\w+)$', + var => \$searchon }, section => { default => 'all', match => '^([\w-]+)$', alias => 'release', array => ',', + var => \@sections, replace => { all => \@SECTIONS } }, arch => { default => 'any', match => '^(\w+)$', - array => ',', replace => + array => ',', var => \@archs, replace => { any => \@ARCHITECTURES } }, archive => { default => 'all', match => '^(\w+)$', array => ',', replace => { all => \@ARCHIVES } }, - format => { default => 'html', match => '^(\w+)$' }, + format => { default => 'html', match => '^(\w+)$', + var => \$format }, ); -my %params = Packages::Search::parse_params( $input, \%params_def ); +my %opts; +my %params = Packages::Search::parse_params( $input, \%params_def, \%opts ); -my $format = $params{values}{format}{final}; #XXX: Don't use alternative output formats yet $format = 'html'; @@ -107,24 +124,61 @@ if ($format eq 'html') { print $input->header( -type=>'text/plain' ); } +my (@errors, @debug, @msgs, @hints); +sub error { + push @errors, $_[0]; +} +sub hint { + push @hints, $_[0]; +} +sub debug { + my $lvl = $_[1] || 0; + push(@debug, $_[0]) if $debug > $lvl; +} +sub msg { + push @msgs, $_[0]; +} +sub print_errors { + return unless @errors; + print '
$_
"; + } + print ''; + foreach (@debug) { + print "$_\n"; + } + print '
$_
"; + } + print '$_
"; + } +} + if ($params{errors}{keywords}) { - print "Error: keyword not valid or missing" if $format eq 'html'; - exit 0; + error( "Error: keyword not valid or missing" ); } -my $keyword = $params{values}{keywords}{final}; -my @suites = @{$params{values}{suite}{final}}; -my $official = $params{values}{official}{final}; -my $use_cache = $params{values}{use_cache}{final}; -my $case = $params{values}{case}{final}; + my $case_bool = ( $case !~ /insensitive/ ); -my $subword = $params{values}{subword}{final}; -my $exact = $params{values}{exact}{final}; $exact = !$subword unless defined $exact; -my $searchon = $params{values}{searchon}{final}; -my @sections = @{$params{values}{section}{final}}; -my @archs = @{$params{values}{arch}{final}}; -my $page = $params{values}{page}{final}; -my $results_per_page = $params{values}{number}{final}; +$opts{h_suites} = { map { $_ => 1 } @suites }; +$opts{h_sections} = { map { $_ => 1 } @sections }; +$opts{h_archs} = { map { $_ => 1 } @archs }; # for URL construction my $suites_param = join ',', @{$params{values}{suite}{no_replace}}; @@ -139,36 +193,16 @@ my $sections_enc = encode_entities join ', ', @{$params{values}{section}{no_repl my $archs_enc = encode_entities join ', ', @{$params{values}{arch}{no_replace}}; my $pet1 = new Benchmark; my $petd = timediff($pet1, $pet0); -print "DEBUG: Parameter evaluation took ".timestr($petd)."You have searched for ${source_wording}packages $exact_wording $keyword_enc in $suite_wording, $section_wording, and $arch_wording.
"; + msg( "You have searched for ${source_wording}packages $exact_wording $keyword_enc in $suite_wording, $section_wording, and $arch_wording." ); } else { my $exact_wording = $exact ? "" : " (including subword matching)"; - print "You have searched for $keyword_enc in packages names and descriptions in $suite_wording, $section_wording, and $arch_wording$exact_wording.
"; + msg( "You have searched for $keyword_enc in packages names and descriptions in $suite_wording, $section_wording, and $arch_wording$exact_wording." ); } } +if ($too_many_hits) { + error( "Your search was too wide so we will only display exact matches. At least $too_many_hits results have been omitted and will not be displayed. Please consider using a longer keyword or more keywords." ); +} + if (!@results) { if ($format eq 'html') { my $keyword_esc = uri_escape( $keyword ); @@ -242,51 +422,52 @@ if (!@results) { if (($suites_enc eq 'all') && ($archs_enc eq 'any') && ($sections_enc eq 'all')) { - print "Can't find that package.
\n"; + error( "Can't find that package." ); } else { - print "Can't find that package, at least not in that suite ". - ( $search_on_sources ? "" : " and on that architecture" ). - ".
\n"; + error( "Can't find that package, at least not in that suite ". + ( $search_on_sources ? "" : " and on that architecture" ) ) } if ($exact) { - $printed = 1; - print "You have searched only for exact matches of the package name. You can try to search for package names that contain your search string.
"; + hint( "You have searched only for exact matches of the package name. You can try to search for package names that contain your search string." ); } } else { if (($suites_enc eq 'all') && ($archs_enc eq 'any') && ($sections_enc eq 'all')) { - print "Can't find that string.
\n"; + error( "Can't find that string." ); } else { - print "Can't find that string, at least not in that suite ($suites_enc, section $sections_enc) and on that architecture ($archs_enc).
\n"; + error( "Can't find that string, at least not in that suite ($suites_enc, section $sections_enc) and on that architecture ($archs_enc)." ); } unless ($subword) { - $printed = 1; - print "You have searched only for words exactly matching your keywords. You can try to search allowing subword matching.
"; + hint( "You have searched only for words exactly matching your keywords. You can try to search allowing subword matching." ); } } - print "".( $printed ? "Or you" : "You" )." can try a different search on the Packages search page.
"; - - &printfooter; + hint( ( @hints ? "Or you" : "You" )." can try a different search on the Packages search page." ); + } - exit; } +print_header; +print_msgs; +print_errors; +print_hints; +print_debug; + my (%pkgs, %sect, %part, %desc, %binaries); unless ($search_on_sources) { foreach (@results) { - my ($pkg_t, $suite, $arch, $section, $priority, $version, $desc) = @$_; + my ($pkg_t, $suite, $arch, $section, $subsection, + $priority, $version, $desc) = @$_; my ($package) = $pkg_t =~ m/^(.+)/; # untaint $pkgs{$package}{$suite}{$version}{$arch} = 1; - $sect{$package}{$suite}{$version} = 'subsection'; + $sect{$package}{$suite}{$version} = $subsection; $part{$package}{$suite}{$version} = $section unless $section eq 'main'; $desc{$package}{$suite}{$version} = $desc; - } if ($format eq 'html') { @@ -317,43 +498,17 @@ unless ($search_on_sources) { } print "\n"; } - } elsif ($format eq 'xml') { - require RDF::Simple::Serialiser; - my $rdf = new RDF::Simple::Serialiser; - $rdf->addns( debpkg => 'http://packages.debian.org/xml/01-debian-packages-rdf' ); - my @triples; - foreach my $pkg (sort keys %pkgs) { - foreach my $ver (@DISTS) { - if (exists $pkgs{$pkg}{$ver}) { - my @versions = version_sort keys %{$pkgs{$pkg}{$ver}}; - foreach my $version (@versions) { - my $id = "$ROOT/$ver/$sect{$pkg}{$ver}{$version}/$pkg/$version"; - push @triples, [ $id, 'debpkg:package', $pkg ]; - push @triples, [ $id, 'debpkg:version', $version ]; - push @triples, [ $id, 'debpkg:section', $sect{$pkg}{$ver}{$version}, ]; - push @triples, [ $id, 'debpkg:suite', $ver ]; - push @triples, [ $id, 'debpkg:shortdesc', $desc{$pkg}{$ver}{$version} ]; - push @triples, [ $id, 'debpkg:part', $part{$pkg}{$ver}{$version} || 'main' ]; - foreach my $arch (sort keys %{$pkgs{$pkg}{$ver}{$version}}) { - push @triples, [ $id, 'debpkg:architecture', $arch ]; - } - } - } - } - } - - print $rdf->serialise(@triples); } } else { foreach (@results) { - my ($package, $suite, $section, $version, $binaries); + my ($package, $suite, $section, $subsection, $priority, + $version) = @$_; $pkgs{$package}{$suite} = $version; - $sect{$package}{$suite}{source} = 'subsection'; + $sect{$package}{$suite}{source} = $subsection; $part{$package}{$suite}{source} = $section unless $section eq 'main'; - $binaries{$package}{$suite} = [ sort split( /\s*,\s*/, $binaries ) ]; - + $binaries{$package}{$suite} = find_binaries( $package, $suite ); } if ($format eq 'html') { @@ -376,15 +531,8 @@ unless ($search_on_sources) { print "$index_line
"; } @@ -442,10 +569,10 @@ sub multipageheader { my $no_results = shift; my ($start, $end); - if ($results_per_page =~ /^all$/i) { + if ($opts{number} =~ /^all$/i) { $start = 1; $end = $no_results; - $results_per_page = $no_results; + $opts{number} = $no_results; } else { $start = Packages::Search::start( \%params ); $end = Packages::Search::end( \%params ); @@ -465,7 +592,7 @@ sub multipageheader { print "Results per page: ";
my @resperpagelinks;
for (50, 100, 200) {
- if ($results_per_page == $_) {
+ if ($opts{number} == $_) {
push @resperpagelinks, $_;
} else {
push @resperpagelinks, resperpagelink($input,\%params,$_);
@@ -491,5 +618,11 @@ print <
"
+ if $debug_allowed;
print $input->end_html;
}
+
+# vim: ts=8 sw=4