add dumpsetup option; refactor

master
Joey Hess 2008-07-26 12:46:31 -04:00
parent 62cd2e0a5d
commit 5bea644fdd
3 changed files with 77 additions and 77 deletions

View File

@ -1,20 +1,18 @@
#!/usr/bin/perl
# Ikiwiki setup files are perl files that 'use IkiWiki::Setup::foo',
# passing it some sort of configuration data.
#
# There can be multiple modules, with different configuration styles.
# The setup modules each convert the data into the hashes used by ikiwiki
# internally (if it's not already in that format), and store it in
# IkiWiki::Setup::$raw_setup, to pass it back to this module.
package IkiWiki::Setup;
use warnings;
use strict;
use IkiWiki;
use IkiWiki::Wrapper;
use open qw{:utf8 :std};
# There can be multiple modules, with different configuration styles.
# The setup modules each convert the data into the hashes used by ikiwiki
# internally (if it's not already in that format), and store it in
# IkiWiki::Setup::$raw_setup, to pass it back to this module.
our $raw_setup;
sub load ($) { # {{{
@ -34,17 +32,10 @@ sub load ($) { # {{{
eval $code;
error("$setup: ".$@) if $@;
my $ret=$raw_setup;
my %setup=%{$raw_setup};
$raw_setup=undef;
return %$ret;
} #}}}
package IkiWiki;
sub setup () { #{{{
my %setup=IkiWiki::Setup::load($config{setup});
# Merge setup into existing config and untaint.
$setup{plugin}=$config{plugin};
if (exists $setup{add_plugins}) {
push @{$setup{plugin}}, @{$setup{add_plugins}};
@ -53,35 +44,17 @@ sub setup () { #{{{
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});
$config{$c}=IkiWiki::possibly_foolish_untaint($setup{$c});
}
elsif (ref $setup{$c} eq 'ARRAY') {
$config{$c}=[map { possibly_foolish_untaint($_) } @{$setup{$c}}]
$config{$c}=[map { IkiWiki::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});
$config{$c}{$key}=IkiWiki::possibly_foolish_untaint($setup{$c}{$key});
}
}
}
@ -89,33 +62,6 @@ sub setup () { #{{{
$config{$c}=undef;
}
}
if (! $config{refresh}) {
$config{rebuild}=1;
}
loadplugins();
checkconfig();
require IkiWiki::Render;
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

View File

@ -12,11 +12,21 @@ sub import { #{{{
$IkiWiki::Setup::raw_setup=$_[1];
} #}}}
package IkiWiki::Setup;
sub dumpline ($$$) { #{{{
my $key=shift;
my $value=shift;
my $prefix=shift;
eval q{use Data::Dumper};
error($@) if $@;
local $Data::Dumper::Terse=1;
local $Data::Dumper::Indent=1;
local $Data::Dumper::Pad="\t";
local $Data::Dumper::Sortkeys=1;
local $Data::Dumper::Quotekeys=0;
my $dumpedvalue=Dumper($value);
chomp $dumpedvalue;
$dumpedvalue=~s/^\t//;
@ -24,7 +34,7 @@ sub dumpline ($$$) { #{{{
return "\t$prefix$key=$dumpedvalue,";
} #}}}
sub dumpsetup ($@) { #{{{
sub dumpvalues ($@) { #{{{
my $setup=shift;
my @ret;
while (@_) {
@ -47,24 +57,18 @@ sub dumpsetup ($@) { #{{{
return @ret;
} #}}}
sub dump (@) { #{{{
my %setup=@_;
eval q{use Data::Dumper};
error($@) if $@;
local $Data::Dumper::Terse=1;
local $Data::Dumper::Indent=1;
local $Data::Dumper::Pad="\t";
local $Data::Dumper::Sortkeys=1;
local $Data::Dumper::Quotekeys=0;
sub dump ($) { #{{{
my $file=shift;
my %setup=(%config);
my @ret;
foreach my $id (sort keys %{$IkiWiki::hooks{getsetup}}) {
# use an array rather than a hash, to preserve order
my @s=$IkiWiki::hooks{getsetup}{$id}{call}->();
return unless @s;
push @ret, "\t# $id plugin";
push @ret, dumpsetup(\%setup, @s);
push @ret, dumpvalues(\%setup, @s);
push @ret, "";
}
@ -84,7 +88,10 @@ sub dump (@) { #{{{
use IkiWiki::Setup::Standard {";
push @ret, "}";
return @ret;
open (OUT, ">", $file) || die "$file: $!";
print OUT "$_\n" foreach @ret;
close OUT;
} #}}}
1

View File

@ -20,6 +20,7 @@ sub getconfig () { #{{{
Getopt::Long::Configure('pass_through');
GetOptions(
"setup|s=s" => \$config{setup},
"dumpsetup|s=s" => \$config{dumpsetup},
"wikiname=s" => \$config{wikiname},
"verbose|v!" => \$config{verbose},
"syslog!" => \$config{syslog},
@ -111,7 +112,46 @@ sub main () { #{{{
if ($config{setup}) {
require IkiWiki::Setup;
setup();
IkiWiki::Setup::load($config{setup});
if (! $config{render} && ! $config{dumpsetup} &&
(! $config{refresh} || $config{wrappers})) {
debug(gettext("generating wrappers.."));
require IkiWiki::Wrapper;
my %origconfig=(%config);
my @wrappers=@{$config{wrappers}};
delete $config{wrappers};
foreach my $wrapper (@wrappers) {
%config=(%origconfig,
rebuild => 0,
verbose => 0,
%{$wrapper},
);
checkconfig();
if (! $config{cgi} && ! $config{post_commit}) {
$config{post_commit}=1;
}
gen_wrapper();
}
%config=(%origconfig);
}
# setup implies a wiki rebuild by default
if (! $config{refresh}) {
$config{rebuild}=1;
}
# ignore syslog setting from setup file
# while doing initial setup
$config{syslog}=0;
loadplugins();
checkconfig();
}
if ($config{dumpsetup}) {
loadplugins();
checkconfig();
IkiWiki::Setup::dump($config{dumpsetup});
}
elsif ($config{wrapper}) {
lockwiki();
@ -133,12 +173,19 @@ sub main () { #{{{
# do nothing
}
else {
if (! $config{refresh}) {
debug(gettext("rebuilding wiki.."));
}
else {
debug(gettext("refreshing wiki.."));
}
lockwiki();
loadindex();
require IkiWiki::Render;
rcs_update();
refresh();
saveindex();
debug(gettext("done"));
}
} #}}}