diff --git a/data/cgi/pds.cgi b/data/cgi/pds.cgi new file mode 100755 index 0000000000..f45a3acd81 --- /dev/null +++ b/data/cgi/pds.cgi @@ -0,0 +1,53 @@ +#!/bin/sh +# Copyright (c) 1997 Wolfram Schneider , Berlin. +# All rights reserved. +# +# pds.cgi - FreeBSD Ports download sources cgi script +# print a list of source files for a port +# + +file="$QUERY_STRING" +file2="$file/Makefile" +CVSROOT=/home/ncvs; export CVSROOT + +# set DISTDIR to a dummy directory. +DISTDIR=/tmp/___pds.cgi___; export DISTDIR + +cat < + +Sources for $file + + + +

Sources for $file

+ +EOF +cvs -Q co -p $file2 | make -I /home/fenner/mk -f - bill-fetch | + perl -ne 'print qq{$1
\n} + if m%((http|ftp)://\S+)%' +cat < + +EOF diff --git a/data/cgi/ports.cgi b/data/cgi/ports.cgi new file mode 100755 index 0000000000..0cbf27f150 --- /dev/null +++ b/data/cgi/ports.cgi @@ -0,0 +1,613 @@ +#!/usr/bin/perl +# +# Copyright (c) 1996-1997 Wolfram Schneider , Berlin. +# 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. +# +# $Id: ports.cgi,v 1.1 1997-09-19 16:47:40 wosch Exp $ +# +# ports.cgi - search engine for FreeBSD ports +# o search for a port by name or description +# o search for new or updated ports +# +# +# If you want use this script on your own host this line must +# work for you: $ cvs rdiff -D'last week' ports/INDEX + + +sub init_variables { + $cvsroot = '/home/ncvs'; # $CVSROOT + $localPrefix = '/usr/ports'; # ports prefix + $ports_database = 'ports/INDEX'; + # unset $ENV{'CVSROOT'}; + + @cvscmd = ('cvs', '-Q', '-d', $cvsroot); + + # URL of ports tree for browsing + $remotePrefixFtp = + 'http://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports'; + + # URL of ports tree for download + $remotePrefixFtpDownload = + # 'ftp://ftp.cs.tu-berlin.de/pub/FreeBSD/FreeBSD-current/ports'; + 'ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports'; + + # where to get -current packages + local($p) = 'ftp://ftp.freebsd.org/pub/FreeBSD'; + $remotePrefixFtpPackagesDefault = 'current'; + %remotePrefixFtpPackages = + ('current', "$p/packages-stable/All", + '2.2.2', "$p/packages-2.2.2/All", + '2.1.6', "$p/packages-2.1.6/All", + '2.1.0', "$p/packages-2.1/All", + ); + + %relDate = + ('current', 'today', + '2.2.2', '5/16/97', + '2.1.6', '11/16/96', + '2.1.0', '11/19/95', + ); + + # + $remotePrefixHtml = + 'http://www.freebsd.org/ports'; + + # CVS Web interface + $remotePrefixCvs = + 'http://www.freebsd.org/cgi/cvsweb.cgi/ports'; + + # Ports documentation + $portsDesc = 'http://www.freebsd.org/ports/'; + + # location of the tiny BSD daemon + $daemonGif = ''; + + # visible E-Mail address, plain text + $mailto = 'wosch@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 = 'http://www.apfel.de/~wosch/'; + $mailtoURL = "mailto:$mailto" if !$mailtoURL; + + # security + $ENV{'PATH'} = '/bin:/usr/bin'; + + # ports download sources script + $pds = 'pds.cgi'; +} + +# return the date of the last ports database update +sub last_update { + local($file) = "$cvsroot/$ports_database,v"; + local($date) = 'unknown'; + + open(DB, $file) || do { + &warn("$file: $!\n"); &exit; + }; + while() { + if (/^date/ && /^date\s+([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+);\s+/) { + $date = ($1 + 1900) . qq{/$2/$3 $4:$5:$6 UTC}; + last; + } + } + close DB; + return $date; +} + +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($date, *var, *msec) = @_; + local(@co) = ('co', '-p', '-D', $date, $ports_database); + local(@tmp, @s); + + open(C, "-|") || exec (@cvscmd, @co); + + while() { + 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(@co) = ('co', '-p', 'ports/INDEX'); + + open(C, "-|") || exec (@cvscmd, @co); + + local(@a, @b, %key); + 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, $depends, @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; + $descfile =~ s/^$localPrefix/$remotePrefixFtp/o; + + 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 ($depends) { + local($flag) = 0; + print qq{Requires: }; + foreach (split(/\s+/, $depends)) { + print ", " if $flag; + $flag++; + print qq{$_}; + } + print "
\n"; + } + + print qq[Description : +Browse : +Download : +Package : +Changes : +Sources +

+]; + +}; + + +}; + +# new/updated/removed ports output +sub out_ports { + + if ($type eq "new") { + foreach $key (sort keys %today) { + if (!$past{$key}) { + if ($section eq "all" || $msec{"$key,$section"}) { + &out($today{$key}, 0); + } + } + } + } elsif ($type eq "removed") { + foreach $key (sort keys %past) { + if (!$today{$key}) { + if ($section eq "all" || $msec{"$key,$section"}) { + &out($past{$key}, 1); + } + } + } + } else { # changed + foreach $key (sort keys %today) { + if ($past{$key} && $past{$key} ne $today{$key}) { + @a = split(/\|/, $today{$key}); + @b = split(/\|/, $past{$key}); + next if $a[0] eq $b[0]; + if ($section eq "all" || $msec{"$key,$section"}) { + &out($today{$key}, 0); + } + } + } + } +} + +# 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); + } + } +} + + +sub forms { + print qq{ + +FreeBSD Ports Changes + + +

FreeBSD Ports Changes $daemonGif

+ +

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

+}; + + print qq{ +"Package Name" search for the name of port or distribution. +"Description" search case-insensitive in a short comment about the port. +"All" search case-insensitive for the package name and in the +description about the port. +

+ +

+Search for: + + + +
+}; + + print qq{
+

+"New" print ports which are new in the ports collection +or moved from an other ports section. "Changed" print updated ports. +"Removed" print ports which are deleted from ports collections +or moved to an other ports section. + +

+\n\n + + + +
+
+}; + +} + +sub footer { + + print qq{ + +© 1996-1997 by Wolfram Schneider. All rights reserved.
+}; + #print q{$Date: 1997/03/20 21:43:48} . "
\n"; + print qq{Please direct questions about this service to +$mailto
\n}; + print qq{General questions about FreeBSD ports should be sent to } . + q{} . + 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 "all")) { + &warn("unknown search type ``$type'', use `all', `text', or `name'\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$/) { + &warn("unkwnon date: `$time'\n"); + &exit(0); + } +} + +sub faq { + print qq{\nFAQ\n + +

FreeBSD Ports Changed FAQ

+ +

Keywords

+
+
Description
A more detailed description. +
Browse
Traverse the ports directory. +
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 all operation. INDEX,v will be updated by hand +by the portsmeister.

+ +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'); + +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; +} + +&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; + +if ($query_string eq "") { + &footer; &footer2; &exit(0); +} + +#warn "type: $type time: $time section: $section stype: $stype query: $query"; +&check_input; +$counter = 0; + +# search +if ($query) { + &readindex($relDate{$release}, *today, *msec); + $query =~ s/([^\w\^])/\\$1/g; + &search_ports; +} + +# ports changes +else { + &readindex('today', *today, *msec); + &readindex($time, *past, *msec); + &out_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; diff --git a/en/cgi/pds.cgi b/en/cgi/pds.cgi new file mode 100755 index 0000000000..f45a3acd81 --- /dev/null +++ b/en/cgi/pds.cgi @@ -0,0 +1,53 @@ +#!/bin/sh +# Copyright (c) 1997 Wolfram Schneider , Berlin. +# All rights reserved. +# +# pds.cgi - FreeBSD Ports download sources cgi script +# print a list of source files for a port +# + +file="$QUERY_STRING" +file2="$file/Makefile" +CVSROOT=/home/ncvs; export CVSROOT + +# set DISTDIR to a dummy directory. +DISTDIR=/tmp/___pds.cgi___; export DISTDIR + +cat < + +Sources for $file + + + +

Sources for $file

+ +EOF +cvs -Q co -p $file2 | make -I /home/fenner/mk -f - bill-fetch | + perl -ne 'print qq{$1
\n} + if m%((http|ftp)://\S+)%' +cat < + +EOF diff --git a/en/cgi/ports.cgi b/en/cgi/ports.cgi new file mode 100755 index 0000000000..0cbf27f150 --- /dev/null +++ b/en/cgi/ports.cgi @@ -0,0 +1,613 @@ +#!/usr/bin/perl +# +# Copyright (c) 1996-1997 Wolfram Schneider , Berlin. +# 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. +# +# $Id: ports.cgi,v 1.1 1997-09-19 16:47:40 wosch Exp $ +# +# ports.cgi - search engine for FreeBSD ports +# o search for a port by name or description +# o search for new or updated ports +# +# +# If you want use this script on your own host this line must +# work for you: $ cvs rdiff -D'last week' ports/INDEX + + +sub init_variables { + $cvsroot = '/home/ncvs'; # $CVSROOT + $localPrefix = '/usr/ports'; # ports prefix + $ports_database = 'ports/INDEX'; + # unset $ENV{'CVSROOT'}; + + @cvscmd = ('cvs', '-Q', '-d', $cvsroot); + + # URL of ports tree for browsing + $remotePrefixFtp = + 'http://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports'; + + # URL of ports tree for download + $remotePrefixFtpDownload = + # 'ftp://ftp.cs.tu-berlin.de/pub/FreeBSD/FreeBSD-current/ports'; + 'ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports'; + + # where to get -current packages + local($p) = 'ftp://ftp.freebsd.org/pub/FreeBSD'; + $remotePrefixFtpPackagesDefault = 'current'; + %remotePrefixFtpPackages = + ('current', "$p/packages-stable/All", + '2.2.2', "$p/packages-2.2.2/All", + '2.1.6', "$p/packages-2.1.6/All", + '2.1.0', "$p/packages-2.1/All", + ); + + %relDate = + ('current', 'today', + '2.2.2', '5/16/97', + '2.1.6', '11/16/96', + '2.1.0', '11/19/95', + ); + + # + $remotePrefixHtml = + 'http://www.freebsd.org/ports'; + + # CVS Web interface + $remotePrefixCvs = + 'http://www.freebsd.org/cgi/cvsweb.cgi/ports'; + + # Ports documentation + $portsDesc = 'http://www.freebsd.org/ports/'; + + # location of the tiny BSD daemon + $daemonGif = ''; + + # visible E-Mail address, plain text + $mailto = 'wosch@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 = 'http://www.apfel.de/~wosch/'; + $mailtoURL = "mailto:$mailto" if !$mailtoURL; + + # security + $ENV{'PATH'} = '/bin:/usr/bin'; + + # ports download sources script + $pds = 'pds.cgi'; +} + +# return the date of the last ports database update +sub last_update { + local($file) = "$cvsroot/$ports_database,v"; + local($date) = 'unknown'; + + open(DB, $file) || do { + &warn("$file: $!\n"); &exit; + }; + while() { + if (/^date/ && /^date\s+([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+);\s+/) { + $date = ($1 + 1900) . qq{/$2/$3 $4:$5:$6 UTC}; + last; + } + } + close DB; + return $date; +} + +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($date, *var, *msec) = @_; + local(@co) = ('co', '-p', '-D', $date, $ports_database); + local(@tmp, @s); + + open(C, "-|") || exec (@cvscmd, @co); + + while() { + 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(@co) = ('co', '-p', 'ports/INDEX'); + + open(C, "-|") || exec (@cvscmd, @co); + + local(@a, @b, %key); + 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, $depends, @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; + $descfile =~ s/^$localPrefix/$remotePrefixFtp/o; + + 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 ($depends) { + local($flag) = 0; + print qq{Requires: }; + foreach (split(/\s+/, $depends)) { + print ", " if $flag; + $flag++; + print qq{$_}; + } + print "
\n"; + } + + print qq[Description : +Browse : +Download : +Package : +Changes : +Sources +

+]; + +}; + + +}; + +# new/updated/removed ports output +sub out_ports { + + if ($type eq "new") { + foreach $key (sort keys %today) { + if (!$past{$key}) { + if ($section eq "all" || $msec{"$key,$section"}) { + &out($today{$key}, 0); + } + } + } + } elsif ($type eq "removed") { + foreach $key (sort keys %past) { + if (!$today{$key}) { + if ($section eq "all" || $msec{"$key,$section"}) { + &out($past{$key}, 1); + } + } + } + } else { # changed + foreach $key (sort keys %today) { + if ($past{$key} && $past{$key} ne $today{$key}) { + @a = split(/\|/, $today{$key}); + @b = split(/\|/, $past{$key}); + next if $a[0] eq $b[0]; + if ($section eq "all" || $msec{"$key,$section"}) { + &out($today{$key}, 0); + } + } + } + } +} + +# 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); + } + } +} + + +sub forms { + print qq{ + +FreeBSD Ports Changes + + +

FreeBSD Ports Changes $daemonGif

+ +

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

+}; + + print qq{ +"Package Name" search for the name of port or distribution. +"Description" search case-insensitive in a short comment about the port. +"All" search case-insensitive for the package name and in the +description about the port. +

+ +

+Search for: + + + +
+}; + + print qq{
+

+"New" print ports which are new in the ports collection +or moved from an other ports section. "Changed" print updated ports. +"Removed" print ports which are deleted from ports collections +or moved to an other ports section. + +

+\n\n + + + +
+
+}; + +} + +sub footer { + + print qq{ + +© 1996-1997 by Wolfram Schneider. All rights reserved.
+}; + #print q{$Date: 1997/03/20 21:43:48} . "
\n"; + print qq{Please direct questions about this service to +$mailto
\n}; + print qq{General questions about FreeBSD ports should be sent to } . + q{} . + 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 "all")) { + &warn("unknown search type ``$type'', use `all', `text', or `name'\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$/) { + &warn("unkwnon date: `$time'\n"); + &exit(0); + } +} + +sub faq { + print qq{\nFAQ\n + +

FreeBSD Ports Changed FAQ

+ +

Keywords

+
+
Description
A more detailed description. +
Browse
Traverse the ports directory. +
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 all operation. INDEX,v will be updated by hand +by the portsmeister.

+ +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'); + +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; +} + +&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; + +if ($query_string eq "") { + &footer; &footer2; &exit(0); +} + +#warn "type: $type time: $time section: $section stype: $stype query: $query"; +&check_input; +$counter = 0; + +# search +if ($query) { + &readindex($relDate{$release}, *today, *msec); + $query =~ s/([^\w\^])/\\$1/g; + &search_ports; +} + +# ports changes +else { + &readindex('today', *today, *msec); + &readindex($time, *past, *msec); + &out_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;