From 5a82103526ab32e018cd999bb6a53d9e097c83a8 Mon Sep 17 00:00:00 2001 From: joey Date: Wed, 1 Nov 2006 05:41:37 +0000 Subject: [PATCH] * Implemented expiry options for aggregate plugin. * Use precalculated backlinks info when determining if files need an update due to a page they link to being added/removed. Mostly significant if there are lots of pages. * Remove duplicate link info when saving index. In some cases it could pile up rather badly. (Probably not the best way to deal with this problem.) --- IkiWiki.pm | 3 ++- IkiWiki/Plugin/aggregate.pm | 35 +++++++++++++++++++++++++++++++++-- IkiWiki/Render.pm | 28 ++++++++++++---------------- debian/changelog | 9 ++++++++- doc/plugins/aggregate.mdwn | 19 +++++++++---------- 5 files changed, 64 insertions(+), 30 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index 1d9d2492c..73bc747f9 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -593,7 +593,8 @@ sub saveindex () { #{{{ "ctime=$pagectime{$page} ". "src=$pagesources{$page}"; $line.=" dest=$_" foreach @{$renderedfiles{$page}}; - $line.=" link=$_" foreach @{$links{$page}}; + my %count; + $line.=" link=$_" foreach grep { ++$count{$_} == 1 } @{$links{$page}}; if (exists $depends{$page}) { $line.=" depends=".encode_entities($depends{$page}, " \t\n"); } diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm index 2e1ab66e6..973f7a4ca 100644 --- a/IkiWiki/Plugin/aggregate.pm +++ b/IkiWiki/Plugin/aggregate.pm @@ -34,6 +34,7 @@ sub checkconfig () { #{{{ if ($config{aggregate}) { IkiWiki::loadindex(); aggregate(); + expire(); savestate(); } IkiWiki::unlockwiki(); @@ -79,6 +80,7 @@ sub preprocess (@) { #{{{ $feed->{expireage}=defined $params{expireage} ? $params{expireage} : 0; $feed->{expirecount}=defined $params{expirecount} ? $params{expirecount} : 0; delete $feed->{remove}; + delete $feed->{expired}; $feed->{lastupdate}=0 unless defined $feed->{lastupdate}; $feed->{numposts}=0 unless defined $feed->{numposts}; $feed->{newposts}=0 unless defined $feed->{newposts}; @@ -164,6 +166,11 @@ sub savestate () { #{{{ } next; } + elsif ($data->{expired} && exists $data->{page}) { + unlink pagefile($data->{page}); + delete $data->{page}; + delete $data->{md5}; + } my @line; foreach my $field (keys %$data) { @@ -183,6 +190,32 @@ sub savestate () { #{{{ close OUT; } #}}} +sub expire () { #{{{ + foreach my $feed (values %feeds) { + next unless $feed->{expireage} || $feed->{expirecount}; + my $count=0; + foreach my $item (sort { $IkiWiki::pagectime{$b->{page}} <=> $IkiWiki::pagectime{$a->{page}} } + grep { exists $_->{page} && $_->{feed} eq $feed->{name} && $IkiWiki::pagectime{$_->{page}} } + values %guids) { + if ($feed->{expireage}) { + my $days_old = (time - $IkiWiki::pagectime{$item->{page}}) / 60 / 60 / 24; + if ($days_old > $feed->{expireage}) { + debug("expiring ".$item->{page}." ($days_old days old)"); + $item->{expired}=1; + } + } + elsif ($feed->{expirecount} && + $count >= $feed->{expirecount}) { + debug("expiring ".$item->{page}); + $item->{expired}=1; + } + else { + $count++; + } + } + } +} #}}} + sub aggregate () { #{{{ eval q{use XML::Feed}; die $@ if $@; @@ -237,8 +270,6 @@ sub aggregate () { #{{{ displaytime($feed->{lastupdate}); $feed->{error}=0; } - - # TODO: expiry } #}}} sub add_page (@) { #{{{ diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index f59e54f29..5b951df83 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -11,6 +11,7 @@ my %backlinks; my $backlinks_calculated=0; sub calculate_backlinks () { #{{{ + return if $backlinks_calculated; %backlinks=(); foreach my $page (keys %links) { foreach my $link (@{$links{$page}}) { @@ -26,7 +27,7 @@ sub calculate_backlinks () { #{{{ sub backlinks ($) { #{{{ my $page=shift; - calculate_backlinks() unless $backlinks_calculated; + calculate_backlinks(); my @links; return unless $backlinks{$page}; @@ -303,6 +304,7 @@ sub refresh () { #{{{ scan($file); } } + calculate_backlinks(); # render changed and new pages foreach my $file (@changed) { @@ -311,22 +313,16 @@ sub refresh () { #{{{ $rendered{$file}=1; } - # if any files were added or removed, check to see if each page - # needs an update due to linking to them or inlining them + # rebuild pages that link to added or removed pages if (@add || @del) { -FILE: foreach my $file (@files) { - next if $rendered{$file}; - my $page=pagename($file); - foreach my $f (@add, @del) { - my $p=pagename($f); - foreach my $link (@{$links{$page}}) { - if (bestlink($page, $link) eq $p) { - debug("rendering $file, which links to $p"); - render($file); - $rendered{$file}=1; - next FILE; - } - } + foreach my $f (@add, @del) { + my $p=pagename($f); + foreach my $page (keys %{$backlinks{$p}}) { + my $file=$pagesources{$page}; + next if $rendered{$file}; + debug("rendering $file, which links to $p"); + render($file); + $rendered{$file}=1; } } } diff --git a/debian/changelog b/debian/changelog index 5e01b4679..fbe12edd3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -23,8 +23,15 @@ ikiwiki (1.32) UNRELEASED; urgency=low * Improve login/register process, the login dialog has only name and password fields, which allows more web browsers to regognise it as a login field, and is less confusing. + * Implemented expiry options for aggregate plugin. + * Use precalculated backlinks info when determining if files need an update + due to a page they link to being added/removed. Mostly significant if + there are lots of pages. + * Remove duplicate link info when saving index. In some cases it could + pile up rather badly. (Probably not the best way to deal with this + problem.) - -- Joey Hess Mon, 30 Oct 2006 18:26:55 -0500 + -- Joey Hess Wed, 1 Nov 2006 00:00:10 -0500 ikiwiki (1.31) unstable; urgency=low diff --git a/doc/plugins/aggregate.mdwn b/doc/plugins/aggregate.mdwn index 031eb03f4..a3ef105d6 100644 --- a/doc/plugins/aggregate.mdwn +++ b/doc/plugins/aggregate.mdwn @@ -1,8 +1,8 @@ [[template id=plugin name=aggregate included=1 author="[[Joey]]"]] [[tag type/useful]] -This plugin allows content from other blogs to be aggregated into the wiki. -Aggregate a blog as follows: +This plugin allows content from other feeds to be aggregated into the wiki. +Aggregate a feed as follows \[[aggregate name="example blog" feedurl="http://example.com/index.rss" @@ -35,7 +35,7 @@ directive: * `name` - A name for the feed. Each feed must have a unique name. Required. -* `url` - The url to the web page for the blog that's being aggregated. +* `url` - The url to the web page for the feed that's being aggregated. Required. * `dir` - The directory in the wiki where pages should be saved. Optional, if not specified, the directory is based on the name of the feed. @@ -43,14 +43,13 @@ directive: will look for feeds on the `url`. RSS and atom feeds are supported. * `updateinterval` - How often to check for new posts, in minutes. Default is 15 minutes. -* `expireage` - Expire old items from this blog if they are older than - a specified number of days. Default is to never expire on age. (Not yet - implemented.) -* `expirecount` - Expire old items from this blog if there are more than +* `expireage` - Expire old items from this feed if they are older than + a specified number of days. Default is to never expire on age. +* `expirecount` - Expire old items from this feed if there are more than the specified number total. Oldest items will be expired first. Default - is to never expire on count. (Not yet implemented.) -* `tag` - A tag to tag each post from the blog with. A good tag to use is - the name of the blog. Can be repeated multiple times. The [[tag]] plugin + is to never expire on count. +* `tag` - A tag to tag each post from the feed with. A good tag to use is + the name of the feed. Can be repeated multiple times. The [[tag]] plugin must be enabled for this to work. Note that even if you are using subversion or another revision control