]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
web commit by madmax
[ikiwiki.git] / IkiWiki.pm
index 5eef40878e323cf8f991aed8f46d40306297a690..0485da75c74e83cfc9a8245568e6cfb8079f0f66 100644 (file)
@@ -17,6 +17,7 @@ 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
                  %config %links %renderedfiles %pagesources %destsources);
 our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
 our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
@@ -83,6 +84,7 @@ sub defaultconfig () { #{{{
        pingurl => [],
        templatedir => "$installdir/share/ikiwiki/templates",
        underlaydir => "$installdir/share/ikiwiki/basewiki",
+       underlaydirs => [],
        setup => undef,
        adminuser => undef,
        adminemail => undef,
@@ -146,7 +148,7 @@ sub checkconfig () { #{{{
 
 sub loadplugins () { #{{{
        if (defined $config{libdir}) {
-               unshift @INC, $config{libdir};
+               unshift @INC, possibly_foolish_untaint($config{libdir});
        }
 
        loadplugin($_) foreach @{$config{plugin}};
@@ -166,7 +168,8 @@ sub loadplugin ($) { #{{{
 
        return if grep { $_ eq $plugin} @{$config{disable_plugins}};
 
-       foreach my $dir ($config{libdir}, "$installdir/lib/ikiwiki") {
+       foreach my $dir (defined $config{libdir} ? possibly_foolish_untaint($config{libdir}) : undef,
+                        "$installdir/lib/ikiwiki") {
                if (defined $dir && -x "$dir/plugins/$plugin") {
                        require IkiWiki::Plugin::external;
                        import IkiWiki::Plugin::external "$dir/plugins/$plugin";
@@ -284,11 +287,26 @@ sub srcfile ($) { #{{{
        my $file=shift;
 
        return "$config{srcdir}/$file" if -e "$config{srcdir}/$file";
-       return "$config{underlaydir}/$file" if -e "$config{underlaydir}/$file";
-       error("internal error: $file cannot be found in $config{srcdir} or $config{underlaydir}");
+       foreach my $dir (@{$config{underlaydirs}}, $config{underlaydir}) {
+               return "$dir/$file" if -e "$dir/$file";
+       }
+       error("internal error: $file cannot be found in $config{srcdir} or underlay");
        return;
 } #}}}
 
+sub add_underlay ($) { #{{{
+       my $dir=shift;
+
+       if ($dir=~/^\//) {
+               unshift @{$config{underlaydirs}}, $dir;
+       }
+       else {
+               unshift @{$config{underlaydirs}}, "$config{underlaydir}/../$dir";
+       }
+
+       return 1;
+} #}}}
+
 sub readfile ($;$$) { #{{{
        my $file=shift;
        my $binary=shift;
@@ -773,7 +791,8 @@ sub lockwiki (;$) { #{{{
 } #}}}
 
 sub unlockwiki () { #{{{
-       return close($wikilock);
+       return close($wikilock) if $wikilock;
+       return;
 } #}}}
 
 my $commitlock;
@@ -799,7 +818,8 @@ sub disable_commit_hook () { #{{{
 } #}}}
 
 sub enable_commit_hook () { #{{{
-       return close($commitlock);
+       return close($commitlock) if $commitlock;
+       return;
 } #}}}
 
 sub loadindex () { #{{{
@@ -1016,7 +1036,9 @@ sub file_pruned ($$) { #{{{
 
 sub gettext { #{{{
        # Only use gettext in the rare cases it's needed.
-       if (exists $ENV{LANG} || exists $ENV{LC_ALL} || exists $ENV{LC_MESSAGES}) {
+       if ((exists $ENV{LANG} && length $ENV{LANG}) ||
+           (exists $ENV{LC_ALL} && length $ENV{LC_ALL}) ||
+           (exists $ENV{LC_MESSAGES} && length $ENV{LC_MESSAGES})) {
                if (! $gettext_obj) {
                        $gettext_obj=eval q{
                                use Locale::gettext q{textdomain};