diff options
author | Joey Hess <joey@kodama.kitenet.net> | 2008-02-02 23:56:13 -0500 |
---|---|---|
committer | Joey Hess <joey@kodama.kitenet.net> | 2008-02-02 23:56:13 -0500 |
commit | 077901368358f2c0f6958f44a783c50074fe7405 (patch) | |
tree | bb908ad9131fc3e15efbc48234402d4141c89a43 /IkiWiki/Plugin | |
parent | 06841ed6b3559ea6c2ef37f80e7676b7181492a1 (diff) |
* aggregate: Forking a child broke the one state that mattered: Forcing
the aggregating page to be rebuilt. Fix this.
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/aggregate.pm | 29 |
1 files changed, 18 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})); |