From: Joey Hess <joey@kodama.kitenet.net>
Date: Sat, 27 Sep 2008 20:45:27 +0000 (-0400)
Subject: Add %wikistate, which is like %pagestate except not specific to a given page, and... 
X-Git-Tag: 2.66~55
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/a5d3acd37cd52a5cf0045ae4d300a2ef13a07a6e?ds=inline

Add %wikistate, which is like %pagestate except not specific to a given page, and is preserved across rebuilds.
---

diff --git a/IkiWiki.pm b/IkiWiki.pm
index 9a81c7da4..e303c8f4f 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -12,16 +12,16 @@ use Storable;
 use open qw{:utf8 :std};
 
 use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
-	    %pagestate %renderedfiles %oldrenderedfiles %pagesources
-	    %destsources %depends %hooks %forcerebuild $gettext_obj
-	    %loaded_plugins};
+	    %pagestate %wikistate %renderedfiles %oldrenderedfiles
+	    %pagesources %destsources %depends %hooks %forcerebuild
+	    $gettext_obj %loaded_plugins};
 
 use Exporter q{import};
 our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
                  bestlink htmllink readfile writefile pagetype srcfile pagename
                  displaytime will_render gettext urlto targetpage
 		 add_underlay pagetitle titlepage linkpage
-                 %config %links %pagestate %renderedfiles
+                 %config %links %pagestate %wikistate %renderedfiles
                  %pagesources %destsources);
 our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
 our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
@@ -1318,9 +1318,11 @@ sub loadindex () { #{{{
 	my $pages;
 	if (exists $index->{version} && ! ref $index->{version}) {
 		$pages=$index->{page};
+		%wikistate=%{$index->{state}};
 	}
 	else {
 		$pages=$index;
+		%wikistate=();
 	}
 
 	foreach my $src (keys %$pages) {
@@ -1368,6 +1370,7 @@ sub saveindex () { #{{{
 	my $newfile="$config{wikistatedir}/indexdb.new";
 	my $cleanup = sub { unlink($newfile) };
 	open (my $out, '>', $newfile) || error("cannot write to $newfile: $!", $cleanup);
+
 	my %index;
 	foreach my $page (keys %pagemtime) {
 		next unless $pagemtime{$page};
@@ -1392,6 +1395,14 @@ sub saveindex () { #{{{
 			}
 		}
 	}
+
+	$index{state}={};
+	foreach my $id (@hookids) {
+		foreach my $key (keys %{$wikistate{$id}}) {
+			$index{state}{$id}{$key}=$wikistate{$id}{$key};
+		}
+	}
+	
 	$index{version}="3";
 	my $ret=Storable::nstore_fd(\%index, $out);
 	return if ! defined $ret || ! $ret;
diff --git a/debian/changelog b/debian/changelog
index 2ea92c4c3..04a3975c8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -19,10 +19,10 @@ ikiwiki (2.66) UNRELEASED; urgency=low
     untidied content if tidy crashes. In either case, it seems best to tidy
     the content to nothing.
   * htmltidy: Avoid spewing tidy errors to stderr.
-  * Add %wikistate, which is like %pagestate except not specific to a given
-    page, and is preserved across rebuilds.
   * Reorganize index file, add a format version field. Upgrades to the new
     index format should be transparent.
+  * Add %wikistate, which is like %pagestate except not specific to a given
+    page, and is preserved across rebuilds.
 
  -- Joey Hess <joeyh@debian.org>  Thu, 25 Sep 2008 13:45:55 -0400
 
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 0e4f2fd6f..4e27d361d 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -467,6 +467,15 @@ When pages are deleted, ikiwiki automatically deletes their pagestate too.
 Note that page state does not persist across wiki rebuilds, only across
 wiki updates.
 
+### %wikistate
+
+The `%wikistate` hash can be used by a plugin to store persistant state
+that is not bound to any one page. To set a value, use
+`$wikistate{$id}{$key}=$value, where `$value` is anything Storable can
+serialize, `$key` is any string you like, and `$id` must be the same as the
+"id" parameter passed to `hook()` when registering the plugin, so that the
+state can be dropped if the plugin is no longer used.
+
 ### Other variables
 
 If your plugin needs to access data about other pages in the wiki. It can
diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot
index f338750ea..200b3f6d8 100644
--- a/po/ikiwiki.pot
+++ b/po/ikiwiki.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-27 16:35-0400\n"
+"POT-Creation-Date: 2008-09-27 16:40-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -910,7 +910,7 @@ msgstr ""
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1624
+#: ../IkiWiki.pm:1632
 msgid "yes"
 msgstr ""