#!/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 ($) { # {{{
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}};
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});
}
}
}
$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
$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//;
return "\t$prefix$key=$dumpedvalue,";
} #}}}
-sub dumpsetup ($@) { #{{{
+sub dumpvalues ($@) { #{{{
my $setup=shift;
my @ret;
while (@_) {
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, "";
}
use IkiWiki::Setup::Standard {";
push @ret, "}";
- return @ret;
+
+ open (OUT, ">", $file) || die "$file: $!";
+ print OUT "$_\n" foreach @ret;
+ close OUT;
} #}}}
1
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},
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();
# 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"));
}
} #}}}