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 #!/usr/bin/perl
# Ikiwiki setup files are perl files that 'use IkiWiki::Setup::foo', # Ikiwiki setup files are perl files that 'use IkiWiki::Setup::foo',
# passing it some sort of configuration data. # 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; package IkiWiki::Setup;
use warnings; use warnings;
use strict; use strict;
use IkiWiki; use IkiWiki;
use IkiWiki::Wrapper;
use open qw{:utf8 :std}; 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; our $raw_setup;
sub load ($) { # {{{ sub load ($) { # {{{
@ -34,17 +32,10 @@ sub load ($) { # {{{
eval $code; eval $code;
error("$setup: ".$@) if $@; error("$setup: ".$@) if $@;
my $ret=$raw_setup; my %setup=%{$raw_setup};
$raw_setup=undef; $raw_setup=undef;
return %$ret; # Merge setup into existing config and untaint.
} #}}}
package IkiWiki;
sub setup () { #{{{
my %setup=IkiWiki::Setup::load($config{setup});
$setup{plugin}=$config{plugin}; $setup{plugin}=$config{plugin};
if (exists $setup{add_plugins}) { if (exists $setup{add_plugins}) {
push @{$setup{plugin}}, @{$setup{add_plugins}}; push @{$setup{plugin}}, @{$setup{add_plugins}};
@ -53,35 +44,17 @@ sub setup () { #{{{
if (exists $setup{exclude}) { if (exists $setup{exclude}) {
push @{$config{wiki_file_prune_regexps}}, $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) { foreach my $c (keys %setup) {
next if $c eq 'syslog';
if (defined $setup{$c}) { if (defined $setup{$c}) {
if (! ref $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') { 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') { elsif (ref $setup{$c} eq 'HASH') {
foreach my $key (keys %{$setup{$c}}) { 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; $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 1

View File

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

View File

@ -20,6 +20,7 @@ sub getconfig () { #{{{
Getopt::Long::Configure('pass_through'); Getopt::Long::Configure('pass_through');
GetOptions( GetOptions(
"setup|s=s" => \$config{setup}, "setup|s=s" => \$config{setup},
"dumpsetup|s=s" => \$config{dumpsetup},
"wikiname=s" => \$config{wikiname}, "wikiname=s" => \$config{wikiname},
"verbose|v!" => \$config{verbose}, "verbose|v!" => \$config{verbose},
"syslog!" => \$config{syslog}, "syslog!" => \$config{syslog},
@ -111,7 +112,46 @@ sub main () { #{{{
if ($config{setup}) { if ($config{setup}) {
require IkiWiki::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}) { elsif ($config{wrapper}) {
lockwiki(); lockwiki();
@ -133,12 +173,19 @@ sub main () { #{{{
# do nothing # do nothing
} }
else { else {
if (! $config{refresh}) {
debug(gettext("rebuilding wiki.."));
}
else {
debug(gettext("refreshing wiki.."));
}
lockwiki(); lockwiki();
loadindex(); loadindex();
require IkiWiki::Render; require IkiWiki::Render;
rcs_update(); rcs_update();
refresh(); refresh();
saveindex(); saveindex();
debug(gettext("done"));
} }
} #}}} } #}}}