releasing version 1.3
[ikiwiki.git] / ikiwiki
1 #!/usr/bin/perl -T
2 $ENV{PATH}="/usr/local/bin:/usr/bin:/bin";
3
4 package IkiWiki;
5 use warnings;
6 use strict;
7 use lib '.'; # For use without installation, removed by Makefile.
8 use IkiWiki;
9
10 sub usage () { #{{{
11         die "usage: ikiwiki [options] source dest\n";
12 } #}}}
13
14 sub getconfig () { #{{{
15         if (! exists $ENV{WRAPPED_OPTIONS}) {
16                 %config=defaultconfig();
17                 eval q{use Getopt::Long};
18                 GetOptions(
19                         "setup|s=s" => \$config{setup},
20                         "wikiname=s" => \$config{wikiname},
21                         "verbose|v!" => \$config{verbose},
22                         "rebuild!" => \$config{rebuild},
23                         "refresh!" => \$config{refresh},
24                         "getctime" => \$config{getctime},
25                         "wrappermode=i" => \$config{wrappermode},
26                         "rcs=s" => \$config{rcs},
27                         "no-rcs" => sub { $config{rcs}="" },
28                         "anonok!" => \$config{anonok},
29                         "rss!" => \$config{rss},
30                         "cgi!" => \$config{cgi},
31                         "discussion!" => \$config{discussion},
32                         "notify!" => \$config{notify},
33                         "url=s" => \$config{url},
34                         "cgiurl=s" => \$config{cgiurl},
35                         "historyurl=s" => \$config{historyurl},
36                         "diffurl=s" => \$config{diffurl},
37                         "svnrepo" => \$config{svnrepo},
38                         "svnpath" => \$config{svnpath},
39                         "adminemail=s" => \$config{adminemail},
40                         "exclude=s@" => sub {
41                                 $config{wiki_file_prune_regexp}=qr/$config{wiki_file_prune_regexp}|$_[1]/;
42                         },
43                         "adminuser=s@" => sub {
44                                 push @{$config{adminuser}}, $_[1]
45                         },
46                         "templatedir=s" => sub {
47                                 $config{templatedir}=possibly_foolish_untaint($_[1])
48                         },
49                         "underlaydir=s" => sub {
50                                 $config{underlaydir}=possibly_foolish_untaint($_[1])
51                         },
52                         "wrapper:s" => sub {
53                                 $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap"
54                         },
55                         "plugin=s@" => sub {
56                                 push @{$config{plugin}}, $_[1];
57                         },
58                         "disable-plugin=s@" => sub {
59                                 $config{plugin}=[grep { $_ ne $_[1] } @{$config{plugin}} ];
60                         },
61                 ) || usage();
62
63                 if (! $config{setup}) {
64                         usage() unless @ARGV == 2;
65                         $config{srcdir} = possibly_foolish_untaint(shift @ARGV);
66                         $config{destdir} = possibly_foolish_untaint(shift @ARGV);
67                         checkconfig();
68                 }
69         }
70         else {
71                 # wrapper passes a full config structure in the environment
72                 # variable
73                 eval possibly_foolish_untaint($ENV{WRAPPED_OPTIONS});
74                 if ($@) {
75                         error("WRAPPED_OPTIONS: $@");
76                 }
77                 checkconfig();
78         }
79 } #}}}
80
81 sub main () { #{{{
82         getconfig();
83         
84         if ($config{cgi}) {
85                 lockwiki();
86                 loadindex();
87                 require IkiWiki::CGI;
88                 cgi();
89         }
90         elsif ($config{setup}) {
91                 require IkiWiki::Setup;
92                 setup();
93         }
94         elsif ($config{wrapper}) {
95                 lockwiki();
96                 require IkiWiki::Wrapper;
97                 gen_wrapper();
98         }
99         else {
100                 lockwiki();
101                 loadindex();
102                 require IkiWiki::Render;
103                 rcs_update();
104                 rcs_getctime() if $config{getctime};
105                 refresh();
106                 rcs_notify() if $config{notify};
107                 saveindex();
108         }
109 } #}}}
110
111 main;