diff options
-rw-r--r-- | IkiWiki/Setup.pm | 26 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/setup.mdwn | 6 | ||||
-rw-r--r-- | doc/usage.mdwn | 14 | ||||
-rwxr-xr-x | ikiwiki.in | 38 |
5 files changed, 64 insertions, 22 deletions
diff --git a/IkiWiki/Setup.pm b/IkiWiki/Setup.pm index 2b0259e2a..5b77a6471 100644 --- a/IkiWiki/Setup.pm +++ b/IkiWiki/Setup.pm @@ -50,10 +50,8 @@ sub load ($;$) { sub dump ($) { my $file=IkiWiki::possibly_foolish_untaint(shift); - - eval qq{require IkiWiki::Setup::$config{setuptype}}; - error $@ if $@; - my @dump="IkiWiki::Setup::$config{setuptype}"->gendump( + + my @header=( "Setup file for ikiwiki.", "", "Passing this to ikiwiki --setup will make ikiwiki generate", @@ -62,9 +60,23 @@ sub dump ($) { "Remember to re-run ikiwiki --setup any time you edit this file.", ); - open (OUT, ">", $file) || die "$file: $!"; - print OUT "$_\n" foreach @dump; - close OUT; + # Fork because dumping setup requires loading all plugins. + my $pid=fork(); + if ($pid == 0) { + eval qq{require IkiWiki::Setup::$config{setuptype}}; + error $@ if $@; + my @dump="IkiWiki::Setup::$config{setuptype}"->gendump(@header); + + open (OUT, ">", $file) || die "$file: $!"; + print OUT "$_\n" foreach @dump; + close OUT; + + exit 0; + } + else { + waitpid $pid, 0; + exit $? if $?; + } } sub merge ($) { diff --git a/debian/changelog b/debian/changelog index 9d88b5c9c..c340f8901 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,8 @@ ikiwiki (3.20100705) UNRELEASED; urgency=low comment moderation queue. * aggregate: Write timestamp next aggregation can happen to .ikiwiki/aggregatetime, to allow for more sophisticated cron jobs. + * Add --changesetup mode that allows easily changing options in a + setup file. -- Joey Hess <joeyh@debian.org> Mon, 05 Jul 2010 13:59:42 -0400 diff --git a/doc/setup.mdwn b/doc/setup.mdwn index 03fed3aa9..266222cc3 100644 --- a/doc/setup.mdwn +++ b/doc/setup.mdwn @@ -102,6 +102,12 @@ After making changes to this file, you need to tell ikiwiki to use it: % ikiwiki -setup foo.setup +Alternatively, you can ask ikiwiki to change settings in the file for you: + + % ikiwiki -changesetup foo.setup -plugin goodstuff + +See [[usage]] for more options. + ## Customizing file locations As a wiki compiler, ikiwiki builds a wiki from files in a source directory, diff --git a/doc/usage.mdwn b/doc/usage.mdwn index 2f87d60d5..840d105d2 100644 --- a/doc/usage.mdwn +++ b/doc/usage.mdwn @@ -32,14 +32,22 @@ These options control the mode that ikiwiki operates in. * --setup setupfile - In setup mode, ikiwiki reads the config file, which is really a perl - program that can call ikiwiki internal functions. - The default action when --setup is specified is to automatically generate wrappers for a wiki based on data in a setup file, and rebuild the wiki. If you only want to build any changed pages, you can use --refresh with --setup. +* --changesetup setupfile + + Reads the setup file, adds any configuration changes specified by other + options, and writes the new configuration back to the setup file. Also + updates any configured wrappers. In this mode, the wiki is not fully + rebuilt, unless you also add --rebuild. + + Example, to enable some plugins: + + ikiwiki --changesetup ~/ikiwiki.setup --plugin goodstuff --plugin calendar + * --dumpsetup setupfile Causes ikiwiki to write to the specified setup file, dumping out diff --git a/ikiwiki.in b/ikiwiki.in index ac43044df..aa3337938 100755 --- a/ikiwiki.in +++ b/ikiwiki.in @@ -14,24 +14,32 @@ sub usage () { gettext(" ikiwiki --setup configfile"), "\n"; } +sub setup (@) { + require IkiWiki::Setup; + my $verbose=$config{verbose}; + my $syslog=$config{syslog}; + IkiWiki::Setup::load($_[1]); + $config{setupverbose}=$config{verbose}; + $config{setupsyslog}=$config{syslog}; + $config{verbose}=$verbose || $config{setupverbose}; + $config{syslog}=$syslog; + $config{setup}=1; +} + sub getconfig () { if (! exists $ENV{WRAPPED_OPTIONS}) { %config=defaultconfig(); eval q{use Getopt::Long}; Getopt::Long::Configure('pass_through'); GetOptions( - "setup|s=s" => sub { - require IkiWiki::Setup; - my $verbose=$config{verbose}; - my $syslog=$config{syslog}; - IkiWiki::Setup::load($_[1]); - $config{setupverbose}=$config{verbose}; - $config{setupsyslog}=$config{syslog}; - $config{verbose}=$verbose || $config{setupverbose}; - $config{syslog}=$syslog; - $config{setup}=1; - }, + "setup|s=s" => \&setup, "dumpsetup|s=s" => \$config{dumpsetup}, + "changesetup|s=s" => sub { + $config{changesetup}=$_[1]; + $config{genwrappers}=1; + $config{refresh}=1; + setup(@_); + }, "wikiname=s" => \$config{wikiname}, "verbose|v!" => \$config{verbose}, "syslog!" => \$config{syslog}, @@ -85,7 +93,8 @@ sub getconfig () { $config{wrappermode}=possibly_foolish_untaint($_[1]) }, "plugin=s@" => sub { - push @{$config{add_plugins}}, $_[1]; + push @{$config{add_plugins}}, $_[1] + unless grep { $_ eq $_[1] } @{$config{add_plugins}}; }, "disable-plugin=s@" => sub { push @{$config{disable_plugins}}, $_[1]; @@ -181,6 +190,11 @@ sub main () { } } + if ($config{changesetup}) { + require IkiWiki::Setup; + IkiWiki::Setup::dump($config{changesetup}); + } + if ($config{dumpsetup}) { $config{srcdir}="" if ! defined $config{srcdir}; $config{destdir}="" if ! defined $config{destdir}; |