* aggregate: Revert use of forking to not save state, that was not the right
[ikiwiki.git] / IkiWiki / Plugin / aggregate.pm
index 21c83e34a6f3fa6ddee43fc127e582ab037e7abb..0f50fab06c6795154bff70786459a3ff474464d8 100644 (file)
@@ -55,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});
@@ -129,8 +130,9 @@ sub delete (@) { #{{{
 my $state_loaded=0;
 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($_);
@@ -159,8 +161,6 @@ sub loadstate () { #{{{
                }
 
                close IN;
-               
-               $state_loaded=1;
        }
 } #}}}
 
@@ -170,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}) {
@@ -302,6 +302,13 @@ sub aggregate () { #{{{
                        $content=Encode::decode_utf8($content);
                        $f=eval{XML::Feed->parse(\$content)};
                }
+               if ($@) {
+                       # Another possibility is badly escaped entities.
+                       $feed->{message}.=" ".sprintf(gettext("(feed entities escaped)"));
+                       $content=~s/\&(?!amp)(\w+);/&amp;$1;/g;
+                       $content=Encode::decode_utf8($content);
+                       $f=eval{XML::Feed->parse(\$content)};
+               }
                if ($@) {
                        $feed->{message}=gettext("feed crashed XML::Feed!")." ($@)";
                        $feed->{error}=1;
@@ -318,6 +325,7 @@ sub aggregate () { #{{{
                foreach my $entry ($f->entries) {
                        add_page(
                                feed => $feed,
+                               copyright => $f->copyright,
                                title => defined $entry->title ? decode_entities($entry->title) : "untitled",
                                link => $entry->link,
                                content => defined $entry->content->body ? $entry->content->body : "",
@@ -397,6 +405,8 @@ sub add_page (@) { #{{{
        $template->param(content => htmlescape(htmlabs($params{content}, $feed->{feedurl})));
        $template->param(name => $feed->{name});
        $template->param(url => $feed->{url});
+       $template->param(copyright => $params{copyright})
+               if defined $params{copyright} && length $params{copyright};
        $template->param(permalink => urlabs($params{link}, $feed->{feedurl}))
                if defined $params{link};
        if (ref $feed->{tags}) {
@@ -407,7 +417,8 @@ sub add_page (@) { #{{{
 
        # Set the mtime, this lets the build process get the right creation
        # time on record for the new page.
-       utime $mtime, $mtime, pagefile($guid->{page}) if defined $mtime;
+       utime $mtime, $mtime, pagefile($guid->{page})
+               if defined $mtime && $mtime <= time;
 } #}}}
 
 sub htmlescape ($) { #{{{