* aggregate: Forking a child broke the one state that mattered: Forcing

the aggregating page to be rebuilt. Fix this.
master
Joey Hess 2008-02-02 23:56:13 -05:00
parent 06841ed6b3
commit 0779013683
2 changed files with 20 additions and 11 deletions

View File

@ -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}));

2
debian/changelog vendored
View File

@ -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 <joeyh@debian.org> Sat, 02 Feb 2008 23:36:31 -0500