diff --git a/en/cgi/ports.cgi b/en/cgi/ports.cgi index e4ee5b4b62..d1e82b83ab 100755 --- a/en/cgi/ports.cgi +++ b/en/cgi/ports.cgi @@ -1,621 +1,640 @@ #!/usr/bin/perl -T # -# Copyright (c) 1996-2005 Wolfram Schneider +# Copyright (c) 1996-2007 Wolfram Schneider # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $FreeBSD: www/en/cgi/ports.cgi,v 1.93 2005/12/05 21:16:19 fenner Exp $ +# $FreeBSD: www/en/cgi/ports.cgi,v 1.94 2006/08/19 21:40:25 simon Exp $ # # ports.cgi - search engine for FreeBSD ports # o search for a port by name or description use POSIX qw(strftime); use Time::Local; require "./cgi-style.pl"; $t_style = qq` `; sub init_variables { $localPrefix = '/usr/ports'; # ports prefix # Directory of the up-to-date INDEX* $portsDatabaseHeadDir = "/usr/local/www/ports"; # Ports database file to use if (-f "$portsDatabaseHeadDir/INDEX-6") { $ports_database = 'INDEX-6'; } elsif (-f "$portsDatabaseHeadDir/INDEX-5") { $ports_database = 'INDEX-5'; } else { $ports_database = 'INDEX'; } # URL of ports tree for browsing $remotePrefixFtp = 'ports'; # 'ftp://ftp.FreeBSD.org/pub/FreeBSD/branches/-current/ports'; # URL of ports tree for download $remotePrefixFtpDownload = 'http://cvsweb.FreeBSD.org/ports'; $remoteSuffixFtpDownload = '%s.tar.gz?tarball=1'; # where to get -current packages local($p) = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386'; local($palpha) = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/alpha'; local($pamd64) = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/amd64'; local($pia64) = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/ia64'; local($psparc64) = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/sparc64'; $remotePrefixFtpPackagesDefault = '6-STABLE/i386'; # This is currently unused %remotePrefixFtpPackages = ( '7-CURRENT/i386', "$p/packages-7-current/All", '6-STABLE/i386', " $p/packages-6-stable/All", '5-STABLE/i386', " $p/packages-5-stable/All", '4-STABLE/i386', " $p/packages-4-stable/All", '6.0-RELEASE/i386', "$p/packages-6.0-release/All", '5.4-RELEASE/i386', "$p/packages-5.4-release/All", '4.11-RELEASE/i386',"$p/packages-4.11-release/All", '4-STABLE/alpha', "$palpha/packages-4-stable/All", '5.4-RELEASE/alpha', "$palpha/packages-5.4-release/All", '4.11-RELEASE/alpha',"$palpha/packages-4.11-release/All", '7-CURRENT/amd64', "$pamd64/packages-7-current/All", '6-STABLE/amd64', "$pamd64/packages-6-stable/All", '5-STABLE/amd64', "$pamd64/packages-5-stable/All", '6.0-RELEASE/amd64', "$pamd64/packages-6.0-release/All", '5.4-RELEASE/amd64', "$pamd64/packages-5.4-release/All", '7-CURRENT/ia64', "$pia64/packages-7-current/All", '6-STABLE/ia64', "$pia64/packages-6-stable/All", '6.0-RELEASE/ia64', "$pia64/packages-6.0-release/All", '5.4-RELEASE/ia64', "$pia64/packages-5.4-release/All", '7-CURRENT/sparc64', "$psparc64/packages-7-current/All", '6-STABLE/sparc64', "$psparc64/packages-6-stable/All", '5-STABLE/sparc64', "$psparc64/packages-5-stable/All", '6.0-RELEASE/sparc64', "$psparc64/packages-6.0-release/All", '5.4-RELEASE/sparc64', "$psparc64/packages-5.4-release/All", ); $remotePrefixHtml = "$hsty_base/ports"; # CVS Web interface $remotePrefixCvs = 'http://cvsweb.FreeBSD.org/ports'; # Ports documentation $portsDesc = "$hsty_base/ports/"; # location of the tiny BSD daemon - $daemonGif = "Really small BSD Daemon"; + $daemonGif = "Really small BSD Daemon"; # visible E-Mail address, plain text $mailto = 'www@FreeBSD.org'; # Mailinglist for FreeBSD Ports $mailtoList = 'ports@FreeBSD.org'; # use mailto:email?subject $mailtoAdvanced = 'yes'; # the URL if you click at the E-Mail address (see below) $mailtoURL = "mailto:$mailto" if !$mailtoURL; # security $ENV{'PATH'} = '/bin:/usr/bin'; # ports download sources script $pds = 'pds.cgi'; # make plain text URLs clickable cgi script $url = 'url.cgi'; # extension type for packages $packageExt = 'tbz'; local($packageDB) = '../ports/packages.exists'; &packages_exist($packageDB, *packages) if -f $packageDB; } sub packages_exist { local($file, *p) = @_; open(P, $file) || do { warn "open $file: $!\n"; warn "Cannot create packages links\n"; return 1; }; - while(

) { + while(

) { chop; $p{$_} = 1; } close P; return 0; } # return the date of the last ports database update sub last_update { local($file) = "$portsDatabaseHeadDir/$ports_database"; local($modtime, $modtimestr); $modtime = (stat($file))[9]; if (defined($modtime) && $modtime > 0) { $modtimestr = strftime("%G-%m-%d %H:%M:%S UTC", gmtime($modtime)); } else { $modtimestr = "Unknown"; } return $modtimestr; } sub last_update_message { - return "

Last database update: " . &last_update . "
\n"; + return "

Last database update: " . &last_update . "

\n"; } sub dec { local($_) = @_; s/\+/ /g; # '+' -> space s/%(..)/pack("c",hex($1))/ge; # '%ab' -> char ab return($_); } # $indent is a bit of optional data processing I put in for # formatting the data nicely when you are emailing it. # This is derived from code by Denis Howe # and Thomas A Fine sub decode_form { local($form, *data, $indent, $key, $_) = @_; foreach $_ (split(/&/, $form)) { ($key, $_) = split(/=/, $_, 2); $_ =~ s/\+/ /g; # + -> space $key =~ s/\+/ /g; # + -> space $_ =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig; # undo % escapes $key =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig; # undo % escapes $_ =~ s/[\r\n]+/\n\t/g if defined($indent); # indent data after \n $data{$key} = $_; } } +sub escapeHTML { + my $toencode = shift; + return "" unless defined($toencode); -# encode unknown data for use in a URL + $toencode =~ s{&}{&}gso; + $toencode =~ s{<}{<}gso; + $toencode =~ s{>}{>}gso; + $toencode =~ s{"}{"}gso; + return $toencode; +} + +# encode unknown data for use in a URL sub encode_url { local($_) = @_; s/([\000-\032\;\/\?\:\@\&\=\%\'\"\`\<\>\177-\377 ])/sprintf('%%%02x',ord($1))/eg; # s/%20/+/g; $_; } sub warn { print "$_[0]" } sub env { defined($ENV{$_[0]}) ? $ENV{$_[0]} : undef; } sub exit { exit 0 }; sub readindex { local(*var, *msec) = @_; local($localportsdb) = "$portsDatabaseHeadDir/$ports_database"; local(@tmp, @s); open(C, $localportsdb) || do { warn "Cannot open ports database $localportsdb: $!\n"; &exit; }; while() { next if $query && !/$query/oi; chop; @tmp = split(/\|/); $var{"$tmp[4]"} = $_; @s = split(/\s+/, $tmp[6]); foreach (@s) { $msec{"$tmp[4],$_"} = 1; } } close C; } # extract sub collections sub readcoll { local(@a, @b, %key); local($file) = '../ports/categories'; local($localportsdb) = "$portsDatabaseHeadDir/$ports_database"; if (-r $file && open(C, $file)) { while() { chop; if (/^\s*([^,]+),\s*"([^"]+)",\s*([A-Z]+)/) { @b = split(/\s+/, $1); foreach (@b) { if (!defined($key{$_})) { $key{$_} = 1; } } } } } else { if (-r $localportsdb) { open(C, $localportsdb) || do { warn "Cannot open ports database $localportsdb: $!\n"; &exit; } } while() { chop; @a = split('\|'); @b = split(/\s+/, $a[6]); foreach (@b) { if (!defined($key{$_})) { $key{$_} = 1; } } } } close C; @a = (); foreach (sort keys %key) { push(@a, $_); } return @a; } # basic function for HTML output sub out { local($line) = @_; local($version, $path, $local, $comment, $descfile, $email, $sections, $bdepends, $rdepends, @rest) = split(/\|/, $line); if ($path =~ m%^$localPrefix/([^/]+)%o) { if (!$out_sec || $1 ne $out_sec) { - print "\n" if $counter > 0; - print qq{\n

} . + print "\n" if $counter > 0; + print qq{\n

} . qq{Category $1} . - "

\n
\n"; + "\n
\n"; $out_sec = $1; } } $counter++; $pathDownload = $path; $pathB= $path; $pathB =~ s/^$localPrefix/ports/o; $path =~ s/^$localPrefix/$remotePrefixFtp/o; $pathDownload =~ s/^$localPrefix/$remotePrefixFtpDownload/o; if ($remoteSuffixFtpDownload) { if (substr($remoteSuffixFtpDownload, 0, 2) eq '%s') { $pathDownload =~ m,([^/]+)$,; $pathDownload .= "/$1" . substr($remoteSuffixFtpDownload, 2); } else { $pathDownload .= $remoteSuffixFtpDownload; } } $descfile =~ s/^$localPrefix/$remotePrefixFtp/o; - $comment =~ s//\>/g; + $version = &encode_url($version); + #$version =~ s/[\+,]/X/g; local($l) = $path; $l =~ s%^$remotePrefixFtp%$remotePrefixCvs%o; - print qq{
$version\n}; - print qq{
$comment
\n}; + print qq{
$version
\n}; + print qq{
}, &escapeHTML($comment), qq{
\n}; - print qq[Long description :\n]; - print qq[Sources :\n]; + print qq[Long description :\n]; + print qq[Sources :\n]; # Link package in "default" arch/release. Verify it's existence on ftp-master. if ($packages{"$version.$packageExt"}) { - print qq[Package :\n]; + print qq[Package :\n]; } - print qq[Changes : Download
\n]; + print qq[Changes :\n]; + print qq[Download
\n]; - print qq{Maintained by: $email
}; + &encode_url($version) : '') . qq{">$email
\n}; local(@s) = split(/\s+/, $sections); if ($#s > 0) { - print qq{Also listed in: }; + print qq{Also listed in: }; foreach (@s) { - print qq{$_ } + print qq{$_ } if $_ ne $out_sec; } - print "
\n"; + print "
\n"; } if ($bdepends || $rdepends) { local($flag) = 0; local($last) = ''; - print qq{Requires: }; + print qq{Requires: }; foreach (sort split(/\s+/, "$bdepends $rdepends")) { # delete double entries next if $_ eq $last; $last = $_; print ", " if $flag; $flag++; - print qq{$_}; + print qq{$_}; } - print "
\n"; + print "
\n"; } - print q[

]; + print qq[

]; + + # XXX: should be done in a CSS + print qq[
 
]; + print qq[\n\n]; }; # search and output sub search_ports { local(@a) = (); local($key, $name, $text); foreach $key (sort keys %today) { next if $today{$key} !~ /$query/oi; @a = split(/\|/, $today{$key}); $name = $a[0]; #$name =~ s/(\W)/\\$1/g; $text = $a[3]; #$text =~ s/(\W)/\\$1/g; if ($section ne "all") { next if $a[6] !~ /^$section(\s|$)/; } #warn "$stype:$query: $name $text\n"; if ($stype eq "name" && $name =~ /$query/o) { &out($today{$key}); } elsif ($stype eq "text" && $text =~ /$query/oi) { &out($today{$key}); } elsif ($stype eq "all" && ($text =~ /$query/oi || $name =~ /$query/io)) { &out($today{$key}); } elsif ($stype eq 'maintainer' && $a[5] =~ /$query/io) { &out($today{$key}); } elsif ($stype eq 'requires' && ($a[7] =~ /$query/io || $a[8] =~ /$query/io)) { &out($today{$key}); } } } sub forms { - print qq{

+ print qq{

FreeBSD Ports [short description followed ...] FAQ -

+

}; - print qq{ + print qq{

"Package Name" searches for the name of a port or distribution. "Description" searches case-insensitive in a short comment about the port. "All" searches case-insensitive for the package name and in the description about the port. -

+

-
+ Search for: - - + + print qq{ - + }; foreach (@sec) { - print "$_\n}; + print "$_\n}; } - print q{ - - -
+ print q{ + + +
}; } sub footer { print qq{ -Powered by FreeBSD -© 1996-2005 by Wolfram Schneider. All rights reserved.
+Powered by FreeBSD +© 1996-2007 by Wolfram Schneider. All rights reserved.
}; - #print q{$FreeBSD: www/en/cgi/ports.cgi,v 1.93 2005/12/05 21:16:19 fenner Exp $} . "
\n"; + #print q{$FreeBSD: www/en/cgi/ports.cgi,v 1.94 2006/08/19 21:40:25 simon Exp $} . "
\n"; print qq{Please direct questions about this service to -$mailto
\n}; +$mailto
\n}; print qq{General questions about FreeBSD ports should be sent to } . qq{} . - qq{$mailtoList
\n}; + qq{$mailtoList
\n}; print &last_update_message; - print "
\n

\n"; + print qq{


\n

\n}; } sub check_input { if ($query) { $stype = "all" if !$stype; if (!($stype eq "name" || $stype eq "text" || $stype eq "maintainer" || $stype eq "requires" || $stype eq "all")) { &warn("unknown search type ``$type'', use `all', `text', `name', 'requires', or `maintainer'\n"); &exit(0); } else { return; } } } sub faq { print qq{

FreeBSD Ports Search FAQ

Keywords

Description
A more detailed description.
Download
Download the ports directory.
Package
Download the pre-compiled software package.
Changes
Read the latest changes.
Sources
Links to all source files.

Misc

+

Package download links point to the FreeBSD 6-STABLE -version and not to the latest releases.

+version and not to the latest releases.

+

The script ports.cgi use the file $ports_database as database for it's operations. $ports_database is updated automatically every -two hours.

+two hours.

+

You may also search the -ports manual pages.

+ports manual pages.

-Back to the search engine

-


+

+Back to the search engine

+
}; } # # Main # &init_variables; $query_string = &env('QUERY_STRING'); $path_info = &env('PATH_INFO'); &decode_form($query_string, *form); $section = $form{'sektion'}; $section = 'all' if (!$section); $query = $form{'query'}; $stype = $form{'stype'}; $script_name = &env('SCRIPT_NAME'); if ($path_info eq "/source") { # XXX print "Content-type: text/plain\n\n"; open(R, $0) || do { print "ick!\n"; &exit; }; while() { print } close R; &exit; } # Full text search in ports//port>/pkg-descr if ($stype eq 'pkgdescr') { local($url) = 'http://www.FreeBSD.org/cgi/search.cgi?source=pkgdescr&max=25'; $query =~ s/\s+/+/g; print "Location: $url&words=$query\n\n"; &exit; } if ($stype eq "faq") { - print &short_html_header("FreeBSD Ports Search FAQ", 0); + print &short_html_header("FreeBSD Ports Search FAQ", 1); &faq; &footer; print &html_footer; &exit(0); } -print &html_header("FreeBSD Ports Search", 0); +print &html_header("FreeBSD Ports Search", 1); # allow `/ports.cgi?netscape' where 'netscape' is the query port to search # this make links to this script shorter if (!$query && $query_string =~ /^([^=&]+)$/) { $query = $1; } # automatically read collections, need only 0.2 sec on a pentium @sec = &readcoll; &forms; $query =~ s/^\s+//; $query =~ s/\s+$//; if ($query_string eq "" || !$query) { &footer; print &html_footer; &exit(0); } &check_input; $counter = 0; # search if ($query) { &readindex(*today, *msec); $query =~ s/([^\w\^])/\\$1/g; &search_ports; } if (!$counter) { print "Sorry, nothing found.\n"; print qq{You may look for other } . qq{FreeBSD Search Services.\n}; } else { print "
\n"; } -print "
\n"; +print qq{
\n}; &footer; print &html_footer;