aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/transient.pm
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin/transient.pm')
-rw-r--r--IkiWiki/Plugin/transient.pm51
1 files changed, 51 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/transient.pm b/IkiWiki/Plugin/transient.pm
new file mode 100644
index 000000000..d4eb005ea
--- /dev/null
+++ b/IkiWiki/Plugin/transient.pm
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::transient;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "getsetup", id => "transient", call => \&getsetup);
+ hook(type => "checkconfig", id => "transient", call => \&checkconfig);
+ hook(type => "rendered", id => "transient", call => \&rendered);
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ # this plugin is safe but only makes sense as a
+ # dependency; similarly, it needs a rebuild but
+ # only if something else does
+ safe => 0,
+ rebuild => 0,
+ },
+}
+
+our $transientdir;
+
+sub checkconfig () {
+ if (defined $config{wikistatedir}) {
+ $transientdir = $config{wikistatedir}."/transient";
+ # add_underlay treats relative underlays as relative to the installed
+ # location, not the cwd. That's not what we want here.
+ IkiWiki::add_literal_underlay($transientdir);
+ }
+}
+
+sub rendered (@) {
+ foreach my $file (@_) {
+ # If the corresponding file exists in the transient underlay
+ # and isn't actually being used, we can get rid of it.
+ # Assume that the file that just changed has the same extension
+ # as the obsolete transient version: this'll be true for web
+ # edits, and avoids invoking File::Find.
+ my $casualty = "$transientdir/$file";
+ if (srcfile($file) ne $casualty && -e $casualty) {
+ debug(sprintf(gettext("removing transient version of %s"), $file));
+ IkiWiki::prune($casualty, $transientdir);
+ }
+ }
+}
+
+1;