diff --git a/en/cgi/ports.cgi b/en/cgi/ports.cgi index af89a47373..f9496710c5 100755 --- a/en/cgi/ports.cgi +++ b/en/cgi/ports.cgi @@ -1,716 +1,716 @@ #!/usr/bin/perl -T # # Copyright (c) 1996-2005 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.83 2005/06/14 21:34:44 simon Exp $ +# $FreeBSD: www/en/cgi/ports.cgi,v 1.84 2005/11/29 20:39:37 pav Exp $ # # ports.cgi - search engine for FreeBSD ports # o search for a port by name or description use POSIX qw(strftime); use Time::Local; sub init_variables { $localPrefix = '/usr/ports'; # ports prefix # Directory of the up-to-date INDEX/INDEX-5 $portsDatabaseHeadDir = "/usr/local/www/ports"; # Ports database file to use $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'; # XXX this now only serves for Package link, head INDEX is always checked - $remotePrefixFtpPackagesDefault = '5-STABLE/i386'; + $remotePrefixFtpPackagesDefault = '6-STABLE/i386'; %remotePrefixFtpPackages = ( - '6-CURRENT/i386', "$p/packages-6-current/All", + '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", - '5.3-RELEASE/i386', "$p/packages-5.3-release/All", - '5.2.1-RELEASE/i386', "$p/packages-5.2.1-release/All", - '4.10-RELEASE/i386',"$p/packages-4.10-release/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", - '6-CURRENT/alpha', "$palpha/packages-6-current/All", - '5-STABLE/alpha', "$palpha/packages-5-stable/All", '4-STABLE/alpha', "$palpha/packages-4-stable/All", - '5.3-RELEASE/alpha', "$palpha/packages-5.3-release/All", - '5.2.1-RELEASE/alpha', "$palpha/packages-5.2.1-release/All", - '4.10-RELEASE/alpha',"$palpha/packages-4.10-release/All", + '5.4-RELEASE/alpha', "$palpha/packages-5.4-release/All", + '4.11-RELEASE/alpha',"$palpha/packages-4.11-release/All", - '6-CURRENT/amd64', "$pamd64/packages-6-current/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", - '5.3-RELEASE/amd64', "$pamd64/packages-5.3-release/All", - '5.2.1-RELEASE/amd64', "$pamd64/packages-5.2.1-release/All", + '6.0-RELEASE/amd64', "$pamd64/packages-6.0-release/All", + '5.4-RELEASE/amd64', "$pamd64/packages-5.4-release/All", - '6-CURRENT/ia64', "$pia64/packages-6-current/All", - '5-STABLE/ia64', "$pia64/packages-5-stable/All", + '7-CURRENT/ia64', "$pia64/packages-7-current/All", + '6-STABLE/ia64', "$pia64/packages-6-stable/All", - '5.3-RELEASE/ia64', "$pia64/packages-5.3-release/All", - '5.2.1-RELEASE/ia64', "$pia64/packages-5.2.1-release/All", + '6.0-RELEASE/ia64', "$pia64/packages-6.0-release/All", + '5.4-RELEASE/ia64', "$pia64/packages-5.4-release/All", - '6-CURRENT/sparc64', "$psparc64/packages-6-current/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", - '5.3-RELEASE/sparc64', "$psparc64/packages-5.3-release/All", - '5.2.1-RELEASE/sparc64', "$psparc64/packages-5.2.1-release/All", + '6.0-RELEASE/sparc64', "$psparc64/packages-6.0-release/All", + '5.4-RELEASE/sparc64', "$psparc64/packages-5.4-release/All", ); $remotePrefixHtml = '../ports'; # CVS Web interface $remotePrefixCvs = 'http://cvsweb.FreeBSD.org/ports'; # Ports documentation $portsDesc = '../ports/'; # location of the tiny 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 = 'tgz'; local($packageDB) = '../ports/packages.exists'; &packages_exist($packageDB, *packages) if -f $packageDB; } # Parse selected version string and set version dependend settings sub parse_release { # XXX this must go away. instead, check what we got and use it. $packageExt = 'tbz'; $ports_database = 'INDEX-5'; } sub packages_exist { local($file, *p) = @_; open(P, $file) || do { warn "open $file: $!\n"; warn "Cannot create packages links\n"; return 1; }; 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"; } sub dec { local($_) = @_; s/\+/ /g; # '+' -> space s/%(..)/pack("c",hex($1))/ge; # '%ab' -> char ab return($_); } sub header { print "Content-type: text/html\n"; print "\n"; } # $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} = $_; } } # 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*,/) { #" @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, $old) = @_; 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

} . qq{Category $1} . "

\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; print qq{
$version\n}; print qq{
$comment
\n}; if ($old) { local($l) = $descfile; $l =~ s%^$remotePrefixFtp%$remotePrefixCvs%o; $l =~ s%/([^/]+)$%/Attic/$1%; print qq{Was Maintained by: $email
} . qq{Removed why
}; } else { local($l) = $path; $l =~ s%^$remotePrefixFtp%$remotePrefixCvs%o; #$l .= '/Makefile'; print qq{Maintained by: $email
}; local(@s) = split(/\s+/, $sections); if ($#s > 0) { print qq{Also listed in: }; foreach (@s) { print qq{$_ } if $_ ne $out_sec; } print "
\n"; } if ($bdepends || $rdepends) { local($flag) = 0; local($last) = ''; print qq{Requires: }; foreach (sort split(/\s+/, "$bdepends $rdepends")) { # delete double entries next if $_ eq $last; $last = $_; print ", " if $flag; $flag++; print qq{$_}; } print "
\n"; } print qq[Description : Sources :\n]; # XXX Some kind of list of available arch/rels should replace this # once release pulldown goes away. print qq[Package :\n]; print qq[Changes : Download

]; }; }; # 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; #warn "$stype:$query: $name $text\n"; if ($stype eq "name" && $name =~ /$query/o) { &out($today{$key}, 0); } elsif ($stype eq "text" && $text =~ /$query/oi) { &out($today{$key}, 0); } elsif ($stype eq "all" && ($text =~ /$query/oi || $name =~ /$query/io)) { &out($today{$key}, 0); } elsif ($stype eq 'maintainer' && $a[5] =~ /$query/io) { &out($today{$key}, 0); } elsif ($stype eq 'requires' && ($a[7] =~ /$query/io || $a[8] =~ /$query/io)) { &out($today{$key}, 0); } } } sub forms { print qq{ FreeBSD Ports Changes

FreeBSD Ports Changes $daemonGif

FreeBSD Ports [short description followed ...] FAQ

}; 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:
}; # Since we don't have frequent CVS versions of INDEX anymore it's # not possible to make usable "new ports" listings based on INDEX. print("
\n"); return; print qq{

"New" lists ports which are new in the ports collection or moved from another ports section. "Changed" lists updated ports. "Removed" lists ports which have been deleted from ports collections or moved to another ports section.

\n\n

}; } sub footer { print qq{ Powered by FreeBSD © 1996-2005 by Wolfram Schneider. All rights reserved.
}; - #print q{$FreeBSD: www/en/cgi/ports.cgi,v 1.83 2005/06/14 21:34:44 simon Exp $} . "
\n"; + #print q{$FreeBSD: www/en/cgi/ports.cgi,v 1.84 2005/11/29 20:39:37 pav Exp $} . "
\n"; print qq{Please direct questions about this service to $mailto
\n}; print qq{General questions about FreeBSD ports should be sent to } . qq{} . qq{$mailtoList
\n}; print &last_update_message; print "
\n

\n"; } sub footer2 { print "\n\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; } } if (!($type eq "new" || $type eq "changed" || $type eq "removed")) { &warn("unknown type `$type', use `new', `changed', or `removed'\n"); &exit(0); } if ($time !~ /^[1-9][0-9]*\s+(month|week)\s+ago$/ && # support diff by revision too $time !~ /^rev[1-9]+\.[0-9]+$/ ) { &warn("unknown date: `$time'\n"); &exit(0); } } sub faq { print qq{\nFAQ\n

FreeBSD Ports Changed 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

All links point to the FreeBSD-stable version and not to the latest releases.

The script ports.cgi use the file FreeBSD-CVS/ports/INDEX,v as database for most operations. INDEX,v will be updated by hand by the portsmeister. An updated INDEX file is used if available.

You may also search the ports manual pages.

Get the Source of this script.

Back to the search engine


}; } # # Main # &init_variables; $query_string = &env('QUERY_STRING'); $path_info = &env('PATH_INFO'); &decode_form($query_string, *form); $type = $form{'type'}; $time = $form{'time'}; $section = $form{'sektion'}; $query = $form{'query'}; $stype = $form{'stype'}; $release = $form{'release'}; $release = $remotePrefixFtpPackagesDefault if !$release || !defined($remotePrefixFtpPackages{$release}); $script_name = &env('SCRIPT_NAME'); &parse_release; # Fallback to CVS if an updated INDEX isn't found if (!-r "$portsDatabaseHeadDir/$ports_database") { $portsDatabaseHeadDir = "CVS"; } if ($path_info eq "/source") { 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"; print "Content-type: text/plain\n\n"; &exit; } &header; if ($path_info eq "/faq.html") { &faq; &footer; &footer2; &exit(0); } # allow `/ports.cgi?netscape' where 'netscape' is the query port to search # this make links to this script shorter if (!$query && !$type && $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 && !$type)) { &footer; &footer2; &exit(0); } #warn "type: $type time: $time section: $section stype: $stype query: $query"; &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"; &footer; &footer2;