* aggregate: Revert use of forking to not save state, that was not the right
[ikiwiki.git] / IkiWiki / Plugin / aggregate.pm
index 71368e254a960cf2545efe79ffe4b91601b34649..0f50fab06c6795154bff70786459a3ff474464d8 100644 (file)
@@ -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 (<IN>) {
                        $_=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};