prototyping improvements
[ikiwiki.git] / ikiwiki
diff --git a/ikiwiki b/ikiwiki
index 79b7eff90d1744dcbf356eb5cbda1389f7707faf..dd5758b3a752a1aa01e345a75b890caf03bd2459 100755 (executable)
--- a/ikiwiki
+++ b/ikiwiki
@@ -2,13 +2,12 @@
 
 $ENV{PATH}="/usr/local/bin:/usr/bin:/bin";
 
-use lib '.'; # For use without installation, removed by Makefile.
-
 package IkiWiki;
 use warnings;
 use strict;
 use File::Spec;
 use HTML::Template;
+use lib '.'; # For use without installation, removed by Makefile.
 
 use vars qw{%config %links %oldlinks %oldpagemtime %renderedfiles %pagesources};
 
@@ -37,46 +36,52 @@ our %config=( #{{{
        adminuser => undef,
 ); #}}}
 
-# 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();
-}
-#}}}
-
-sub checkoptions { #{{{
+sub getconfig () { #{{{
+       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},
+                       "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])
+                       },
+                       "wrapper:s" => sub {
+                               $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap"
+                       },
+               ) || usage();
+
+               if (! $config{setup}) {
+                       usage() unless @ARGV == 2;
+                       $config{srcdir} = possibly_foolish_untaint(shift);
+                       $config{destdir} = possibly_foolish_untaint(shift);
+                       checkconfig();
+               }
+       }
+       else {
+               # wrapper passes a full config structure in the environment
+               # variable
+               eval possibly_foolish_untaint($ENV{WRAPPED_OPTIONS});
+               checkconfig();
+       }
+} #}}}
+
+sub checkconfig () { #{{{
        if ($config{cgi} && ! length $config{url}) {
                error("Must specify url to wiki with --url when using --cgi");
        }
@@ -94,11 +99,7 @@ sub checkoptions { #{{{
        }
 } #}}}
 
-sub usage { #{{{
-       die "usage: ikiwiki [options] source dest\n";
-} #}}}
-
-sub error { #{{{
+sub error ($) { #{{{
        if ($config{cgi}) {
                print "Content-type: text/html\n\n";
                print misctemplate("Error", "<p>Error: @_</p>");
@@ -106,6 +107,16 @@ sub error { #{{{
        die @_;
 } #}}}
 
+sub usage () { #{{{
+       die "usage: ikiwiki [options] source dest\n";
+} #}}}
+
+sub possibly_foolish_untaint ($) { #{{{
+       my $tainted=shift;
+       my ($untainted)=$tainted=~/(.*)/;
+       return $untainted;
+} #}}}
+
 sub debug ($) { #{{{
        return unless $config{verbose};
        if (! $config{cgi}) {
@@ -116,12 +127,6 @@ sub debug ($) { #{{{
        }
 } #}}}
 
-sub possibly_foolish_untaint { #{{{
-       my $tainted=shift;
-       my ($untainted)=$tainted=~/(.*)/;
-       return $untainted;
-} #}}}
-
 sub basename ($) { #{{{
        my $file=shift;
 
@@ -231,7 +236,7 @@ sub isinlinableimage ($) { #{{{
        $file=~/\.(png|gif|jpg|jpeg)$/;
 } #}}}
 
-sub htmllink { #{{{
+sub htmllink ($$;$$) { #{{{
        my $page=shift;
        my $link=shift;
        my $noimageinline=shift; # don't turn links into inline html images
@@ -425,24 +430,24 @@ sub globlist_match ($$) { #{{{
 } #}}}
 
 sub main () { #{{{
+       getconfig();
+       
        if ($config{setup}) {
                require IkiWiki::Setup;
                setup();
        }
-       
-       lockwiki();
-       
-       if ($config{wrapper}) {
+       elsif ($config{wrapper}) {
+               lockwiki();
                require IkiWiki::Wrapper;
                gen_wrapper();
-               exit;
        }
-       
-       if ($config{cgi}) {
+       elsif ($config{cgi}) {
+               lockwiki();
                require IkiWiki::CGI;
                cgi();
        }
        else {
+               lockwiki();
                loadindex() unless $config{rebuild};
                require IkiWiki::Render;
                rcs_update();