proper main sub and loadindex optimisation for cgis
[ikiwiki.git] / ikiwiki
diff --git a/ikiwiki b/ikiwiki
index cdc5c8ca4e372d29cdb717bc726ac87c2a4d0aa5..79b7eff90d1744dcbf356eb5cbda1389f7707faf 100755 (executable)
--- a/ikiwiki
+++ b/ikiwiki
@@ -7,10 +7,8 @@ use lib '.'; # For use without installation, removed by Makefile.
 package IkiWiki;
 use warnings;
 use strict;
-use Memoize;
 use File::Spec;
 use HTML::Template;
-use Getopt::Long;
 
 use vars qw{%config %links %oldlinks %oldpagemtime %renderedfiles %pagesources};
 
@@ -39,31 +37,41 @@ our %config=( #{{{
        adminuser => undef,
 ); #}}}
 
-GetOptions( #{{{
-       "setup|s=s" => \$config{setup},
-       "wikiname=s" => \$config{wikiname},
-       "verbose|v!" => \$config{verbose},
-       "rebuild!" => \$config{rebuild},
-       "wrapper:s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" },
-       "wrappermode=i" => \$config{wrappermode},
-       "svn!" => \$config{svn},
-       "anonok!" => \$config{anonok},
-       "cgi!" => \$config{cgi},
-       "url=s" => \$config{url},
-       "cgiurl=s" => \$config{cgiurl},
-       "historyurl=s" => \$config{historyurl},
-       "diffurl=s" => \$config{diffurl},
-       "exclude=s@" => sub {
-               $config{wiki_file_prune_regexp}=qr/$config{wiki_file_prune_regexp}|$_[1]/;
-       },
-       "adminuser=s@" => sub { push @{$config{adminuser}}, $_[1] },
-       "templatedir=s" => sub { $config{templatedir}=possibly_foolish_untaint($_[1]) },
-) || usage();
-
-if (! $config{setup}) {
-       usage() unless @ARGV == 2;
-       $config{srcdir} = possibly_foolish_untaint(shift);
-       $config{destdir} = possibly_foolish_untaint(shift);
+# option parsing #{{{
+if (! exists $ENV{WRAPPED_OPTIONS}) {
+       eval q{use Getopt::Long};
+       GetOptions(
+               "setup|s=s" => \$config{setup},
+               "wikiname=s" => \$config{wikiname},
+               "verbose|v!" => \$config{verbose},
+               "rebuild!" => \$config{rebuild},
+               "wrapper:s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" },
+               "wrappermode=i" => \$config{wrappermode},
+               "svn!" => \$config{svn},
+               "anonok!" => \$config{anonok},
+               "cgi!" => \$config{cgi},
+               "url=s" => \$config{url},
+               "cgiurl=s" => \$config{cgiurl},
+               "historyurl=s" => \$config{historyurl},
+               "diffurl=s" => \$config{diffurl},
+               "exclude=s@" => sub {
+                       $config{wiki_file_prune_regexp}=qr/$config{wiki_file_prune_regexp}|$_[1]/;
+               },
+               "adminuser=s@" => sub { push @{$config{adminuser}}, $_[1] },
+               "templatedir=s" => sub { $config{templatedir}=possibly_foolish_untaint($_[1]) },
+       ) || usage();
+
+       if (! $config{setup}) {
+               usage() unless @ARGV == 2;
+               $config{srcdir} = possibly_foolish_untaint(shift);
+               $config{destdir} = possibly_foolish_untaint(shift);
+               checkoptions();
+       }
+}
+else {
+       # wrapper passes a full config structure in the environment
+       # variable
+       eval possibly_foolish_untaint($ENV{WRAPPED_OPTIONS});
        checkoptions();
 }
 #}}}
@@ -416,28 +424,31 @@ sub globlist_match ($$) { #{{{
        return 0;
 } #}}}
 
-# main {{{
-memoize('pagename');
-memoize('bestlink');
-if ($config{setup}) {
-       require IkiWiki::Setup;
-       setup();
-}
-lockwiki();
-if ($config{wrapper}) {
-       require IkiWiki::Wrapper;
-       gen_wrapper();
-       exit;
-}
-loadindex() unless $config{rebuild};
-if ($config{cgi}) {
-       require IkiWiki::CGI;
-       cgi();
-}
-else {
-       require IkiWiki::Render;
-       rcs_update();
-       refresh();
-       saveindex();
-}
-#}}}
+sub main () { #{{{
+       if ($config{setup}) {
+               require IkiWiki::Setup;
+               setup();
+       }
+       
+       lockwiki();
+       
+       if ($config{wrapper}) {
+               require IkiWiki::Wrapper;
+               gen_wrapper();
+               exit;
+       }
+       
+       if ($config{cgi}) {
+               require IkiWiki::CGI;
+               cgi();
+       }
+       else {
+               loadindex() unless $config{rebuild};
+               require IkiWiki::Render;
+               rcs_update();
+               refresh();
+               saveindex();
+       }
+} #}}}
+
+main;