From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 3 Feb 2008 04:56:13 +0000 (-0500)
Subject: * aggregate: Forking a child broke the one state that mattered: Forcing
X-Git-Tag: 2.31~59
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/077901368358f2c0f6958f44a783c50074fe7405

* aggregate: Forking a child broke the one state that mattered: Forcing
  the aggregating page to be rebuilt. Fix this.
---

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