]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/aggregate.pm
the 100% correct way is to add it to %links on scan
[git.ikiwiki.info.git] / IkiWiki / Plugin / aggregate.pm
index be2c963694c033d86853278ad7ebdb86b2593093..eb5067d9f5977cafea958e6e5849c4fd866a34c1 100644 (file)
@@ -4,7 +4,7 @@ package IkiWiki::Plugin::aggregate;
 
 use warnings;
 use strict;
-use IkiWiki;
+use IkiWiki 2.00;
 use HTML::Entities;
 use HTML::Parser;
 use HTML::Tagset;
@@ -31,22 +31,29 @@ sub getopt () { #{{{
 } #}}}
 
 sub checkconfig () { #{{{
-       my $nolock=($config{post_commit} && ! IkiWiki::commit_hook_enabled());
-       IkiWiki::lockwiki() unless $nolock;
-       loadstate();
-       if ($config{aggregate} && ! $nolock) {
+       if ($config{aggregate} && ! ($config{post_commit} && 
+                                    IkiWiki::commit_hook_enabled())) {
+               if (! IkiWiki::lockwiki(0)) {
+                       debug("wiki is locked by another process, not aggregating");
+                       exit 1;
+               }
+       
+               loadstate();
                IkiWiki::loadindex();
                aggregate();
                expire();
                savestate();
+               clearstate();
+
+               IkiWiki::unlockwiki();
        }
-       IkiWiki::unlockwiki() unless $nolock;
 } #}}}
 
 sub filter (@) { #{{{
        my %params=@_;
        my $page=$params{page};
 
+       loadstate(); # if not already loaded
        # Mark all feeds originating on this page as removable;
        # preprocess will unmark those that still exist.
        remove_feeds($page);
@@ -117,7 +124,9 @@ sub delete (@) { #{{{
        }
 } #}}}
 
+my $state_loaded=0;
 sub loadstate () { #{{{
+       return if $state_loaded;
        if (-e "$config{wikistatedir}/aggregate") {
                open (IN, "$config{wikistatedir}/aggregate" ||
                        die "$config{wikistatedir}/aggregate: $!");
@@ -148,6 +157,8 @@ sub loadstate () { #{{{
                }
 
                close IN;
+               
+               $state_loaded=1;
        }
 } #}}}
 
@@ -199,6 +210,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};
@@ -275,7 +292,7 @@ sub aggregate () { #{{{
                        # One common cause of XML::Feed crashing is a feed
                        # that contains invalid UTF-8 sequences. Convert
                        # feed to ascii to try to work around.
-                       $feed->{message}=sprintf(gettext("invalid UTF-8 stripped from feed"));
+                       $feed->{message}.=" ".sprintf(gettext("(invalid UTF-8 stripped from feed)"));
                        $content=Encode::decode_utf8($content);
                        $f=eval{XML::Feed->parse(\$content)};
                }