X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/8051316904d13de3e467f01ebaeacaa5d8efb1b6..b1925d8e3921f1e745a3469777f0b5635982d9ad:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 2f274f384..e4765219e 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -13,7 +13,8 @@ use open qw{:utf8 :std}; use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase %pagestate %renderedfiles %oldrenderedfiles %pagesources - %destsources %depends %hooks %forcerebuild $gettext_obj}; + %destsources %depends %hooks %forcerebuild $gettext_obj + %loaded_plugins}; use Exporter q{import}; our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match @@ -40,6 +41,28 @@ sub getsetup () { #{{{ safe => 1, rebuild => 1, }, + adminemail => { + type => "string", + default => undef, + example => 'me@example.com', + description => "contact email for wiki", + safe => 1, + rebuild => 0, + }, + adminuser => { + type => "string", + default => [], + description => "users who are wiki admins", + safe => 1, + rebuild => 0, + }, + banned_users => { + type => "string", + default => [], + description => "users who are banned from the wiki", + safe => 1, + rebuild => 0, + }, srcdir => { type => "string", default => undef, @@ -56,21 +79,6 @@ sub getsetup () { #{{{ safe => 0, # path rebuild => 1, }, - adminuser => { - type => "string", - default => [], - description => "user names of wiki admins", - safe => 1, - rebuild => 0, - }, - adminemail => { - type => "string", - default => undef, - example => 'me@example.com', - description => "contact email for wiki", - safe => 1, - rebuild => 0, - }, url => { type => "string", default => '', @@ -82,11 +90,26 @@ sub getsetup () { #{{{ cgiurl => { type => "string", default => '', - examples => "http://example.com/wiki/ikiwiki.cgi", + example => "http://example.com/wiki/ikiwiki.cgi", description => "url to the ikiwiki.cgi", safe => 1, rebuild => 1, }, + cgi_wrapper => { + type => "string", + default => '', + example => "/var/www/wiki/ikiwiki.cgi", + description => "cgi wrapper to generate", + safe => 0, # file + rebuild => 0, + }, + cgi_wrappermode => { + type => "string", + default => '06755', + description => "mode for cgi_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, rcs => { type => "string", default => '', @@ -100,7 +123,7 @@ sub getsetup () { #{{{ openid signinedit lockedit conditional recentchanges parentlinks}], description => "plugins to enable by default", - safe => 1, + safe => 0, rebuild => 1, }, add_plugins => { @@ -117,31 +140,11 @@ sub getsetup () { #{{{ safe => 1, rebuild => 1, }, - wrappers => { - type => "string", - default => undef, - description => "definitions of wrappers to generate", - safe => 0, - rebuild => 0, - }, - wrapper => { - type => "internal", - default => undef, - description => "wrapper filename", - safe => 0, - rebuild => 0, - }, - wrappermode => { - type => "internal", - default => undef, - description => "mode of wrapper file", - safe => 0, - rebuild => 0, - }, templatedir => { type => "string", default => "$installdir/share/ikiwiki/templates", description => "location of template files", + advanced => 1, safe => 0, # path rebuild => 1, }, @@ -149,9 +152,17 @@ sub getsetup () { #{{{ type => "string", default => "$installdir/share/ikiwiki/basewiki", description => "base wiki source location", + advanced => 1, safe => 0, # path rebuild => 0, }, + wrappers => { + type => "internal", + default => [], + description => "wrappers to generate", + safe => 0, + rebuild => 0, + }, underlaydirs => { type => "internal", default => [], @@ -161,14 +172,14 @@ sub getsetup () { #{{{ }, verbose => { type => "boolean", - default => 0, + example => 1, description => "display verbose messages when building?", safe => 1, rebuild => 0, }, syslog => { type => "boolean", - default => 0, + example => 1, description => "log to syslog?", safe => 1, rebuild => 0, @@ -194,6 +205,14 @@ sub getsetup () { #{{{ safe => 1, rebuild => 1, }, + sslcookie => { + type => "boolean", + default => 0, + description => "only send cookies over SSL connections?", + advanced => 1, + safe => 1, + rebuild => 0, + }, default_pageext => { type => "string", default => "mdwn", @@ -212,6 +231,7 @@ sub getsetup () { #{{{ type => "string", default => '%c', description => "strftime format string to display date", + advanced => 1, safe => 1, rebuild => 1, }, @@ -220,16 +240,10 @@ sub getsetup () { #{{{ default => undef, example => "en_US.UTF-8", description => "UTF-8 locale to use", + advanced => 1, safe => 0, rebuild => 1, }, - sslcookie => { - type => "boolean", - default => 0, - description => "only send cookies over SSL connections?", - safe => 1, - rebuild => 0, - }, userdir => { type => "string", default => "", @@ -249,6 +263,7 @@ sub getsetup () { #{{{ type => "boolean", default => 0, description => "attempt to hardlink source files? (optimisation for large files)", + advanced => 1, safe => 0, # paranoia rebuild => 0, }, @@ -257,6 +272,7 @@ sub getsetup () { #{{{ description => "", example => "022", description => "force ikiwiki to use a particular umask", + advanced => 1, safe => 0, # paranoia rebuild => 0, }, @@ -265,6 +281,7 @@ sub getsetup () { #{{{ default => "", example => "$ENV{HOME}/.ikiwiki/", description => "extra library and plugin directory", + advanced => 1, safe => 0, # directory rebuild => 0, }, @@ -280,6 +297,7 @@ sub getsetup () { #{{{ default => undef, example => '\.wav$', description => "regexp of source files to ignore", + advanced => 1, safe => 0, # regexp rebuild => 1, }, @@ -336,6 +354,13 @@ sub getsetup () { #{{{ safe => 0, rebuild => 0, }, + setup => { + type => "internal", + default => undef, + description => "running in setup mode", + safe => 0, + rebuild => 0, + }, refresh => { type => "internal", default => 0, @@ -357,10 +382,10 @@ sub getsetup () { #{{{ safe => 0, rebuild => 0, }, - setup => { + setupfile => { type => "internal", default => undef, - description => "setup file to read", + description => "path to setup file", safe => 0, rebuild => 0, }, @@ -411,16 +436,6 @@ sub checkconfig () { #{{{ $config{wikistatedir}="$config{srcdir}/.ikiwiki" unless exists $config{wikistatedir}; - - if ($config{rcs}) { - eval qq{use IkiWiki::Rcs::$config{rcs}}; - if ($@) { - error("Failed to load RCS module IkiWiki::Rcs::$config{rcs}: $@"); - } - } - else { - require IkiWiki::Rcs::Stub; - } if (defined $config{umask}) { umask(possibly_foolish_untaint($config{umask})); @@ -435,14 +450,14 @@ sub listplugins () { #{{{ my %ret; foreach my $dir (@INC, $config{libdir}) { - next unless defined $dir; + 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") { - next unless defined $dir; + next unless defined $dir && length $dir; foreach my $file (glob("$dir/plugins/*")) { $ret{basename($file)}=1 if -x $file; } @@ -452,11 +467,21 @@ sub listplugins () { #{{{ } #}}} sub loadplugins () { #{{{ - if (defined $config{libdir}) { + if (defined $config{libdir} && length $config{libdir}) { unshift @INC, possibly_foolish_untaint($config{libdir}); } loadplugin($_) foreach @{$config{default_plugins}}, @{$config{add_plugins}}; + + if ($config{rcs}) { + if (exists $IkiWiki::hooks{rcs}) { + error(gettext("cannot use multiple rcs plugins")); + } + loadplugin($config{rcs}); + } + if (! exists $IkiWiki::hooks{rcs}) { + loadplugin("norcs"); + } run_hooks(getopt => sub { shift->() }); if (grep /^-/, @ARGV) { @@ -478,6 +503,7 @@ sub loadplugin ($) { #{{{ if (defined $dir && -x "$dir/plugins/$plugin") { require IkiWiki::Plugin::external; import IkiWiki::Plugin::external "$dir/plugins/$plugin"; + $loaded_plugins{$plugin}=1; return 1; } } @@ -487,6 +513,7 @@ sub loadplugin ($) { #{{{ if ($@) { error("Failed to load plugin $mod: $@"); } + $loaded_plugins{$plugin}=1; return 1; } #}}} @@ -1023,6 +1050,8 @@ sub preprocess ($$$;$$) { #{{{ my $prefix=shift; my $command=shift; my $params=shift; + $params="" if ! defined $params; + if (length $escape) { return "[[$prefix$command $params]]"; } @@ -1067,13 +1096,10 @@ sub preprocess ($$$;$$) { #{{{ if ($preprocessing{$page}++ > 3) { # Avoid loops of preprocessed pages preprocessing # other pages that preprocess them, etc. - #translators: The first parameter is a - #translators: preprocessor directive name, - #translators: the second a page name, the - #translators: third a number. - return "[[".sprintf(gettext("%s preprocessing loop detected on %s at depth %i"), - $command, $page, $preprocessing{$page}). - "]]"; + return "[[!$command ". + sprintf(gettext("preprocessing loop detected on %s at depth %i"), + $page, $preprocessing{$page}). + "]]"; } my $ret; if (! $scan) { @@ -1430,6 +1456,46 @@ sub run_hooks ($$) { # {{{ return 1; } #}}} +sub rcs_update () { #{{{ + $hooks{rcs}{rcs_update}{call}->(@_); +} #}}} + +sub rcs_prepedit ($) { #{{{ + $hooks{rcs}{rcs_prepedit}{call}->(@_); +} #}}} + +sub rcs_commit ($$$;$$) { #{{{ + $hooks{rcs}{rcs_commit}{call}->(@_); +} #}}} + +sub rcs_commit_staged ($$$) { #{{{ + $hooks{rcs}{rcs_commit_staged}{call}->(@_); +} #}}} + +sub rcs_add ($) { #{{{ + $hooks{rcs}{rcs_add}{call}->(@_); +} #}}} + +sub rcs_remove ($) { #{{{ + $hooks{rcs}{rcs_remove}{call}->(@_); +} #}}} + +sub rcs_rename ($$) { #{{{ + $hooks{rcs}{rcs_rename}{call}->(@_); +} #}}} + +sub rcs_recentchanges ($) { #{{{ + $hooks{rcs}{rcs_recentchanges}{call}->(@_); +} #}}} + +sub rcs_diff ($) { #{{{ + $hooks{rcs}{rcs_diff}{call}->(@_); +} #}}} + +sub rcs_getctime ($) { #{{{ + $hooks{rcs}{rcs_getctime}{call}->(@_); +} #}}} + sub globlist_to_pagespec ($) { #{{{ my @globlist=split(' ', shift);