From 077901368358f2c0f6958f44a783c50074fe7405 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 2 Feb 2008 23:56:13 -0500 Subject: [PATCH] * aggregate: Forking a child broke the one state that mattered: Forcing the aggregating page to be rebuilt. Fix this. --- IkiWiki/Plugin/aggregate.pm | 29 ++++++++++++++++++----------- debian/changelog | 2 ++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm index 2a4d10411..736b0e0d5 100644 --- a/IkiWiki/Plugin/aggregate.pm +++ b/IkiWiki/Plugin/aggregate.pm @@ -37,16 +37,19 @@ sub checkconfig () { #{{{ debug("wiki is locked by another process, not aggregating"); exit 1; } - + + loadstate(); + my @feeds=needsaggregate(); + return unless @feeds; + # Fork a child process to handle the aggregation. - # The parent process will then handle building the result. - # This avoids messy code to clear state accumulated while - # aggregating. + # The parent process will then handle building the + # result. This avoids messy code to clear state + # accumulated while aggregating. defined(my $pid = fork) or error("Can't fork: $!"); if (! $pid) { - loadstate(); IkiWiki::loadindex(); - aggregate(); + aggregate(@feeds); expire(); savestate(); exit 0; @@ -55,6 +58,8 @@ sub checkconfig () { #{{{ if ($?) { error "aggregation failed with code $?"; } + $IkiWiki::forcerebuild{$_->{sourcepage}}=1 + foreach @feeds; IkiWiki::unlockwiki(); } @@ -254,7 +259,12 @@ sub expire () { #{{{ } } #}}} -sub aggregate () { #{{{ +sub needsaggregate () { #{{{ + return values %feeds if $config{rebuild}; + return grep { time - $_->{lastupdate} >= $_->{updateinterval} } values %feeds; +} #}}} + +sub aggregate (@) { #{{{ eval q{use XML::Feed}; error($@) if $@; eval q{use URI::Fetch}; @@ -262,15 +272,12 @@ sub aggregate () { #{{{ eval q{use HTML::Entities}; error($@) if $@; - foreach my $feed (values %feeds) { - next unless $config{rebuild} || - time - $feed->{lastupdate} >= $feed->{updateinterval}; + foreach my $feed (@_) { $feed->{lastupdate}=time; $feed->{newposts}=0; $feed->{message}=sprintf(gettext("processed ok at %s"), displaytime($feed->{lastupdate})); $feed->{error}=0; - $IkiWiki::forcerebuild{$feed->{sourcepage}}=1; debug(sprintf(gettext("checking feed %s ..."), $feed->{name})); diff --git a/debian/changelog b/debian/changelog index b7096aec4..df7b8b424 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,8 @@ ikiwiki (2.31) UNRELEASED; urgency=low that contributes to a page's content and using the youngest of them all, as well as special cases for things like the version plugin, and it's just too complex to do. + * aggregate: Forking a child broke the one state that mattered: Forcing + the aggregating page to be rebuilt. Fix this. -- Joey Hess Sat, 02 Feb 2008 23:36:31 -0500 -- 2.44.0