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;
if ($?) {
error "aggregation failed with code $?";
}
+ $IkiWiki::forcerebuild{$_->{sourcepage}}=1
+ foreach @feeds;
IkiWiki::unlockwiki();
}
}
} #}}}
-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};
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}));
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 <joeyh@debian.org> Sat, 02 Feb 2008 23:36:31 -0500