Add new disable hook, allowing plugins to perform cleanup after they have been disabled.
parent
b300bc9650
commit
c401b6958a
17
IkiWiki.pm
17
IkiWiki.pm
|
@ -1596,6 +1596,12 @@ sub loadindex () {
|
||||||
if (exists $index->{version} && ! ref $index->{version}) {
|
if (exists $index->{version} && ! ref $index->{version}) {
|
||||||
$pages=$index->{page};
|
$pages=$index->{page};
|
||||||
%wikistate=%{$index->{state}};
|
%wikistate=%{$index->{state}};
|
||||||
|
# Handle plugins that got disabled by loading a new setup.
|
||||||
|
if (exists $config{setupfile}) {
|
||||||
|
require IkiWiki::Setup;
|
||||||
|
IkiWiki::Setup::disabled_plugins(
|
||||||
|
grep { ! $loaded_plugins{$_} } keys %wikistate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$pages=$index;
|
$pages=$index;
|
||||||
|
@ -1663,11 +1669,7 @@ sub loadindex () {
|
||||||
sub saveindex () {
|
sub saveindex () {
|
||||||
run_hooks(savestate => sub { shift->() });
|
run_hooks(savestate => sub { shift->() });
|
||||||
|
|
||||||
my %hookids;
|
my @plugins=keys %loaded_plugins;
|
||||||
foreach my $type (keys %hooks) {
|
|
||||||
$hookids{$_}=1 foreach keys %{$hooks{$type}};
|
|
||||||
}
|
|
||||||
my @hookids=keys %hookids;
|
|
||||||
|
|
||||||
if (! -d $config{wikistatedir}) {
|
if (! -d $config{wikistatedir}) {
|
||||||
mkdir($config{wikistatedir});
|
mkdir($config{wikistatedir});
|
||||||
|
@ -1701,7 +1703,7 @@ sub saveindex () {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exists $pagestate{$page}) {
|
if (exists $pagestate{$page}) {
|
||||||
foreach my $id (@hookids) {
|
foreach my $id (@plugins) {
|
||||||
foreach my $key (keys %{$pagestate{$page}{$id}}) {
|
foreach my $key (keys %{$pagestate{$page}{$id}}) {
|
||||||
$index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
|
$index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
|
||||||
}
|
}
|
||||||
|
@ -1710,7 +1712,8 @@ sub saveindex () {
|
||||||
}
|
}
|
||||||
|
|
||||||
$index{state}={};
|
$index{state}={};
|
||||||
foreach my $id (@hookids) {
|
foreach my $id (@plugins) {
|
||||||
|
$index{state}{$id}={}; # used to detect disabled plugins
|
||||||
foreach my $key (keys %{$wikistate{$id}}) {
|
foreach my $key (keys %{$wikistate{$id}}) {
|
||||||
$index{state}{$id}{$key}=$wikistate{$id}{$key};
|
$index{state}{$id}{$key}=$wikistate{$id}{$key};
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ sub import {
|
||||||
hook(type => "rename", id => "skeleton", call => \&rename);
|
hook(type => "rename", id => "skeleton", call => \&rename);
|
||||||
hook(type => "savestate", id => "skeleton", call => \&savestate);
|
hook(type => "savestate", id => "skeleton", call => \&savestate);
|
||||||
hook(type => "genwrapper", id => "skeleton", call => \&genwrapper);
|
hook(type => "genwrapper", id => "skeleton", call => \&genwrapper);
|
||||||
|
hook(type => "disable", id => "skeleton", call => \&disable);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getopt () {
|
sub getopt () {
|
||||||
|
@ -254,4 +255,8 @@ sub genwrapper () {
|
||||||
debug("skeleton plugin running in genwrapper");
|
debug("skeleton plugin running in genwrapper");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub savestate () {
|
||||||
|
debug("skeleton plugin running in disable");
|
||||||
|
}
|
||||||
|
|
||||||
1
|
1
|
||||||
|
|
|
@ -124,6 +124,28 @@ sub merge ($) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub disabled_plugins (@) {
|
||||||
|
# Handles running disable hooks of plugins that were enabled
|
||||||
|
# previously, but got disabled when a new setup file was loaded.
|
||||||
|
if (exists $config{setupfile} && @_) {
|
||||||
|
# Fork a child to load the disabled plugins.
|
||||||
|
my $pid=fork();
|
||||||
|
if ($pid == 0) {
|
||||||
|
foreach my $plugin (@_) {
|
||||||
|
print STDERR "** plugin $plugin disabled\n";
|
||||||
|
eval { IkiWiki::loadplugin($plugin, 1) };
|
||||||
|
if (exists $IkiWiki::hooks{disable}{$plugin}{call}) {
|
||||||
|
eval { $IkiWiki::hooks{disable}{$plugin}{call}->() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
waitpid $pid, 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub getsetup () {
|
sub getsetup () {
|
||||||
# Gets all available setup data from all plugins. Returns an
|
# Gets all available setup data from all plugins. Returns an
|
||||||
# ordered list of [plugin, setup] pairs.
|
# ordered list of [plugin, setup] pairs.
|
||||||
|
@ -134,6 +156,7 @@ sub getsetup () {
|
||||||
$config{syslog}=undef;
|
$config{syslog}=undef;
|
||||||
|
|
||||||
# Load all plugins, so that all setup options are available.
|
# Load all plugins, so that all setup options are available.
|
||||||
|
my %original_loaded_plugins=%IkiWiki::loaded_plugins;
|
||||||
my @plugins=IkiWiki::listplugins();
|
my @plugins=IkiWiki::listplugins();
|
||||||
foreach my $plugin (@plugins) {
|
foreach my $plugin (@plugins) {
|
||||||
eval { IkiWiki::loadplugin($plugin, 1) };
|
eval { IkiWiki::loadplugin($plugin, 1) };
|
||||||
|
@ -141,6 +164,7 @@ sub getsetup () {
|
||||||
my @s=eval { $IkiWiki::hooks{checkconfig}{$plugin}{call}->() };
|
my @s=eval { $IkiWiki::hooks{checkconfig}{$plugin}{call}->() };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
%IkiWiki::loaded_plugins=%original_loaded_plugins;
|
||||||
|
|
||||||
my %sections;
|
my %sections;
|
||||||
foreach my $plugin (@plugins) {
|
foreach my $plugin (@plugins) {
|
||||||
|
|
|
@ -6,6 +6,8 @@ ikiwiki (3.20100723) UNRELEASED; urgency=low
|
||||||
* git: Fix gitweb historyurl examples so "diff to current" links work.
|
* git: Fix gitweb historyurl examples so "diff to current" links work.
|
||||||
(Thanks jrayhawk)
|
(Thanks jrayhawk)
|
||||||
* meta: Allow syntax closer to html meta to be used.
|
* meta: Allow syntax closer to html meta to be used.
|
||||||
|
* Add new disable hook, allowing plugins to perform cleanup after they
|
||||||
|
have been disabled.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Fri, 23 Jul 2010 14:00:32 -0400
|
-- Joey Hess <joeyh@debian.org> Fri, 23 Jul 2010 14:00:32 -0400
|
||||||
|
|
||||||
|
|
|
@ -600,6 +600,13 @@ function of the ikiwiki wrapper when it is being generated.
|
||||||
The code runs before anything else -- in particular it runs before
|
The code runs before anything else -- in particular it runs before
|
||||||
the suid wrapper has sanitized its environment.
|
the suid wrapper has sanitized its environment.
|
||||||
|
|
||||||
|
### disable
|
||||||
|
|
||||||
|
hook(type => "disable", id => "foo", call => \&disable);
|
||||||
|
|
||||||
|
This hook is only run when a previously enabled plugin gets disabled
|
||||||
|
during ikiwiki setup. Plugins can use this to perform cleanups.
|
||||||
|
|
||||||
## Exported variables
|
## Exported variables
|
||||||
|
|
||||||
Several variables are exported to your plugin when you `use IkiWiki;`
|
Several variables are exported to your plugin when you `use IkiWiki;`
|
||||||
|
|
Loading…
Reference in New Issue