From 4e02dead1488930b3e5e7afffbd045f03b12c9ad Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 9 Jul 2008 22:39:26 -0400 Subject: [PATCH] Make it possible to load setup files w/o running them. Code needing to do so can call IkiWiki::Setup::load, and the values will be loaded into %IkiWiki::Setup::setup. --- IkiWiki/Setup.pm | 90 +++++++++++++++++++++++++++++++++++++-- IkiWiki/Setup/Standard.pm | 78 +-------------------------------- debian/changelog | 8 ++++ 3 files changed, 95 insertions(+), 81 deletions(-) diff --git a/IkiWiki/Setup.pm b/IkiWiki/Setup.pm index 235e93eaf..778e1b495 100644 --- a/IkiWiki/Setup.pm +++ b/IkiWiki/Setup.pm @@ -1,14 +1,17 @@ #!/usr/bin/perl +package IkiWiki::Setup; use warnings; use strict; use IkiWiki; use open qw{:utf8 :std}; -package IkiWiki; +# This hashref is where setup files store settings while they're being +# loaded. It is not used otherwise. +our $raw_setup; -sub setup () { # {{{ - my $setup=possibly_foolish_untaint($config{setup}); +sub load ($) { # {{{ + my $setup=IkiWiki::possibly_foolish_untaint(shift); delete $config{setup}; #translators: The first parameter is a filename, and the second #translators: is a (probably not translated) error message. @@ -24,7 +27,86 @@ sub setup () { # {{{ eval $code; error("$setup: ".$@) if $@; - exit; + my $ret=$raw_setup; + $raw_setup=undef; + + return %$ret; +} #}}} + +package IkiWiki; + +sub setup () { #{{{ + my %setup=IkiWiki::Setup::load($config{setup}); + + $setup{plugin}=$config{plugin}; + if (exists $setup{add_plugins}) { + push @{$setup{plugin}}, @{$setup{add_plugins}}; + delete $setup{add_plugins}; + } + if (exists $setup{exclude}) { + push @{$config{wiki_file_prune_regexps}}, $setup{exclude}; + } + + if (! $config{render} && (! $config{refresh} || $config{wrappers})) { + debug(gettext("generating wrappers..")); + my @wrappers=@{$setup{wrappers}}; + delete $setup{wrappers}; + my %startconfig=(%config); + foreach my $wrapper (@wrappers) { + %config=(%startconfig, rebuild => 0, verbose => 0, %setup, %{$wrapper}); + checkconfig(); + if (! $config{cgi} && ! $config{post_commit}) { + $config{post_commit}=1; + } + gen_wrapper(); + } + %config=(%startconfig); + } + + foreach my $c (keys %setup) { + next if $c eq 'syslog'; + if (defined $setup{$c}) { + if (! ref $setup{$c}) { + $config{$c}=IkiWiki::possibly_foolish_untaint($setup{$c}); + } + elsif (ref $setup{$c} eq 'ARRAY') { + $config{$c}=[map { IkiWiki::possibly_foolish_untaint($_) } @{$setup{$c}}] + } + elsif (ref $setup{$c} eq 'HASH') { + foreach my $key (keys %{$setup{$c}}) { + $config{$c}{$key}=IkiWiki::possibly_foolish_untaint($setup{$c}{$key}); + } + } + } + else { + $config{$c}=undef; + } + } + + if (! $config{refresh}) { + $config{rebuild}=1; + } + + loadplugins(); + checkconfig(); + + if ($config{render}) { + commandline_render(); + } + + if (! $config{refresh}) { + debug(gettext("rebuilding wiki..")); + } + else { + debug(gettext("refreshing wiki..")); + } + + lockwiki(); + loadindex(); + refresh(); + + debug(gettext("done")); + saveindex(); } #}}} 1 diff --git a/IkiWiki/Setup/Standard.pm b/IkiWiki/Setup/Standard.pm index 0a3496885..693c4fe60 100644 --- a/IkiWiki/Setup/Standard.pm +++ b/IkiWiki/Setup/Standard.pm @@ -11,83 +11,7 @@ use IkiWiki::Render; package IkiWiki::Setup::Standard; sub import { - IkiWiki::setup_standard(@_); -} - -package IkiWiki; - -sub setup_standard { - my %setup=%{$_[1]}; - - $setup{plugin}=$config{plugin}; - if (exists $setup{add_plugins}) { - push @{$setup{plugin}}, @{$setup{add_plugins}}; - delete $setup{add_plugins}; - } - if (exists $setup{exclude}) { - push @{$config{wiki_file_prune_regexps}}, $setup{exclude}; - } - - if (! $config{render} && (! $config{refresh} || $config{wrappers})) { - debug(gettext("generating wrappers..")); - my @wrappers=@{$setup{wrappers}}; - delete $setup{wrappers}; - my %startconfig=(%config); - foreach my $wrapper (@wrappers) { - %config=(%startconfig, rebuild => 0, verbose => 0, %setup, %{$wrapper}); - checkconfig(); - if (! $config{cgi} && ! $config{post_commit}) { - $config{post_commit}=1; - } - gen_wrapper(); - } - %config=(%startconfig); - } - - foreach my $c (keys %setup) { - next if $c eq 'syslog'; - if (defined $setup{$c}) { - if (! ref $setup{$c}) { - $config{$c}=possibly_foolish_untaint($setup{$c}); - } - elsif (ref $setup{$c} eq 'ARRAY') { - $config{$c}=[map { possibly_foolish_untaint($_) } @{$setup{$c}}] - } - elsif (ref $setup{$c} eq 'HASH') { - foreach my $key (keys %{$setup{$c}}) { - $config{$c}{$key}=possibly_foolish_untaint($setup{$c}{$key}); - } - } - } - else { - $config{$c}=undef; - } - } - - if (! $config{refresh}) { - $config{rebuild}=1; - } - - loadplugins(); - checkconfig(); - - if ($config{render}) { - commandline_render(); - } - - if (! $config{refresh}) { - debug(gettext("rebuilding wiki..")); - } - else { - debug(gettext("refreshing wiki..")); - } - - lockwiki(); - loadindex(); - refresh(); - - debug(gettext("done")); - saveindex(); + $IkiWiki::Setup::raw_setup=$_[1]; } 1 diff --git a/debian/changelog b/debian/changelog index adfa2c2f0..667869064 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +ikiwiki (2.54) UNRELEASED; urgency=low + + * Make it possible to load setup files w/o running them. Code + needing to do so can call IkiWiki::Setup::load, and the values will + be loaded into %IkiWiki::Setup::setup. + + -- Joey Hess Wed, 09 Jul 2008 22:27:19 -0400 + ikiwiki (2.53) unstable; urgency=low * search: generate configuration files once only when rebuilding -- 2.45.0