X-Git-Url: http://git.tremily.us/?p=ikiwiki.git;a=blobdiff_plain;f=ikiwiki;h=7e140bbecc86b6bcbf85cff2dbeadcaa4aec1709;hp=de71414ede7e6a33d2d565bfaf0b31edebb589cc;hb=7144eb3973ac73a5f79440f91a7c01665fb83aa4;hpb=1e5c7926cf8f54e25bb6c9c5f3b3be5e8667b47b diff --git a/ikiwiki b/ikiwiki index de71414ed..7e140bbec 100755 --- a/ikiwiki +++ b/ikiwiki @@ -3,7 +3,6 @@ $ENV{PATH}="/usr/local/bin:/usr/bin:/bin"; use warnings; use strict; -use File::Find; use Memoize; use File::Spec; use HTML::Template; @@ -19,23 +18,27 @@ my %config=( #{{{ wikiname => "wiki", default_pageext => ".mdwn", cgi => 0, - url => "", - cgiurl => "", - historyurl => "", svn => 1, + url => '', + cgiurl => '', + historyurl => '', anonok => 0, rebuild => 0, - wrapper => 0, + wrapper => undef, + wrappermode => undef, srcdir => undef, destdir => undef, templatedir => undef, + setup => undef, ); #}}} GetOptions( #{{{ + "setup=s" => \$config{setup}, "wikiname=s" => \$config{wikiname}, "verbose|v!" => \$config{verbose}, "rebuild!" => \$config{rebuild}, - "wrapper!" => \$config{wrapper}, + "wrapper=s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" }, + "wrappermode=i" => \$config{wrappermode}, "svn!" => \$config{svn}, "anonok!" => \$config{anonok}, "cgi!" => \$config{cgi}, @@ -47,13 +50,16 @@ GetOptions( #{{{ }, ) || usage(); -usage() unless @ARGV == 3; -$config{srcdir} = possibly_foolish_untaint(shift); -$config{templatedir} = possibly_foolish_untaint(shift); -$config{destdir} = possibly_foolish_untaint(shift); -if ($config{cgi} && ! length $config{url}) { - error("Must specify url to wiki with --url when using --cgi"); -} #}}} +if (! $config{setup}) { + usage() unless @ARGV == 3; + $config{srcdir} = possibly_foolish_untaint(shift); + $config{templatedir} = possibly_foolish_untaint(shift); + $config{destdir} = possibly_foolish_untaint(shift); + if ($config{cgi} && ! length $config{url}) { + error("Must specify url to wiki with --url when using --cgi"); + } +} +#}}} sub usage { #{{{ die "usage: ikiwiki [options] source templates dest\n"; @@ -166,7 +172,7 @@ sub findlinks ($) { #{{{ my $content=shift; my @links; - while ($content =~ /$config{wiki_link_regexp}/g) { + while ($content =~ /(? "$path$dir.html", page => $dir }; } else { $skip=0; } - $path.="../"; } - unshift @ret, { url => $path , page => $config{wikiname} }; + unshift @ret, { url => length $path ? $path : ".", page => $config{wikiname} }; return @ret; } #}}} @@ -535,11 +545,15 @@ sub refresh () { #{{{ # Find existing pages. my %exists; my @files; + + eval q{use File::Find}; find({ no_chdir => 1, wanted => sub { if (/$config{wiki_file_prune_regexp}/) { + no warnings 'once'; $File::Find::prune=1; + use warnings "all"; } elsif (! -d $_) { my ($f)=/$config{wiki_file_regexp}/; # untaint @@ -654,7 +668,8 @@ FILE: foreach my $file (@files) { } } #}}} -sub gen_wrapper () { #{{{ +sub gen_wrapper (@) { #{{{ + my %config=(@_); eval q{use Cwd 'abs_path'}; $config{srcdir}=abs_path($config{srcdir}); $config{destdir}=abs_path($config{destdir}); @@ -663,6 +678,10 @@ sub gen_wrapper () { #{{{ error("$this doesn't seem to be executable"); } + if ($config{setup}) { + error("cannot create a wrapper that uses a setup file"); + } + my @params=($config{srcdir}, $config{templatedir}, $config{destdir}, "--wikiname=$config{wikiname}"); push @params, "--verbose" if $config{verbose}; @@ -724,12 +743,15 @@ $envsave } EOF close OUT; - if (system("gcc", "ikiwiki-wrap.c", "-o", "ikiwiki-wrap") != 0) { + if (system("gcc", "ikiwiki-wrap.c", "-o", possibly_foolish_untaint($config{wrapper})) != 0) { error("failed to compile ikiwiki-wrap.c"); } unlink("ikiwiki-wrap.c"); - print "successfully generated ikiwiki-wrap\n"; - exit 0; + if (defined $config{wrappermode} && + ! chmod(oct($config{wrappermode}), possibly_foolish_untaint($config{wrapper}))) { + error("chmod $config{wrapper}: $!"); + } + print "successfully generated $config{wrapper}\n"; } #}}} sub misctemplate ($$) { #{{{ @@ -1128,8 +1150,39 @@ sub cgi () { #{{{ } } #}}} +sub setup () { # {{{ + my $setup=possibly_foolish_untaint($config{setup}); + delete $config{setup}; + open (IN, $setup) || error("read $setup: $!\n"); + local $/=undef; + my $code=; + ($code)=$code=~/(.*)/s; + close IN; + + my (%setup); + eval $code; + error($@) if $@; + + gen_wrapper(%config, %setup, %{$setup{cgiwrapper}}) if $setup{cgiwrapper}; + gen_wrapper(%config, %setup, %{$setup{svnwrapper}}) if $setup{svnwrapper}; + + print "$setup{wikiname} setup complete, now forcing a rebuild\n"; + foreach my $c (keys %setup) { + $config{$c}=possibly_foolish_untaint($setup{$c}) + if defined $setup{$c} && ! ref $setup{$c}; + } + $config{rebuild}=1; + refresh(); + saveindex(); + exit; +} #}}} + # main {{{ -gen_wrapper() if $config{wrapper}; +setup() if $config{setup}; +if ($config{wrapper}) { + gen_wrapper(%config); + exit; +} memoize('pagename'); memoize('bestlink'); loadindex() unless $config{rebuild};