summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-02-02 23:56:13 -0500
committerJoey Hess <joey@kodama.kitenet.net>2008-02-02 23:56:13 -0500
commit077901368358f2c0f6958f44a783c50074fe7405 (patch)
treebb908ad9131fc3e15efbc48234402d4141c89a43
parent06841ed6b3559ea6c2ef37f80e7676b7181492a1 (diff)
* aggregate: Forking a child broke the one state that mattered: Forcing
the aggregating page to be rebuilt. Fix this.
-rw-r--r--IkiWiki/Plugin/aggregate.pm29
-rw-r--r--debian/changelog2
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 <joeyh@debian.org> Sat, 02 Feb 2008 23:36:31 -0500