From c8d28b94393d835e58441e59212db646fa3e90ce Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 6 Dec 2014 18:32:02 +0100 Subject: [PATCH] Allow several extra library and plugin directories (libdir option) --- IkiWiki.pm | 25 +++++++++++++++++++------ doc/plugins/install.mdwn | 6 ++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index 1043ef402..73fedb0a6 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -361,7 +361,7 @@ sub getsetup () { type => "string", default => "", example => "$ENV{HOME}/.ikiwiki/", - description => "extra library and plugin directory", + description => "extra library and plugin directorys. Can be either a string (for backward compatibility) or a list of strings.", advanced => 1, safe => 0, # directory rebuild => 0, @@ -551,6 +551,17 @@ sub getsetup () { }, } +sub getlibdirs () { + if (! ref $config{libdir}) { + if (length $config{libdir}) { + return [$config{libdir}]; + } else { + return []; + } + } + return $config{libdir}; +} + sub defaultconfig () { my %s=getsetup(); my @ret; @@ -693,14 +704,14 @@ sub checkconfig () { sub listplugins () { my %ret; - foreach my $dir (@INC, $config{libdir}) { + foreach my $dir (@INC, @{getlibdirs()}) { next unless defined $dir && length $dir; foreach my $file (glob("$dir/IkiWiki/Plugin/*.pm")) { my ($plugin)=$file=~/.*\/(.*)\.pm$/; $ret{$plugin}=1; } } - foreach my $dir ($config{libdir}, "$installdir/lib/ikiwiki") { + foreach my $dir (@{getlibdirs()}, "$installdir/lib/ikiwiki") { next unless defined $dir && length $dir; foreach my $file (glob("$dir/plugins/*")) { $ret{basename($file)}=1 if -x $file; @@ -712,7 +723,9 @@ sub listplugins () { sub loadplugins () { if (defined $config{libdir} && length $config{libdir}) { - unshift @INC, possibly_foolish_untaint($config{libdir}); + foreach my $dir (@{getlibdirs()}) { + unshift @INC, possibly_foolish_untaint($dir); + } } foreach my $plugin (@{$config{default_plugins}}, @{$config{add_plugins}}) { @@ -745,8 +758,8 @@ sub loadplugin ($;$) { return if ! $force && grep { $_ eq $plugin} @{$config{disable_plugins}}; - foreach my $dir (defined $config{libdir} ? possibly_foolish_untaint($config{libdir}) : undef, - "$installdir/lib/ikiwiki") { + foreach my $possiblytainteddir (@{getlibdirs()}, "$installdir/lib/ikiwiki") { + my $dir = defined $possiblytainteddir ? possibly_foolish_untaint($possiblytainteddir) : undef; if (defined $dir && -x "$dir/plugins/$plugin") { eval { require IkiWiki::Plugin::external }; if ($@) { diff --git a/doc/plugins/install.mdwn b/doc/plugins/install.mdwn index 900662eec..8ae1c8bde 100644 --- a/doc/plugins/install.mdwn +++ b/doc/plugins/install.mdwn @@ -8,9 +8,11 @@ inside the perl search path. For example, if your perl looks in `/usr/local/lib/site_perl` for modules, you can locally install ikiwiki plugins to `/usr/local/lib/site_perl/IkiWiki/Plugin` -You can use the `libdir` configuration option to add a directory to the +You can use the `libdir` configuration option to add directories to the search path. For example, if you set `libdir` to `/home/you/.ikiwiki/`, -then ikiwiki will look for plugins in `/home/you/.ikiwiki/IkiWiki/Plugin`. +then ikiwiki will look for plugins in `/home/you/.ikiwiki/IkiWiki/Plugin`. This +configuration option can be either a string (for backward compatibility) or a +list of strings (to add several directories to the search path). Ikiwiki also supports plugins that are external programs. These are typically written in some other language than perl. Ikiwiki searches for -- 2.44.0