]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
Merge remote-tracking branch 'spalax/paternal/libdirs'
[ikiwiki.git] / IkiWiki.pm
index 03f058ef7fdeaf708fe2ef0540b433e4d174a907..7c55764befa0f5d325e01f302ca4a8a036c82256 100644 (file)
@@ -5,6 +5,7 @@ package IkiWiki;
 use warnings;
 use strict;
 use Encode;
+use Fcntl q{:flock};
 use URI::Escape q{uri_escape_utf8};
 use POSIX ();
 use Storable;
@@ -361,7 +362,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,
@@ -558,6 +559,20 @@ sub getsetup () {
        },
 }
 
+sub getlibdirs () {
+       my $libdirs;
+       if (! ref $config{libdir}) {
+               if (length $config{libdir}) {
+                       $libdirs = [$config{libdir}];
+               } else {
+                       $libdirs = [];
+               }
+       } else {
+               $libdirs = $config{libdir};
+       }
+       return @{$libdirs};
+}
+
 sub defaultconfig () {
        my %s=getsetup();
        my @ret;
@@ -700,14 +715,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;
@@ -719,7 +734,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}}) {
@@ -752,8 +769,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 ($@) {
@@ -1813,8 +1830,11 @@ sub lockwiki () {
        }
        open($wikilock, '>', "$config{wikistatedir}/lockfile") ||
                error ("cannot write to $config{wikistatedir}/lockfile: $!");
-       if (! flock($wikilock, 2)) { # LOCK_EX
-               error("failed to get lock");
+       if (! flock($wikilock, LOCK_EX | LOCK_NB)) {
+               debug("failed to get lock; waiting...");
+               if (! flock($wikilock, LOCK_EX)) {
+                       error("failed to get lock");
+               }
        }
        return 1;
 }