} #}}}
sub checkconfig () { #{{{
- IkiWiki::lockwiki();
+ my $nolock=($config{post_commit} && ! IkiWiki::commit_hook_enabled());
+ IkiWiki::lockwiki() unless $nolock;
loadstate();
- if ($config{aggregate}) {
+ if ($config{aggregate} && ! $nolock) {
IkiWiki::loadindex();
aggregate();
expire();
savestate();
}
- IkiWiki::unlockwiki();
+ IkiWiki::unlockwiki() unless $nolock;
} #}}}
sub filter (@) { #{{{
foreach my $required (qw{name url}) {
if (! exists $params{$required}) {
- return "[[".sprintf(gettext("aggregate plugin missing %s parameter"), $required)."]]";
+ return "[[aggregate ".sprintf(gettext("missing %s parameter"), $required)."]]";
}
}
sub savestate () { #{{{
eval q{use HTML::Entities};
error($@) if $@;
- open (OUT, ">$config{wikistatedir}/aggregate" ||
- die "$config{wikistatedir}/aggregate: $!");
+ my $newfile="$config{wikistatedir}/aggregate.new";
+ # TODO: This cleanup function could use improvement. Any newly
+ # aggregated files are left behind unrecorded, and should be deleted.
+ my $cleanup = sub { unlink($newfile) };
+ open (OUT, ">$newfile") || error("open $newfile: $!", $cleanup);
foreach my $data (values %feeds, values %guids) {
if ($data->{remove}) {
if ($data->{name}) {
push @line, "$field=".$data->{$field};
}
}
- print OUT join(" ", @line)."\n";
+ print OUT join(" ", @line)."\n" || error("write $newfile: $!", $cleanup);
}
- close OUT;
+ close OUT || error("save $newfile: $!", $cleanup);
+ rename($newfile, "$config{wikistatedir}/aggregate") ||
+ error("rename $newfile: $!", $cleanup);
} #}}}
sub expire () { #{{{
if (! length $feed->{feedurl}) {
my @urls=XML::Feed->find_feeds($feed->{url});
if (! @urls) {
- $feed->{message}=sprintf(gettext("could not find feed at %s"), $feed->{feedurl});
+ $feed->{message}=sprintf(gettext("could not find feed at %s"), $feed->{url});
$feed->{error}=1;
debug($feed->{message});
next;