X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/bb93fccf0690344aa77f9538a508959a6de09847..11fc28970b329334d88d3667e5b55e0d57e353ab:/IkiWiki/Setup/Automator.pm diff --git a/IkiWiki/Setup/Automator.pm b/IkiWiki/Setup/Automator.pm index 9f2380d52..d1594d7ea 100644 --- a/IkiWiki/Setup/Automator.pm +++ b/IkiWiki/Setup/Automator.pm @@ -9,12 +9,13 @@ use IkiWiki; use IkiWiki::UserInfo; use Term::ReadLine; use File::Path; +use Encode; sub ask ($$) { my ($question, $default)=@_; my $r=Term::ReadLine->new("ikiwiki"); - $r->readline($question." ", $default); + $r->readline(encode_utf8($question)." ", $default); } sub prettydir ($) { @@ -23,15 +24,20 @@ sub prettydir ($) { return $dir; } -sub import (@) { - my $this=shift; - IkiWiki::Setup::merge({@_}); +sub sanitize_wikiname ($) { + my $wikiname=shift; # Sanitize this to avoid problimatic directory names. - $config{wikiname}=~s/[^-A-Za-z0-9_]//g; - if (! length $config{wikiname}) { + $wikiname=~s/[^-A-Za-z0-9_]//g; + if (! length $wikiname) { error gettext("you must enter a wikiname (that contains alphanumerics)"); } + return $wikiname; +} + +sub import (@) { + my $this=shift; + IkiWiki::Setup::merge({@_}); # Avoid overwriting any existing files. foreach my $key (qw{srcdir destdir repository dumpsetup}) { @@ -57,6 +63,9 @@ sub import (@) { elsif ($config{rcs} eq 'monotone') { $config{mtn_wrapper}=$config{srcdir}."_MTN/ikiwiki-netsync-hook"; } + elsif ($config{rcs} eq 'darcs') { + $config{darcs_wrapper}=$config{repository}."/_darcs/ikiwiki-wrapper"; + } elsif ($config{rcs} eq 'bzr') { # TODO } @@ -73,8 +82,18 @@ sub import (@) { print "\n\nSetting up $config{wikiname} ...\n"; - # Set up the repository. + # Set up the srcdir. mkpath($config{srcdir}) || die "mkdir $config{srcdir}: $!"; + # Copy in example wiki. + if (exists $config{example}) { + # cp -R is POSIX + # Another reason not to use -a is so that pages such as blog + # posts will not have old creation dates on this new wiki. + system("cp -R $IkiWiki::installdir/share/ikiwiki/examples/$config{example}/* $config{srcdir}"); + delete $config{example}; + } + + # Set up the repository. delete $config{repository} if ! $config{rcs} || $config{rcs}=~/bzr|mercurial/; if ($config{rcs}) { my @params=($config{rcs}, $config{srcdir}); @@ -84,6 +103,29 @@ sub import (@) { } } + # Make sure that all the listed plugins can load + # and checkconfig is ok. If a plugin fails to work, + # remove it from the configuration and keep on truckin'. + my %bakconfig=%config; # checkconfig can modify %config so back up + if (! eval { IkiWiki::loadplugins(); IkiWiki::checkconfig() }) { + foreach my $plugin (@{$config{default_plugins}}, @{$bakconfig{add_plugins}}) { + eval { + # delete all hooks so that only this plugins's + # checkconfig will be run + %IkiWiki::hooks=(); + IkiWiki::loadplugin($plugin); + IkiWiki::run_hooks(checkconfig => sub { shift->() }); + }; + if ($@) { + print STDERR sprintf(gettext("** Disabling plugin %s, since it is failing with this message:"), + $plugin)."\n"; + print STDERR "$@\n"; + push @{$bakconfig{disable_plugins}}, $plugin; + } + } + } + %config=%bakconfig; + # Generate setup file. require IkiWiki::Setup; IkiWiki::Setup::dump($config{dumpsetup}); @@ -99,11 +141,21 @@ sub import (@) { next if $admin=~/^http\?:\/\//; # openid # Prompt for password w/o echo. + my ($password, $password2); system('stty -echo 2>/dev/null'); local $|=1; print "\n\nCreating wiki admin $admin ...\n"; - print "Choose a password: "; - chomp(my $password=); + for (;;) { + print "Choose a password: "; + chomp($password=); + print "\n"; + print "Confirm password: "; + chomp($password2=); + + last if $password2 eq $password; + + print "Password mismatch.\n\n"; + } print "\n\n\n"; system('stty sane 2>/dev/null');