summaryrefslogtreecommitdiff
path: root/doc/bugs/methodResponse_in_add__95__plugins.mdwn
blob: c82b532db9c3f30e3687e7e074da0228718e16c3 (plain)

problem description: when using an external plugin like rst, the cgi script (but not the build process) fails with the following words:

Unsuccessful stat on filename containing newline at /usr/share/perl5/IkiWiki.pm line 501.
Unsuccessful stat on filename containing newline at /usr/share/perl5/IkiWiki.pm line 501.
Failed to load plugin IkiWiki::Plugin::</methodResponse>
: Can't locate IkiWiki/Plugin/.pm in @INC (@INC contains: /home/ikiwiki/.ikiwiki /etc/perl \
/usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 \
/usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 44) line 3. 
BEGIN failed--compilation aborted at (eval 44) line 3.

setup used: blank debian sid with ikiwiki 2.61 (but as the patch can be cleanly merged to git HEAD, i suppose this would happen on HEAD as well). perl version is 5.10.0-13.

problem analysis: strings ikiwiki.cgi tells that the stored WRAPPED_OPTIONS contain the string "</methodResponse>\n" where i'd expect "rst" in config{add_plugins}. this seems to originate in the use of $_ in the plugin loading function.

patch comment: solves the problem on 2.61. as these are the first lines of perl i've knowingly written, i can not explain what exactly was happening there.

Perl's $_ handling is the worst wart on it, or possibly any language. Here it's an alias to the actual value in the array, and when deep in the external plugin load code something resets $_ to a different value, the alias remains and it changes the value at a distance.

Thanks for the excellent problem report, [[fixed|done]]. --[[Joey]]


diff --git a/IkiWiki.pm b/IkiWiki.pm
index e476521..d43abd4 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -471,7 +471,11 @@ sub loadplugins () {
                unshift @INC, possibly_foolish_untaint($config{libdir});
        }
 
-       loadplugin($_) foreach @{$config{default_plugins}}, @{$config{add_plugins}};
+       my $pluginname;
+       foreach $pluginname (@{$config{default_plugins}}, @{$config{add_plugins}})
+       {
+               loadplugin($pluginname);
+       }
 
        if ($config{rcs}) {
                if (exists $IkiWiki::hooks{rcs}) {