diff options
Diffstat (limited to 'website/content/en/cgi/ports.cgi')
-rwxr-xr-x | website/content/en/cgi/ports.cgi | 237 |
1 files changed, 120 insertions, 117 deletions
diff --git a/website/content/en/cgi/ports.cgi b/website/content/en/cgi/ports.cgi index fd5b8962c4..d2c32d24c2 100755 --- a/website/content/en/cgi/ports.cgi +++ b/website/content/en/cgi/ports.cgi @@ -1,6 +1,6 @@ #!/usr/bin/perl -T # -# Copyright (c) 1996-2022 Wolfram Schneider <wosch@FreeBSD.ORG> +# Copyright (c) 1996-2024 Wolfram Schneider <wosch@FreeBSD.ORG> # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -24,21 +24,32 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $FreeBSD$ -# # 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`<style type="text/css"> +$t_style = qq` +<style type="text/css"> h3 { font-size: 1.2em; border-bottom: thin solid black; } +span.footer_links { font-size: small; } + +form#ports > input[name='query'] { text-align: center; } +form#ports > input[name='query'] { width: 14em; } +form#ports > input, form#ports > button, form#ports > select { font-size: large; } </style> + <link rel="search" type="application/opensearchdescription+xml" href="https://www.freebsd.org/opensearch/ports.xml" title="FreeBSD Ports" /> `; +# No unlimited result set. A HTML page with 1000 results can be 10MB big. +my $max_hits = 1000; +my $max_hits_default = 250; +my $max; + +my $debug = 1; + sub init_variables { $localPrefix = '/usr/ports'; # ports prefix @@ -59,66 +70,9 @@ sub init_variables { # URL of ports tree for browsing $remotePrefixFtp = 'ports'; - # 'ftp://ftp.FreeBSD.org/pub/FreeBSD/branches/-current/ports'; - - # 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"; - # Web interface for the Ports tree $remotePrefixRepo = 'https://cgit.FreeBSD.org/ports'; - # Ports documentation - $portsDesc = "$hsty_base/ports/"; - - # location of the tiny BSD daemon - $daemonGif = -"<img src='$hsty_base/gifs/littlelogo.gif' alt='Really small BSD Daemon'>"; - # visible E-Mail address, plain text $mailto = 'www@FreeBSD.org'; @@ -133,13 +87,6 @@ sub init_variables { # security $ENV{'PATH'} = '/bin:/usr/bin'; - - # extension type for packages - $packageExt = 'tbz'; - - local ($packageDB) = '../ports/packages.exists'; - &packages_exist( $packageDB, *packages ) if -f $packageDB; - } sub packages_exist { @@ -176,7 +123,7 @@ sub last_update { } sub last_update_message { - return "<p>Last database update: " . &last_update . "</p>\n"; + return "<p>Last database update: @{[ &last_update ]}</p>\n"; } sub dec { @@ -244,7 +191,7 @@ sub readindex { chop; @tmp = split(/\|/); - $var{"$tmp[1]"} = $_; + $var{"$tmp[0]"} = $_; @s = split( /\s+/, $tmp[6] ); foreach (@s) { $msec{"$tmp[1],$_"} = 1; @@ -324,7 +271,6 @@ sub out { } $counter++; - $pathDownload = $path; $pathB = $path; $pathB =~ s/^$localPrefix/ports/o; @@ -346,12 +292,6 @@ sub out { print qq[<a href="$descfile?revision=HEAD">Description</a> <b>:</b>\n]; - # Link package in "default" arch/release. Verify it's existence on ftp-master. - if ( $packages{"$version.$packageExt"} ) { - print -qq[<a href="$remotePrefixFtpPackages{$remotePrefixFtpPackagesDefault}/$version.$packageExt">Package</a> <b>:</b>\n]; - } - print qq[<a href="$l">Changes</a> <br />\n]; print qq{<i>Maintained by:</i> <a href="mailto:$email} @@ -404,6 +344,7 @@ sub search_ports { foreach $key ( sort keys %today ) { next if $today{$key} !~ /$query/oi; + next if $counter >= $max; @a = split( /\|/, $today{$key} ); $name = $a[0]; #$name =~ s/(\W)/\\$1/g; @@ -439,8 +380,7 @@ sub search_ports { sub forms { print qq{<p> -FreeBSD Ports [short description <a href="$portsDesc">followed</a> ...] -<a href="$script_name?stype=faq">FAQ</a> +The FreeBSD Ports and Packages Collection offers a simple way for users and administrators to install applications. </p> }; @@ -451,9 +391,9 @@ FreeBSD Ports [short description <a href="$portsDesc">followed</a> ...] description about the port. </p> -<form method="get" action="$script_name"> +<form id="ports" method="get" action="$script_name"> Search for: -<input name="query" value="$query" type="text" autocapitalize="none" /> +<input name="query" value="$query" type="text" autocapitalize="none" autofocus /> <select name="stype"> }; @@ -484,9 +424,11 @@ Search for: . qq{value="$_">$_</option>\n}; } - print q{</select> + print qq{</select> <input type="submit" value="Submit" /> </form> +<br/> +@{[ &footer_links ]} <hr noshade="noshade" /> }; @@ -494,17 +436,38 @@ Search for: sub footer { - print qq{ -<img align="right" src="$hsty_base/gifs/powerlogo.gif" alt="Powered by FreeBSD" /> -© 1996-2022 by Wolfram Schneider. All rights reserved.<br /> -}; +print <<EOF; +<span class="footer_links"> + <img align="right" src="$hsty_base/gifs/powerlogo.gif" alt="Powered by FreeBSD"/> + © 1996-2024 by Wolfram Schneider. All rights reserved.<br/> + + General questions about FreeBSD ports should be sent to + <a href="mailto:$mailtoList"><i>$mailtoList</i></a><br/> -#print q{$FreeBSD$} . "<br />\n"; - print qq{General questions about FreeBSD ports should be sent to } - . qq{<a href="mailto:$mailtoList">} - . qq{<i>$mailtoList</i></a><br />\n}; - print &last_update_message; - print qq{<hr noshade="noshade" />\n<p />\n}; + @{[ &last_update_message ]} +</span> +<hr noshade="noshade" /> +<p/> + +EOF +} + +sub check_query { + my ($query, $sourceid) = @_; + + $query =~ s/"/ /g; + $query =~ s/^\s+//; + $query =~ s/\s+$//; + + # XXX: Firefox opensearch autocomplete workarounds + if ($sourceid eq 'opensearch') { + # remove space before a dot + $query =~ s/ \././g; + # remove space between double colon + $query =~ s/: :/::/g; + } + + return $query; } sub check_input { @@ -521,41 +484,65 @@ sub check_input { ) { &warn( -"unknown search type ``$type'', use `all', `text', `name', 'requires', or `maintainer'\n" +"unknown search type ``$stype'', use `all', `text', `name', 'requires', or `maintainer'\n" ); &exit(0); } - else { - return; - } + } + + $max = int($max); + if ($max <= 0 || $max > $max_hits) { + warn "reset max=$max to $max_hits_default\n"; + $max = $max_hits_default; } } sub faq { - print qq{<H1>FreeBSD Ports Search FAQ</h1> + print <<EOF +<br/> +<h1>FreeBSD Ports Search Help</h1> <h2>Keywords</h2> <dl> -<dt><b>Description</b><dd>A more detailed description. -<dt><b>Changes</b><dd>Read the latest changes. -</dl> + <dt><b>Description</b></dt> + <dd>A more detailed description (text).</dd> -<h2>Misc</h2> + <dt><b>Changes</b></dt> + <dd>Read the latest changes via the git repo</dd> +</dl> +<h2>Documentation</h2> <p> -The script ports.cgi use the file -<a href="$hsty_base/ports/$ports_database.xz">$ports_database</a> -as database for it's operations. $ports_database is updated automatically every -two hours.</p> +Handbook: <a href="https://docs.freebsd.org/en/books/handbook/ports/#ports-using">Using the Ports Collection</a> +</p> <p> You may also search the -<a href="https://www.FreeBSD.org/cgi/man.cgi?manpath=FreeBSD+Ports">ports manual pages</a>.</p> +<a href="https://man.FreeBSD.org/cgi/man.cgi?manpath=freebsd-ports">ports manual pages</a>. +</p> + +<h2>Updates</h2> <p> -<a href="$script_name">Back to the search engine</a></p> +The script ports.cgi use the file +<a href="https://download.FreeBSD.org/ports/index/$ports_database.xz">$ports_database</a> +as database for its operations. $ports_database is updated automatically every +two hours. +</p> + + +@{[ &footer_links ]} <hr noshade="noshade" /> -}; +EOF +} + +sub footer_links { + return <<EOF; +<span class="footer_links"> + <a href="$script_name">home</a> + @{[ $stype eq "faq" ? "" : qq, | <a href="$script_name?stype=faq">help</a>, ]} +</span> +EOF } # @@ -571,7 +558,9 @@ $section = $form{'sektion'}; $section = 'all' if ( !$section ); $query = $form{'query'}; $stype = $form{'stype'}; +$sourceid = $form{'sourceid'} // ""; $script_name = &env('SCRIPT_NAME'); +$max = $form{'max'} // $max_hits_default; if ( $path_info eq "/source" ) { @@ -584,7 +573,7 @@ if ( $path_info eq "/source" ) { } if ( $stype eq "faq" ) { - print &short_html_header( "FreeBSD Ports Search FAQ", 1 ); + print &short_html_header( "FreeBSD Ports Search Help", 1 ); &faq; &footer; print &html_footer; @@ -602,9 +591,7 @@ if ( !$query && $query_string =~ /^([^=&]+)$/ ) { # automatically read collections, need only 0.2 sec on a pentium @sec = &readcoll; -$query =~ s/"/ /g; -$query =~ s/^\s+//; -$query =~ s/\s+$//; +$query = &check_query($query, $sourceid); &forms; if ( $query_string eq "" || !$query ) { @@ -616,20 +603,36 @@ if ( $query_string eq "" || !$query ) { &check_input; $counter = 0; +# no prefix search for requires supported yet +$query =~ s/^\^// if $stype eq 'requires'; + +# quote non characters +$query =~ s/([^\w\^])/\\$1/g; + # 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{<a href="/search/">FreeBSD Search Services</a>.\n}; + print <<EOF; +<p> +Sorry, nothing found. +You may look for other <a href="https://www.freebsd.org/search/">FreeBSD Search Services</a> +</p> +EOF } + else { print "</dl>\n"; + my $counter_message = $counter; + if ($counter >= $max) { + $counter_message .= " (max hit limit reached)"; + warn "$counter_message: query=$query stype=$stype section=$section\n" if $debug >= 1; + } + print "<p>Number of hits: $counter_message\n</p>\n"; + print &footer_links; } print qq{<hr noshade="noshade" />\n}; |