The following commit has been merged in the master branch:
commit c6fdd0f2653303fcc8a5307e106e77161f436b44
Author: Frank Lichtenheld <[EMAIL PROTECTED]>
Date: Fri Feb 8 01:06:00 2008 +0100
Complete rewrite of create_index_pages
The old version was very hard on all of CPU, memory,
and I/O. The new version tries to at least lessen the
burden on memory (and to a lesser extend on CPU), in the
hopes that this will indirectly (by lesser swapping) also
reduce the stress on I/O.
In the old version we first collected all the information
about all packages and then wrote the index files one after
one with TT.
The newer version tries to write all of the index files while
collecting the package information, therefor eliminating the
need to store any information longer than needed. Because the
amount of files we can open simulaniously is limited though,
we can't write all the index files at once. Instead we write
one index files for all languages, and in a second step then
use these files to write one file per language. I tried to
use the "slice" program for that, but it also computes all
the results in memory, while I wanted to have a concurrent
approach here as well.
Since we only use a very limited subset of the features of slice
I wrote a simple replacement that supports the bare minimum of
what we need with the price that we need to be a bit careful
about the format of the slice source files.
I also don't use TT for the package entries anymore since here
as well we only used a very limited set of features and I wanted
to make this script as fast as possible (without having to rewrite
it in C ;). The header and footer still use TT since this part isn't
speed critical and we can reuse the templates we have for the dynamic
pages.
diff --git a/bin/create_index_pages b/bin/create_index_pages
index 53443bc..0766f78 100755
--- a/bin/create_index_pages
+++ b/bin/create_index_pages
@@ -13,6 +13,7 @@ use Compress::Zlib;
use lib './lib';
+use Packages::CommonCode qw(:all);
use Packages::Config qw( $TOPDIR $DBDIR @ARCHIVES @SUITES @LANGUAGES );
use Packages::Template;
use Packages::I18N::Locale;
@@ -21,6 +22,8 @@ use Packages::SrcPage;
use Packages::Sections;
&Packages::Config::init( './' );
+use constant DEBUG => 0;
+
my $wwwdir = "$TOPDIR/www";
tie my %packages, 'DB_File', "$DBDIR/packages_small.db",
@@ -40,20 +43,152 @@ my $sections = retrieve "$DBDIR/sections.info";
my $subsections = retrieve "$DBDIR/subsections.info";
my $priorities = retrieve "$DBDIR/priorities.info";
-#use Data::Dumper;
+use Data::Dumper;
#print STDERR Dumper($sections, $subsections, $priorities);
-my (%pages);
+my @PACKAGES = sort keys %packages;
+my @SRC_PACKAGES = sort keys %src_packages;
+
+print "Found ".scalar(@PACKAGES)." packages\n";
+print "Found ".scalar(@SRC_PACKAGES)." source packages\n";
my $template = new Packages::Template( "$TOPDIR/templates", 'html');
my $txt_template = new Packages::Template( "$TOPDIR/templates", 'txt');
-print "collecting package info ...\n";
-my %allpkgs;
-while (my ($pkg, $data) = each %packages) {
+my $charset = 'UTF-8';
+my (%cat, %lang_vars, $prov_string, %s, %fh);
+foreach my $lang (@LANGUAGES) {
+ $cat{$lang} = Packages::I18N::Locale->get_handle($lang)
+ or die "get_handle failed for $lang";
+ $lang_vars{$lang} = { po_lang => $lang, ddtp_lang => $lang,
+ charset => $charset,
+ cat => $cat{$lang}, used_langs => [EMAIL PROTECTED] };
+ $s{begin}{$lang} = '['.uc($lang).':';
+ $s{end}{$lang} = ':'.uc($lang).']';
+ $prov_string .= $s{begin}{$lang}.$cat{$lang}->g('virtual package provided
by').$s{end}{$lang};
+}
+
+sub open_file {
+ my ($key, $vars, $file) = @_;
+
+ $file ||= 'index';
+
+ print "opening $key\n";
+ mkdirp ( "$wwwdir/$key" );
+ open($fh{$key}, '>',
+ "$wwwdir/$key/$file.slices.new")
+ or die "Cannot open file $wwwdir/$key/$file.slices.new: $!";
+
+ foreach my $lang (@LANGUAGES) {
+ print {$fh{$key}} "$s{begin}{$lang}\n";
+ $template->page( 'index_head',
+ { %{$lang_vars{$lang}},
+ %$vars },
+ $fh{$key});
+ print {$fh{$key}} "\n$s{end}{$lang}\n";
+ }
+}
+
+sub close_file {
+ my ($key, $vars, $file) = @_;
+
+ $file ||= 'index';
+
+ print "closing $key\n";
+
+ foreach my $lang (@LANGUAGES) {
+ print {$fh{$key}} "$s{begin}{$lang}\n";
+ $template->page( 'index_foot',
+ { %{$lang_vars{$lang}},
+ %$vars },
+ $fh{$key});
+ print {$fh{$key}} "\n$s{end}{$lang}\n";
+ }
+ close($fh{$key})
+ or die "Cannot close file $wwwdir/$key/$file.slices.new: $!";
+
+ activate("$wwwdir/$key/$file.slices");
+}
+
+
+sub open_txt_file {
+ my ($key, $vars, $file) = @_;
+
+ $file ||= 'allpackages';
+ my $lang = 'en';
+
+ print "opening $key (txt,lang=$lang)\n";
+ mkdirp ( "$wwwdir/$key" );
+ $fh{"$key/$lang/txt"} = gzopen("$wwwdir/$key/$file.$lang.txt.gz.new",
'wb9')
+ or die "Cannot open file $wwwdir/$key/$file.$lang.txt.gz.new: $!";
+
+ my $gztxt = $txt_template->page( 'index_head',
+ { %{$lang_vars{$lang}},
+ %$vars });
+ $fh{"$key/$lang/txt"}->gzwrite($gztxt);
+}
+
+sub close_txt_file {
+ my ($key, $vars, $file) = @_;
+
+ $file ||= 'allpackages';
+ my $lang = 'en';
+
+ print "closing $key (txt,lang=$lang)\n";
+ my $gztxt = $txt_template->page( 'index_foot',
+ { %{$lang_vars{$lang}},
+ %$vars });
+ $fh{"$key/$lang/txt"}->gzwrite($gztxt);
+ ($fh{"$key/$lang/txt"}->gzclose == Z_OK) or
+ warn("can't close text index file $wwwdir/$key/$file.$lang.txt.gz.new: "
+ . $fh{"$key/$lang/txt"}->gzerror);
+ activate("$wwwdir/$key/$file.$lang.txt.gz");
+}
+
+
+print "write headers ...\n";
+foreach my $source (("", "source/")) {
+ foreach my $s (@SUITES) {
+ mkdirp ( "$wwwdir/$source$s" );
+ my %common_vars = ( suite => $s,
+ is_source => $source );
+
+ open_file("$source$s", \%common_vars, 'allpackages');
+ open_txt_file("$source$s", \%common_vars, 'allpackages');
+
+ foreach my $sec (keys %{$sections->{$s}}) {
+ open_file("$source$s/$sec",
+ { %common_vars,
+ category => { id => N_('Section'),
+ name => $sec }});
+ }
+ foreach my $ssec ((keys %{$subsections->{$s}}, 'virtual')) {
+ next if $ssec eq '-';
+ open_file("$source$s/$ssec",
+ { %common_vars,
+ category => { id => N_('Subsection'),
+ name => $ssec }});
+ }
+ foreach my $prio (keys %{$priorities->{$s}}) {
+ next if $prio eq '-';
+ open_file("$source$s/$prio",
+ { %common_vars,
+ category => { id => N_('Priority'),
+ name => $prio }});
+ }
+ }
+}
+
+
+print "processing package info ...\n";
+my $count = 0;
+foreach my $pkg (@PACKAGES) {
+ warn "pkg=$pkg\n" if DEBUG;
+ print "$count\n" unless ++$count % 1000;
+
my (%pkg,%virt);
- my ($virt, $p_data) = split /\000/o, $data, 2;
- %virt = split /\01/o, $virt;
+ my ($virt, $p_data) = split /\000/o, $packages{$pkg}, 2;
+ %virt = split /\01/o, $virt;
foreach (split /\000/o, $p_data||'') {
my @data = split ( /\s/o, $_, 9 );
$pkg{$data[1]} ||= new Packages::Page( $pkg );
@@ -74,15 +209,16 @@ while (my ($pkg, $data) = each %packages) {
$pkg{$_}->add_provided_by([split /\s+/, $virt{$_}]);
}
- while (my ($key, $entry) = each %pkg) {
- $allpkgs{$key} ||= [];
+ while (my ($suite, $entry) = each %pkg) {
+ warn "\tsuite=$suite\n" if DEBUG;
my %p = ( name => $pkg, providers => [], versions => '' );
if (my $provided_by = $entry->{provided_by}) {
$p{providers} = $provided_by;
- }
- $p{subsection} = $p{section} = $p{archive} = $p{desc} = $p{priority} =
'';
- unless ($entry->is_virtual) {
+ }
+ $p{subsection} = $p{section} = $p{archive} =
+ $p{desc} = $p{priority} = '';
+ unless ($entry->is_virtual) {
(undef, $p{versions}) = $entry->get_version_string;
$p{subsection} = $entry->get_newest( 'subsection' );
$p{section} = $entry->get_newest( 'section' );
@@ -102,17 +238,80 @@ while (my ($pkg, $data) = each %packages) {
}
$p{priority} = $entry->get_newest( 'priority' );
}
- push @{$allpkgs{$key}}, \%p;
+
+ my $html = my $txt = "";
+ my $id = " id='$p{name}'";
+ if ($p{versions}) {
+ warn "\tversions=$p{versions}\n" if DEBUG;
+
+ $html .= "\n<dt><a href='$p{name}'$id>$p{name}</a> ($p{versions})";
+ $id = "";
+ $html .= " [<strong class='pmarker'>$p{section}</strong>]"
+ if $p{section} ne 'main';
+ $html .= " [<strong class='pmarker'>$p{archive}</strong>]"
+ if $p{archive} ne 'us';
+ $html .= "</dt>\n<dd";
+
+ $txt .= "\n$p{name} ($p{versions})";
+ $txt .= " [$p{section}]" if $p{section} ne 'main';
+ $txt .= " [$p{archive}]" if $p{archive} ne 'us';
+ $txt .= " ";
+
+ if ($p{trans_desc}) {
+ foreach my $lang (@LANGUAGES) {
+ my ($sdesc, $sdesc_html, $desclang) = ($p{desc},
+
encode_entities($p{desc}, '<>&"\''),
+ 'en');
+ if ($p{trans_desc}{$lang}) {
+ $sdesc = $p{trans_desc}{$lang};
+ $sdesc_html = encode_entities($sdesc, '<>&"\'');
+ $desclang = $lang;
+ }
+
+ $html .= $s{begin}{$lang};
+ $html .= " lang='$desclang'" if $desclang ne $lang;
+ $html .= ">$sdesc_html$s{end}{$lang}";
+ }
+ } else {
+ $html .= " lang='en'>".encode_entities($p{desc}, '<>&"\'');
+ }
+ $html .= "</dd>";
+ $txt .= $p{desc};
+ }
+
+ if (@{$p{providers}}) {
+ warn "[EMAIL PROTECTED]" if DEBUG;
+ $html .= "\n<dt><a
href='$p{name}'$id>$p{name}</a></dt><dd>$prov_string ";
+ my @prov;
+ foreach my $prov (@{$p{providers}}) {
+ my $prov_uri = uri_escape($prov);
+ push @prov, "<a href='../$prov_uri'>$prov</a>";
+ }
+ $html .= join(', ', @prov)."</dd>";
+ $txt .= "\n$p{name} virtual package provided by ".
+ join(', ', @{$p{providers}});
+ }
+ warn "HTML=$html\n" if DEBUG > 1;
+ warn "TXT=$txt\n" if DEBUG > 1;
+
+ print {$fh{$suite}} $html;
+ $fh{"$suite/en/txt"}->gzwrite($txt);
+ foreach my $key (qw(section subsection priority)) {
+ next unless $fh{"$suite/$p{$key}"};
+ warn "\t\t$suite/$p{$key}\n" if DEBUG;
+ print {$fh{"$suite/$p{$key}"}} $html;
+ }
}
}
-write_files(\%allpkgs);
-
print "collecting source package info ...\n";
-my %allsrcpkgs;
-while (my ($pkg, $data) = each %src_packages) {
- my %pkg;
- foreach (split /\000/o, $data||'') {
+$count = 0;
+foreach my $pkg (@SRC_PACKAGES) {
+ warn "pkg=$pkg\n" if DEBUG;
+ print "$count\n" unless ++$count % 1000;
+
+ my %pkg;
+ foreach (split /\000/o, $src_packages{$pkg}||'') {
my @data = split ( /\s/o, $_ );
$pkg{$data[1]} ||= new Packages::SrcPage( $pkg );
$pkg{$data[1]}->merge_package( { package => $pkg,
@@ -125,101 +324,78 @@ while (my ($pkg, $data) = each %src_packages) {
} );
}
- while (my ($key, $entry) = each %pkg) {
- $allsrcpkgs{$key} ||= [];
-
+ while (my ($suite, $entry) = each %pkg) {
my %p = ( name => $pkg, providers => [], versions => '' );
$p{versions} = $entry->{version};
$p{subsection} = $entry->get_newest( 'subsection' );
$p{section} = $entry->get_newest( 'section' );
$p{archive} = $entry->get_newest( 'archive' );
$p{priority} = $entry->get_newest( 'priority' );
-
+
$p{desc} = '';
- $p{binaries} = [];
-# my $binaries = find_binaries( $pkg, $p{archive}, $p{suite}, \%src2bin );
-# if ($binaries && @$binaries) {
-# pkg_list( \%packages, $opts, $binaries, 'en', $contents{binaries} );
-# }
+ $p{binaries} = [];
+# my $binaries = find_binaries( $pkg, $p{archive}, $p{suite}, \%src2bin );
+# if ($binaries && @$binaries) {
+# pkg_list( \%packages, $opts, $binaries, 'en', $contents{binaries} );
+# }
+
+ my $html = my $txt = "";
+ warn "\tversions=$p{versions}\n" if DEBUG;
- push @{$allsrcpkgs{$key}}, \%p;
+ $html .= "\n<dt><a href='$p{name}' id='$p{name}'>$p{name}</a>
($p{versions})";
+ $html .= " [<strong class='pmarker'>$p{section}</strong>]"
+ if $p{section} ne 'main';
+ $html .= " [<strong class='pmarker'>$p{archive}</strong>]"
+ if $p{archive} ne 'us';
+ $html .= "</dt>";
+
+ $txt .= "\n$p{name} ($p{versions})";
+ $txt .= " [$p{section}]" if $p{section} ne 'main';
+ $txt .= " [$p{archive}]" if $p{archive} ne 'us';
+
+ warn "HTML=$html\n" if DEBUG > 1;
+ warn "TXT=$txt\n" if DEBUG > 1;
+
+ print {$fh{"source/$suite"}} $html;
+ $fh{"source/$suite/en/txt"}->gzwrite($txt);
+ foreach my $key (qw(section subsection priority)) {
+ next unless $fh{"source/$suite/$p{$key}"};
+ warn "\t\tsource/$suite/$p{$key}\n" if DEBUG;
+ print {$fh{"source/$suite/$p{$key}"}} $html;
+ }
}
}
-write_files(\%allsrcpkgs, 1);
-sub write_files {
- my ($pkgs, $source) = @_;
-
- $source = $source ? 'source/' : '';
- print "writing files ...\n";
+print "write footers ...\n";
+foreach my $source (("", "source/")) {
foreach my $s (@SUITES) {
- my $key = $s;
- mkpath ( "$wwwdir/$source$key" );
- foreach my $lang (@LANGUAGES) {
- my $charset = 'UTF-8';
- my $cat = Packages::I18N::Locale->get_handle($lang)
- or die "get_handle failed for $lang";
-
- my %lang_vars = ( po_lang => $lang, ddtp_lang => $lang,
- charset => $charset,
- cat => $cat, used_langs => [EMAIL PROTECTED] );
- print "writing $source$s/allpackages (lang=$lang)...\n";
- $template->page( 'index', { %lang_vars, packages => $pkgs->{$key},
- suite => $s, is_source => $source },
- "$wwwdir/$source$key/allpackages.$lang.html.new" );
- print "writing $source$s/allpackages (txt,lang=$lang)...\n";
- my $gzfh =
gzopen("$wwwdir/$source$key/allpackages.$lang.txt.gz.new",
- 'wb9')
- or die "can't open text index file for output: $!";
- my $gztxt;
- $gztxt = $txt_template->page( 'index', { %lang_vars, packages =>
$pkgs->{$key},
- suite => $s, is_source =>
$source },
- );
- $gzfh->gzwrite($gztxt);
- ($gzfh->gzclose == Z_OK) or
- warn "can't close text index file
$wwwdir/$source$key/allpackages.$lang.txt.gz.new: ".$gzfh->gzerror;
-
- rename( "$wwwdir/$source$key/allpackages.$lang.html.new",
- "$wwwdir/$source$key/allpackages.$lang.html" );
- rename( "$wwwdir/$source$key/allpackages.$lang.txt.gz.new",
- "$wwwdir/$source$key/allpackages.$lang.txt.gz" );
-
- foreach my $sec (keys %{$sections->{$s}}) {
- mkpath ( "$wwwdir/$source$key/$sec" );
-
- print "writing $source$s/$sec/index (lang=$lang)...\n";
- $template->page( 'index', { packages => [ grep { $_->{section}
eq $sec } @{$pkgs->{$key}} ],
- %lang_vars, suite => $s, is_source
=> $source,
- category => { id =>
$cat->g('Section'), name => $sec } },
-
"$wwwdir/$source$key/$sec/index.$lang.html.new" );
- rename( "$wwwdir/$source$key/$sec/index.$lang.html.new",
- "$wwwdir/$source$key/$sec/index.$lang.html" );
- }
- foreach my $ssec ((keys %{$subsections->{$s}}, 'virtual')) {
- next if $ssec eq '-';
- mkpath ( "$wwwdir/$source$key/$ssec" );
-
- print "writing $source$s/$ssec/index (lang=$lang)...\n";
- $template->page( 'index', { packages => [ grep {
$_->{subsection} eq $ssec } @{$pkgs->{$key}} ],
- %lang_vars, suite => $s, is_source
=> $source,
- category => { id =>
$cat->g('Subsection'), name => $ssec } },
-
"$wwwdir/$source$key/$ssec/index.$lang.html.new" );
- rename( "$wwwdir/$source$key/$ssec/index.$lang.html.new",
- "$wwwdir/$source$key/$ssec/index.$lang.html" );
- }
- foreach my $prio (keys %{$priorities->{$s}}) {
- next if $prio eq '-';
- mkpath ( "$wwwdir/$source$key/$prio" );
-
- print "writing $source$s/$prio/index (lang=$lang)...\n";
- $template->page( 'index', { packages => [ grep { $_->{priority}
eq $prio } @{$pkgs->{$key}} ],
- %lang_vars, suite => $s, is_source
=> $source,
- category => { id =>
$cat->g('Priority'), name => $prio } },
-
"$wwwdir/$source$key/$prio/index.$lang.html.new" );
- rename( "$wwwdir/$source$key/$prio/index.$lang.html.new",
- "$wwwdir/$source$key/$prio/index.$lang.html" );
- }
+ my %common_vars = ( suite => $s,
+ is_source => $source );
+ close_file("$source$s", \%common_vars, 'allpackages');
+ close_txt_file("$source$s", \%common_vars, 'allpackages');
+
+ foreach my $sec (keys %{$sections->{$s}}) {
+ close_file("$source$s/$sec",
+ { %common_vars,
+ category => { id => N_('Section'),
+ name => $sec }});
+ }
+ foreach my $ssec ((keys %{$subsections->{$s}}, 'virtual')) {
+ next if $ssec eq '-';
+ close_file("$source$s/$ssec",
+ { %common_vars,
+ category => { id => N_('Subsection'),
+ name => $ssec }});
+ }
+ foreach my $prio (keys %{$priorities->{$s}}) {
+ next if $prio eq '-';
+ close_file("$source$s/$prio",
+ { %common_vars,
+ category => { id => N_('Priority'),
+ name => $prio }});
}
}
}
+
+__END__
diff --git a/bin/trivial_slice b/bin/trivial_slice
new file mode 100755
index 0000000..63c6a2e
--- /dev/null
+++ b/bin/trivial_slice
@@ -0,0 +1,103 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use File::Basename;
+
+use lib './lib';
+
+use Packages::CommonCode qw(:all);
+
+my @langs;
+my @files;
+
+my $lrx = qr/[a-z]{2}(-[a-z]{2})?/;
+my $ulrx = qr/[A-Z]{2}(-[A-Z]{2})?/;
+
+while ($_ = shift @ARGV) {
+ last if $_ eq '--';
+
+ /^$lrx$/
+ or die "Invalid lang $_\n";
+
+ push @langs, $_;
+}
+
+while ($_ = shift @ARGV) {
+ /\.slices$/ or die "Invalid file $_\n";
+
+ push @files, $_;
+}
+
+if ([EMAIL PROTECTED] || [EMAIL PROTECTED]) {
+ die "No langs or no files\n";
+}
+
+warn "[EMAIL PROTECTED]@files\n";
+
+foreach my $file (@files) {
+ my ($name, $path, undef) = fileparse($file,qw(.slices));
+
+ warn "name=$name path=$path out=$path$name.LANG.html.tmp\n";
+
+ my %out;
+ foreach my $lang (@langs) {
+ my $ulang = uc($lang);
+ open($out{$ulang}, '>',
+ "$path$name.$lang.html.tmp")
+ or die "Couldn't open $path$name.$lang.html.tmp\n";
+ }
+
+ open my $in, '<', $file
+ or die "Couldn't open $file\n";
+
+ my $active_lang;
+ while (<$in>) {
+ /^\s*$/o && next;
+
+ /^\[($ulrx):$/o && do {
+# warn "open slice $1";
+ die "Nested slices" if $active_lang;
+ die "Unknown lang $1" unless exists $out{$1};
+ $active_lang = $1;
+ next;
+ };
+ /^:($ulrx)\]$/o && do {
+# warn "close slice $1";
+ die "No open slice" unless $active_lang;
+ die "Overlapping slices" unless $1 eq $active_lang;
+ $active_lang = undef;
+ next;
+ };
+
+ !$active_lang && /\[($ulrx):.*?:($ulrx)\]/o && do {
+# warn "slices found";
+
+ foreach my $l (keys %out) {
+ my $tmp = $_;
+
+ $tmp =~ s/\[\Q$l\E:(.*?):\Q$l\E\]/$1/g;
+ $tmp =~ s/\[($ulrx):.*?:($ulrx)\]//g;
+
+ print {$out{$l}} $tmp;
+ }
+ next;
+ };
+
+ if ($active_lang) {
+ print {$out{$active_lang}} $_;
+ } else {
+ foreach my $l (keys %out) {
+ print {$out{$l}} $_;
+ }
+ }
+ }
+
+ foreach my $lang (keys %out) {
+ close($out{$lang})
+ or die "Couldn't close $path$name.$lang.html.tmp\n";
+ activate("$path$name.$lang.html");
+ }
+
+}
diff --git a/cron.d/900index_pages b/cron.d/900index_pages
index 1213e36..6268c12 100755
--- a/cron.d/900index_pages
+++ b/cron.d/900index_pages
@@ -4,8 +4,29 @@
cd "$topdir"
+set -e
+
date
./bin/create_suite_index_pages
date
./bin/create_index_pages
date
+
+# for file in $(find www/ -name *.slices)
+# do
+# dir=$(dirname $file)
+# base=$(basename $file .slices)
+# target=
+# for l in $polangs
+# do
+# lu=$(echo $l|tr /a-z/ /A-Z/)
+# target="$target -o ${lu}uUNDEF:$dir/$base.$l.html.tmp"
+# done
+
+# echo slice $target $file
+# slice $target $file
+# done
+
+./bin/trivial_slice en $polangs -- $(find www/ -name *.slices)
+
+date
diff --git a/templates/html/index.tmpl b/templates/html/index.tmpl
deleted file mode 100644
index cac305c..0000000
--- a/templates/html/index.tmpl
+++ /dev/null
@@ -1,60 +0,0 @@
-[% PROCESS 'config/archive_layout.tmpl' %]
-[% IF is_source;
- title_common = category ? g('Source Packages in "%s", %s %s', suite,
category.id, category.name)
- : g('Source Packages in "%s"', suite);
- ELSE;
- title_common = category ? g('Software Packages in "%s", %s %s', suite,
category.id, category.name)
- : g('Software Packages in "%s"', suite);
- END;
-
- nav_arr = [ { prefix=>g('Distribution:'), title=>g('Overview over this
suite'), url=>make_url('/','','suite',suite), name=>suite } ];
- IF category;
- nav_last = { prefix=>"$category.id:", name=>category.name };
- ELSE;
- nav_last = { name=>g('All Packages') };
- END;
- nav_arr.push( { name=>g('Source'),
- url=>make_url('/','','suite',suite,'source','source') } )
- IF is_source;
- nav_arr.push( nav_last );
-%]
-[% PROCESS 'html/head.tmpl'
- title_tag = title_common
- page_title = title_common
- keywords = "$suite, $category.name"
- navigation = nav_arr
-%]
-
-[% FOREACH p IN packages %]
- [% '<dl>' IF loop.first %]
-
- [% BLOCK marker %] [<strong class="pmarker">[% text %]</strong>] [%- END %]
- [% BLOCK markers %]
- [% PROCESS marker text=p.section IF p.section != main_section %]
- [% PROCESS marker text=p.archive IF p.archive != main_archive %]
- [% END %]
- [%- desclang = 'en';
- IF p.trans_desc.$ddtp_lang;
- sdesc = p.trans_desc.$ddtp_lang;
- desclang = $ddtp_lang;
- ELSE;
- sdesc = p.desc;
- END -%]
- [% IF p.providers.size %]
- <dt><a href="[% p.name %]" id="[% p.name %]">[% p.name %]</a></dt>
- <dd>[% g('virtual package provided by') %]
- [% FOREACH provider IN p.providers %]<a href="../[% provider | uri
%]">[% provider %]</a>
- [%- ', ' UNLESS loop.last %][% END %]</dd>
- [% IF p.versions.length %]
- <dt><a href="[% p.name %]">[% p.name %]</a> ([% p.versions %])[% PROCESS
markers %]</dt>
- <dd [% "lang=\"$desclang\"" IF desclang != po_lang %]>[% sdesc | html
%]</dd>
- [% END %]
- [% ELSE %]
- <dt><a href="[% p.name %]" id="[% p.name %]">[% p.name %]</a> ([%
p.versions %])[% PROCESS markers %]</dt>
- <dd [% "lang=\"$desclang\"" IF desclang != po_lang %]>[% sdesc | html
%]</dd>
- [% END %]
-
- [% '</dl>' IF loop.last %]
-[% END %]
-
-[%- PROCESS 'html/foot.tmpl' -%]
diff --git a/templates/html/index_foot.tmpl b/templates/html/index_foot.tmpl
new file mode 100644
index 0000000..23db4cf
--- /dev/null
+++ b/templates/html/index_foot.tmpl
@@ -0,0 +1,3 @@
+</dl>
+
+[%- PROCESS 'html/foot.tmpl' -%]
diff --git a/templates/html/index_head.tmpl b/templates/html/index_head.tmpl
new file mode 100644
index 0000000..43fe97c
--- /dev/null
+++ b/templates/html/index_head.tmpl
@@ -0,0 +1,27 @@
+[% IF is_source;
+ title_common = category ? g('Source Packages in "%s", %s %s', suite,
g(category.id), category.name)
+ : g('Source Packages in "%s"', suite);
+ ELSE;
+ title_common = category ? g('Software Packages in "%s", %s %s', suite,
g(category.id), category.name)
+ : g('Software Packages in "%s"', suite);
+ END;
+
+ nav_arr = [ { prefix=>g('Distribution:'), title=>g('Overview over this
suite'), url=>make_url('/','','suite',suite), name=>suite } ];
+ IF category;
+ nav_last = { prefix=>g(category.id) _ ":", name=>category.name };
+ ELSE;
+ nav_last = { name=>g('All Packages') };
+ END;
+ nav_arr.push( { name=>g('Source'),
+ url=>make_url('/','','suite',suite,'source','source') } )
+ IF is_source;
+ nav_arr.push( nav_last );
+%]
+[% PROCESS 'html/head.tmpl'
+ title_tag = title_common
+ page_title = title_common
+ keywords = "$suite, $category.name"
+ navigation = nav_arr
+%]
+
+<dl>
diff --git a/templates/txt/index.tmpl b/templates/txt/index.tmpl
deleted file mode 100644
index 226f03e..0000000
--- a/templates/txt/index.tmpl
+++ /dev/null
@@ -1,20 +0,0 @@
-[%- PROCESS 'config/archive_layout.tmpl' -%]
-[% g('All %s Packages in "%s"', organisation, suite) %]
-
-[% g('Generated:') _ ' ' _ timestamp.string %]
-[% g('Copyright ©') _ ' ' _ copyright.years _ ' ' _ copyright.name %];
-[% g('See <URL:%s> for the license terms.', license.url) %]
-
-[% FOREACH packages -%]
- [%- BLOCK marker %] [[% text %]][% END -%]
- [%- BLOCK markers -%]
- [%- PROCESS marker text=section IF section != main_section -%]
- [%- PROCESS marker text=archive IF archive != main_archive -%]
- [%- END -%]
- [%- IF providers.size %]
-[% name %] [% g('virtual package provided by') _ ' ' _ providers.join(', ') %]
- [%- END -%]
- [%- IF versions %]
-[% name %] ([% versions %])[% PROCESS markers %] [% desc %]
- [%- END -%]
-[%- END %]
diff --git a/templates/txt/index_foot.tmpl b/templates/txt/index_foot.tmpl
new file mode 100644
index 0000000..e69de29
diff --git a/templates/txt/index_head.tmpl b/templates/txt/index_head.tmpl
new file mode 100644
index 0000000..7fd13a3
--- /dev/null
+++ b/templates/txt/index_head.tmpl
@@ -0,0 +1,5 @@
+[% g('All %s Packages in "%s"', organisation, suite) %]
+
+[% g('Generated:') _ ' ' _ timestamp.string %]
+[% g('Copyright ©') _ ' ' _ copyright.years _ ' ' _ copyright.name %];
+[% g('See <URL:%s> for the license terms.', license.url) %]
--
APT Archive Web-Frontend (Alioth repository)
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]