summaryrefslogtreecommitdiff
path: root/.library/IkiWiki/Plugin/reset_mtimes.pm
diff options
context:
space:
mode:
Diffstat (limited to '.library/IkiWiki/Plugin/reset_mtimes.pm')
-rw-r--r--.library/IkiWiki/Plugin/reset_mtimes.pm84
1 files changed, 84 insertions, 0 deletions
diff --git a/.library/IkiWiki/Plugin/reset_mtimes.pm b/.library/IkiWiki/Plugin/reset_mtimes.pm
new file mode 100644
index 00000000..a168652b
--- /dev/null
+++ b/.library/IkiWiki/Plugin/reset_mtimes.pm
@@ -0,0 +1,84 @@
+# Copyright © 2010 Thomas Schwinge <thomas@schwinge.name>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+package IkiWiki::Plugin::reset_mtimes;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+# This plugin resets pages' / files' mtimes according to the RCS information
+# when using --refresh mode.
+#
+# Note that the files' mtimes are *always* set, even if the file has
+# un-committed changes.
+#
+# <http://ikiwiki.info/bugs/pagemtime_in_refresh_mode/>
+
+sub import
+{
+ hook (type => "needsbuild",
+ id => "reset_mtimes",
+ call => \&needsbuild);
+}
+
+sub needsbuild (@)
+{
+ # Only proceed if --gettime is in effect, as we're clearly not intersted in
+ # this functionality otherwise.
+ return unless $config{gettime};
+
+ my $files = shift;
+ foreach my $file (@$files)
+ {
+ # [TODO. Perhaps not necessary. Can this hook ever be called for
+ # removed pages -- that need to be ``rebuilt'' in the sense that
+ # they're to be removed?] Don't bother for pages that don't exist
+ # anymore.
+ next unless -e "$config{srcdir}/$file";
+
+ my $page = pagename ($file);
+ debug ("needsbuild: <$file> <$page>");
+
+ # Only ever update -- otherwise ikiwiki shall do its own thing.
+ if (defined $IkiWiki::pagemtime{$page})
+ {
+ debug ("pagemtime: " . $IkiWiki::pagemtime{$page});
+
+ my $mtime = 0;
+ eval
+ {
+ $mtime = IkiWiki::rcs_getmtime ($file);
+ };
+ if ($@)
+ {
+ print STDERR $@;
+ }
+ elsif ($mtime > 0)
+ {
+ $IkiWiki::pagemtime{$page} = $mtime;
+
+ # We have to set the actual file's mtime too, as otherwise
+ # ikiwiki will update it again and again.
+ utime($mtime, $mtime, "$config{srcdir}/$file");
+ }
+
+ debug ("pagemtime: " . $IkiWiki::pagemtime{$page});
+ }
+ }
+}
+
+1