X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4f872b563300e4a277cac3d7ea2a999bcf75d1ff..6afbd9939ac8cd171e7cf8376f0d0c0a4bf3d516:/IkiWiki/Plugin/aggregate.pm diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm index 09ea59029..0f50fab06 100644 --- a/IkiWiki/Plugin/aggregate.pm +++ b/IkiWiki/Plugin/aggregate.pm @@ -37,25 +37,14 @@ sub checkconfig () { #{{{ debug("wiki is locked by another process, not aggregating"); exit 1; } - - # 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. - defined(my $pid = fork) or error("Can’t fork: $!"); - if (! $pid) { - loadstate(); - IkiWiki::loadindex(); - aggregate(); - expire(); - savestate(); - exit 0; - } - waitpid($pid,0); - if ($?) { - error "aggregation failed with code $?"; - } - + + loadstate(); + IkiWiki::loadindex(); + aggregate(); + expire(); + savestate(); + clearstate(); + IkiWiki::unlockwiki(); } } #}}} @@ -66,7 +55,8 @@ sub needsbuild (@) { #{{{ loadstate(); # if not already loaded foreach my $feed (values %feeds) { - if (grep { $_ eq $pagesources{$feed->{sourcepage}} } @$needsbuild) { + if (exists $pagesources{$feed->{sourcepage}} && + grep { $_ eq $pagesources{$feed->{sourcepage}} } @$needsbuild) { # Mark all feeds originating on this page as removable; # preprocess will unmark those that still exist. remove_feeds($feed->{sourcepage}); @@ -142,7 +132,7 @@ sub loadstate () { #{{{ return if $state_loaded; $state_loaded=1; if (-e "$config{wikistatedir}/aggregate") { - open(IN, "$config{wikistatedir}/aggregate") || + open(IN, "<", "$config{wikistatedir}/aggregate") || die "$config{wikistatedir}/aggregate: $!"; while () { $_=IkiWiki::possibly_foolish_untaint($_); @@ -180,7 +170,7 @@ sub savestate () { #{{{ error($@) if $@; my $newfile="$config{wikistatedir}/aggregate.new"; my $cleanup = sub { unlink($newfile) }; - open (OUT, ">$newfile") || error("open $newfile: $!", $cleanup); + open (OUT, ">", $newfile) || error("open $newfile: $!", $cleanup); foreach my $data (values %feeds, values %guids) { if ($data->{remove}) { if ($data->{name}) { @@ -222,6 +212,12 @@ sub savestate () { #{{{ error("rename $newfile: $!", $cleanup); } #}}} +sub clearstate () { #{{{ + %feeds=(); + %guids=(); + $state_loaded=0; +} #}}} + sub expire () { #{{{ foreach my $feed (values %feeds) { next unless $feed->{expireage} || $feed->{expirecount};