#! /usr/bin/perl # ex:ts=8 sw=4: # # Copyright (c) 2012 Marc Espie # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use strict; use warnings; use DBI; use Template; use File::Path qw(make_path); use File::Basename; use File::Spec; use Data::Dumper; sub relative_url { my ($a, $b) = @_; $a .= ".html"; $b .= ".html"; return File::Spec->abs2rel($a, dirname($b)); } my $db = DBI->connect("dbi:SQLite:dbname=$ENV{DATABASE}", '', '', {ReadOnly => 1}); my $outputdir = $ENV{OUTPUTDIR}; my $template = Template->new( { INCLUDE_PATH => $ENV{TEMPLATESDIR}, OUTPUT_PATH => $outputdir, }); my $info_req = $db->prepare( qq{select _paths.id, _paths.fullpkgpath, _ports.comment, _ports.homepage, _descr.value, fullpkgname, permit.value from _paths join _Ports on _paths.id=_Ports.fullpkgpath left join _Descr on _paths.id=_Descr.fullpkgpath join _keywords2 permit on _ports.permit_package=permit.keyref order by _paths.fullpkgpath}); my ($id, $path, $comment, $homepage, $descr, $fullpkgname, $permit); $info_req->bind_columns(\($id, $path, $comment, $homepage, $descr, $fullpkgname, $permit)); my $dep_req = $db->prepare( q{select _depends.type, _depends.fulldepends, t2.fullpkgpath from _depends join _paths on _depends.dependspath=_paths.id join _paths t2 on _paths.canonical=t2.id where _depends.fullpkgpath=? order by _depends.fulldepends }); my ($type, $fulldepends, $dependspath); $dep_req->bind_columns(\($type, $fulldepends, $dependspath)); my $multi_req = $db->prepare( q{select _ports.fullpkgname, t2.fullpkgpath from _multi join _paths on _multi.subpkgpath=_paths.id join _paths t2 on _paths.canonical=t2.id join _ports on _paths.canonical=_ports.fullpkgpath where _multi.fullpkgpath=? }); my ($multi, $subpath); $multi_req->bind_columns(\($multi, $subpath)); my $only_for = $db->prepare( q{select _Arch.value from _OnlyForArch join _Arch on _arch.keyref=_OnlyForArch.value where _OnlyForArch.fullpkgpath=? order by _Arch.value }); my $arch; $only_for->bind_columns(\($arch)); my $not_for = $db->prepare( q{select _Arch.value from _NotforArch join _Arch on _arch.keyref=_NotForArch.value where _NotForArch.fullpkgpath=? order by _Arch.value }); $not_for->bind_columns(\($arch)); my $category; my $cat_req = $db->prepare( q{select _categorykeys.value from _categories join _categorykeys on _categorykeys.keyref=_categories.value where _categories.fullpkgpath=? order by _categorykeys.value }); $cat_req->bind_columns(\($category)); my $broken_req = $db->prepare( q{select _arch.value, _broken.value from _broken left join _arch on _arch.keyref=_broken.arch where fullpkgpath=? order by _arch.value}); my $broken; $broken_req->bind_columns(\($arch, $broken)); my $cat = {}; my @depends = (qw(libdepends rundepends builddepends regressdepends)); $info_req->execute; while ($info_req->fetch) { print "+++$path\n"; my $e = { path => $path, comment => $comment, homepage => $homepage, descr => $descr, fullpkgname => $fullpkgname }; unless ($permit =~ /yes/i) { $e->{permitp} = $permit; } $dep_req->execute($id); while ($dep_req->fetch) { push(@{$e->{$depends[$type]}}, { depends => $fulldepends, url => relative_url($dependspath, $e->{path}) }); } $broken_req->execute($id); while ($broken_req->fetch) { push (@{$e->{broken}}, { arch => $arch, text => $broken }); } $only_for->execute($id); while ($only_for->fetch) { push (@{$e->{only_for}}, $arch); } $not_for->execute($id); while ($not_for->fetch) { push (@{$e->{not_for}}, $arch); } $multi_req->execute($id); while ($multi_req->fetch) { push @{$e->{multi}}, { name => $multi, url => relative_url($subpath, $e->{path}) }; } $cat_req->execute($id); while ($cat_req->fetch) { push @{$e->{category}}, { name => $category, url => relative_url("cat/$category", "path/$e->{path}") }; $cat->{$category}{$e->{fullpkgname}} = $e->{path}; } $template->process('port.tt2', $e, "path/$e->{path}.html") or die; } print "Generating category indexes\n"; while (my ($c, $h) = each %$cat) { my $e = { category => $c}; for my $pkgname (sort keys %$h) { my $p = $h->{$pkgname}; push @{$e->{ports}}, { name => $pkgname, url => relative_url("path/$p", "cat/$c") }; } $template->process('category.tt2', $e, "cat/$c.html") or die; } print "Generating main index\n"; my $e = {}; for my $c (sort keys %$cat) { push @{$e->{categories}}, { name => $c, url => "cat/$c.html" }; } $template->process('main.tt2', $e, "index.html") or die;