load all plugins when generating setup
authorJoey Hess <joey@kodama.kitenet.net>
Sat, 26 Jul 2008 23:10:11 +0000 (19:10 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Sat, 26 Jul 2008 23:10:11 +0000 (19:10 -0400)
IkiWiki.pm
IkiWiki/Plugin/prettydate.pm
IkiWiki/Setup/Standard.pm
doc/plugins/write.mdwn

index 4410fc98592bea4b6a591a2ae67b28dabc1c03f3..a2b9a3e24668888ccfbfd2a2ad877f3602f3fff9 100644 (file)
@@ -417,6 +417,26 @@ sub checkconfig () { #{{{
        return 1;
 } #}}}
 
+sub listplugins () { #{{{
+       my %ret;
+
+       foreach my $dir (@INC, $config{libdir}) {
+               next unless defined $dir;
+               foreach my $file (glob("$dir/IkiWiki/Plugin/*.pm")) {
+                       my ($plugin)=$file=~/.*\/(.*)\.pm$/;
+                       $ret{$plugin}=1;
+               }
+       }
+       foreach my $dir ($config{libdir}, "$installdir/lib/ikiwiki") {
+               next unless defined $dir;
+               foreach my $file (glob("$dir/plugins/*")) {
+                       $ret{basename($file)}=1 if -x $file;
+               }
+       }
+
+       return keys %ret;
+} #}}}
+
 sub loadplugins () { #{{{
        if (defined $config{libdir}) {
                unshift @INC, possibly_foolish_untaint($config{libdir});
index 29330f29fd5666c75a7bead7e4fcbbcf394ea3b0..080317f060a6da0030dba46018f84ba31829f099 100644 (file)
@@ -54,8 +54,8 @@ sub getsetup () { #{{{
                        rebuild => 1,
                },
                timetable => {
-                       type => undef, # don't try to show in interface
-                       default => '%X, %B %o, %Y',
+                       type => "internal",
+                       default => undef,
                        description => "array of time descriptions",
                        safe => 1,
                        rebuild => 1,
index b8ad091448c025d3b3400b0e38b883e84754d6fa..d8547ba5f9a65b73bb2405690d35366e76cfb2b6 100644 (file)
@@ -78,22 +78,26 @@ sub gendump ($) { #{{{
        
        push @ret, "\t# basic setup";
        push @ret, dumpvalues(\%setup, IkiWiki::getsetup());
-       push @ret, "";
 
-       # sort rcs plugin first
-       my @plugins=sort {
-               ($a eq $config{rcs}) <=> ($b eq $config{rcs})
-               ||
-               $a cmp $b
-       } keys %{$IkiWiki::hooks{getsetup}};
+       # Load all plugins, so that all setup options are available.
+       my @plugins=sort(IkiWiki::listplugins());
+       foreach my $plugin (@plugins) {
+               eval { IkiWiki::loadplugin($plugin) };
+               if (exists $IkiWiki::hooks{checkconfig}{$plugin}{call}) {
+                       my @s=eval { $IkiWiki::hooks{checkconfig}{$plugin}{call}->() };
+               }
+       }
+       unshift @plugins, $config{rcs} if $config{rcs};
 
-       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".($id ne $config{rcs} ? " plugin" : "");
-               push @ret, dumpvalues(\%setup, @s);
-               push @ret, "";
+       foreach my $id (@plugins) {
+               my $title="\t# $id".($id ne $config{rcs} ? " plugin" : "");
+               if (exists $IkiWiki::hooks{getsetup}{$id}{call}) {
+                       # use an array rather than a hash, to preserve order
+                       my @s=eval { $IkiWiki::hooks{getsetup}{$id}{call}->() };
+                       next unless @s;
+                       push @ret, "", $title;
+                       push @ret, dumpvalues(\%setup, @s);
+               }
        }
        
        unshift @ret,
index faf1643587078e1ae69ff421cb5510c2421073de..9a844ca06526f148c8f0096b5f30b468b7bc41d0 100644 (file)
@@ -390,9 +390,8 @@ describing the option. For example:
                        },
 
 * `type` can be "boolean", "string", "integer", "internal" (used for values
-  that are not user-visible) or `undef` (use for complex types). Note that
-  the type is the type of the leaf values; the `%config` option may be an
-  array or hash of these.
+  that are not user-visible). The type is the type of the leaf values; 
+  the `%config` option may be an array or hash of these.
 * `default` should be set to the default value of the option, if any.
 * `example` can be set to an example value, which will not be used by default.
 * `description` is a short description of the option.