From 5cc77bc7f180e1923ae90cc522f27efb55c82b8a Mon Sep 17 00:00:00 2001 From: Yorhel Date: Fri, 28 Feb 2025 13:55:57 +0100 Subject: [PATCH] Fixes and updates for new FU version --- .gitignore | 1 + README.md | 2 +- www/index.pl | 43 +++++++++++++++++++++++-------------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index f8c9a00..2f129b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*~ /ManUtils/* !/ManUtils/Makefile.PL !/ManUtils/ManUtils.pm diff --git a/README.md b/README.md index 40e390c..05c5b33 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Ironically, documentation about how things work is completely lacking. ## File structure - **indexer/** -> The Rust program that scans package repositories for updates, fetches new packages and extracts the man pages. -- **lib/ManUtils/** -> Perl/XS helper module to format man pages into HTML (uses **web/**). +- **ManUtils/** -> Perl/XS helper module to format man pages into HTML (uses **web/**). - **sql/** -> Database schema & updates. - **util/** -> Cron job and scripts to run **indexer/** on the right repositories. - **web/** -> Badly named Rust library to convert man pages into HTML. diff --git a/www/index.pl b/www/index.pl index 1e7f0df..7b55b17 100755 --- a/www/index.pl +++ b/www/index.pl @@ -5,7 +5,7 @@ use FU -spawn; use FU::SQL; use FU::XMLWriter ':html5_'; use FU::Util 'httpdate_format', 'uri_escape'; -use POSIX 'ceil'; +use POSIX 'ceil', 'strftime'; use List::Util 'uniq', 'min'; use Time::Local 'timegm'; @@ -17,7 +17,9 @@ use lib "$ROOT/ManUtils/blib/lib", "$ROOT/ManUtils/blib/arch"; use ManUtils; -FU::init_db(''); # Must be configured through env vars +# Database must be configured through env vars +FU::init_db(sub { FU::Pg->connect('')->set_type(bytea => '$hex') }); +FU::debug_info('/fu-debug', 'debug~', 10); FU::log_slow_reqs 500; @@ -28,10 +30,11 @@ FU::before_request { }; -# Set the last modification time from a string in yyyy-mm-dd format. +sub fmtdate { strftime '%Y-%m-%d', gmtime $_[0] } + +# Set the last modification time sub FU::obj::set_lastmod($, $d) { - return if $d !~ /^(\d{4})-(\d{2})-(\d{2})/; - fu->set_header('last-modified', httpdate_format timegm 0,0,0,$3,$2-1,$1); + fu->set_header('last-modified', httpdate_format $d) if $d; } @@ -727,7 +730,7 @@ sub soelim($verid, $src) { sub man_page($man, $url) { fu->set_lastmod($man->{released}); - my($hash, $content) = fu->SQL('SELECT encode(hash, \'hex\') AS hash, content FROM contents WHERE id =', $man->{content})->rowl; + my($hash, $content) = fu->SQL('SELECT hash, content FROM contents WHERE id =', $man->{content})->rowl; if($url->{fmt} eq 'raw') { fu->set_header('content-type', 'text/plain'); fu->set_header('content-disposition', sprintf 'filename="%s.%s"', $man->{name}, $man->{section}); @@ -786,7 +789,7 @@ FU::get qr{/([^/]+)(?:/([0-9a-f]{8}))?} => sub($name, $shorthash=undef) { $name = normalize_name $name; my($man, $sect) = man_pref_name $name, $shorthash ? SQL 'f.shorthash =', shorthash_to_int $shorthash : 'true'; - fu->error(404) if !$man->{name}; + fu->notfound if !$man->{name}; man_page $man, ManUrl->new( fmt => 'man', @@ -801,7 +804,7 @@ FU::get qr{/([^/]+)/([0-9a-f]{8})/src} => sub($name, $shorthash) { $name = normalize_name $name; my($man) = man_pref_name $name, SQL 'f.shorthash =', shorthash_to_int $shorthash; - fu->error(404) if !$man->{name}; + fu->notfound if !$man->{name}; man_page $man, ManUrl->new(fmt => 'raw', man => $name); }; @@ -815,12 +818,12 @@ FU::get qr{/(man|txt|raw)(?:\.([a-fA-F0-9]{8}))?(?:\.([^/]+))?/(.+)} => sub($fmt if($system) { my $sysid = sysbyshort->{$system}; $sysid = $sysid ? [$sysid->{id}] : [ map sysbyshort->{$_}{id}, grep /^\Q$system\E-/, keys sysbyshort->%* ]; - fu->error(404) if !@$sysid; + fu->notfound if !@$sysid; push @where, SQL system => IN $sysid; } my($pkg, $ver, $redir) = length $path ? pkg_frompath AND(@where), $path : (undef,undef); - fu->error(404) if length $path && !$pkg; + fu->notfound if length $path && !$pkg; push @where, SQL 'p.id =', $pkg->{id} if $pkg; push @where, SQL 'v.version =', $ver if length $ver; @@ -828,7 +831,7 @@ FU::get qr{/(man|txt|raw)(?:\.([a-fA-F0-9]{8}))?(?:\.([^/]+))?/(.+)} => sub($fmt push @where, SQL 'l.locale =', $lang if $lang; my($man, $section) = man_pref_name $name, AND @where; - fu->error(404) if !$man; + fu->notfound if !$man; my $url = ManUrl->new( fmt => $fmt, @@ -847,7 +850,7 @@ FU::get qr{/(man|txt|raw)(?:\.([a-fA-F0-9]{8}))?(?:\.([^/]+))?/(.+)} => sub($fmt FU::get qr{/pkg/([^/]+)} => sub($short) { my $sys = sysbyshort->{$short}; - fu->error(404) if !$sys; + fu->notfound if !$sys; $FU::REQ->{qs} =~ s/;/&/g if $FU::REQ->{qs}; # HACK: old URLs used ';' as separator instead of '&' my $f = fu->query( @@ -889,10 +892,10 @@ FU::get qr{/pkg/([^/]+)} => sub($short) { # Package info: /pkg/$system[/$category]/$name[/$version]; $category and $name may contain slashes, too. FU::get qr{/pkg/([^/]+)/(.+)} => sub($short, $path) { my $sys = sysbyshort->{$short}; - fu->error(404) if !$sys; + fu->notfound if !$sys; my($pkg, $ver, $redir) = pkg_frompath(SQL('system =', $sys->{id}), $path); - fu->error(404) if !$pkg; + fu->notfound if !$pkg; fu->redirect(perm => "/pkg/$short/$pkg->{name}".($ver?"/$ver":'')) if $redir; my $vers = fu->SQL(' @@ -903,7 +906,7 @@ FU::get qr{/pkg/([^/]+)/(.+)} => sub($short, $path) { ORDER BY released DESC' )->allh; my $sel = $ver ? (grep $_->{version} eq $ver, @$vers)[0] : $vers->[0]; - fu->error(404) if !$sel; + fu->notfound if !$sel; my $p = fu->query(p => { onerror => 1, uint => 1, range => [1,100] }); @@ -945,7 +948,7 @@ FU::get qr{/pkg/([^/]+)/(.+)} => sub($short, $path) { li_ sub { a_ href => "/pkg/$pkgpath/$_->{version}", $_->{version} if $_ != $sel; b_ " $_->{version}" if $_ == $sel; - small_ " $_->{released}"; + small_ ' '.fmtdate $_->{released}; } for(@$vers); } }; @@ -993,11 +996,11 @@ FU::get qr{/loc/([a-fA-F0-9]{40})}, sub($hash) { JOIN mans m ON m.id = f.man JOIN package_versions v ON v.id = f.pkgver JOIN packages p ON p.id = v.package - WHERE f.content = (SELECT id FROM contents WHERE hash = decode(', $hash, ", 'hex')) + WHERE f.content = (SELECT id FROM contents WHERE hash =', $hash, ') ORDER BY p.system DESC, p.name, v.released DESC, f.filename - LIMIT ", $maxlisting + LIMIT ', $maxlisting )->allh; - fu->error(404) if !@$l; + fu->notfound if !@$l; my %sys; push $sys{ sysbyid->{$_->{system}}{name} }->@*, $_ for @$l; @@ -1138,7 +1141,7 @@ FU::get qr{/ver(?:\.([a-fA-F0-9]{8}))?(?:\.([^/]+))?/([^/]+)\.([0-9a-zA-Z]+)}, s td_ sub { a_ href => "/pkg/$sys->{short}/$_->{package}/$_->{version}", $_->{package}.'-'.$_->{version}; }; - td_ $_->{released}; + td_ fmtdate $_->{released}; td_ class => 'sh', sub { my $hex = shorthash_to_hex $_->{shorthash}; txt_ $hex if $_->{shorthash} == $shorthash;