automator improvements
[ikiwiki] / IkiWiki / Setup / Automator.pm
1 #!/usr/bin/perl
2 # Ikiwiki setup automator.
3
4 package IkiWiki::Setup::Automator;
5
6 use warnings;
7 use strict;
8 use IkiWiki;
9 use Term::ReadLine;
10 use File::Path;
11
12 sub ask ($$) { #{{{
13         my ($question, $default)=@_;
14
15         my $r=Term::ReadLine->new("ikiwiki");
16         $r->readline($question." ", $default);
17 } #}}}
18
19 sub prettydir ($) { #{{{
20         my $dir=shift;
21         $dir=~s/^\Q$ENV{HOME}\E\//~\//;
22         return $dir;
23 } #}}}
24
25 sub import (@) { #{{{
26         my $this=shift;
27         IkiWiki::Setup::merge({@_});
28
29         # Sanitize this to avoid problimatic directory names.
30         $config{wikiname}=~s/[^-A-Za-z0-9_] //g;
31         if (! length $config{wikiname}) {
32                 die "you must enter a wikiname\n";
33         }
34
35         # Avoid overwriting any existing files.
36         foreach my $key (qw{srcdir destdir repository dumpsetup}) {
37                 next unless exists $config{$key};
38                 my $add="";
39                 while (-e $config{$key}.$add) {
40                         $add=1 if ! $add;
41                         $add++;
42                 }
43                 $config{$key}.=$add;
44         }
45
46         IkiWiki::checkconfig();
47
48         print "\n\nSetting up $config{wikiname} ...\n";
49
50         # Set up the repository.
51         mkpath($config{srcdir}) || die "mkdir $config{srcdir}: $!";
52         delete $config{repository} if ! $config{rcs} || $config{rcs}=~/bzr|mercurial/;
53         if ($config{rcs}) {
54                 my @params=($config{rcs}, $config{srcdir});
55                 push @params, $config{repository} if exists $config{repository};
56                 if (system("ikiwiki-makerepo", @params) != 0) {
57                         die "failed: ikiwiki-makerepo @params";
58                 }
59         }
60
61         # Generate setup file.
62         require IkiWiki::Setup;
63         if ($config{rcs}) {
64                 if ($config{rcs} eq 'git') {
65                         $config{git_wrapper}=$config{repository}."/hooks/post-update";
66                 }
67                 elsif ($config{rcs} eq 'svn') {
68                         $config{svn_wrapper}=$config{repository}."/hooks/post-commit";
69                 }
70                 elsif ($config{rcs} eq 'bzr') {
71                         # TODO
72                 }
73                 elsif ($config{rcs} eq 'mercurial') {
74                         # TODO
75                 }
76         }
77         IkiWiki::Setup::dump($config{dumpsetup});
78
79         # Build the wiki.
80         mkpath($config{destdir}) || die "mkdir $config{destdir}: $!";
81         if (system("ikiwiki", "--setup", $config{dumpsetup}) != 0) {
82                 die "ikiwiki --setup $config{dumpsetup} failed";
83         }
84
85         # Done!
86         print "\n\nSuccessfully set up $config{wikiname}:\n";
87         foreach my $key (qw{url srcdir destdir repository}) {
88                 next unless exists $config{$key};
89                 print "\t$key: ".(" " x (10 - length($key)))." ".
90                         prettydir($config{$key})."\n";
91         }
92         print "To modify settings, edit ".prettydir($config{dumpsetup})." and then run:\n";
93         print " ikiwiki -setup ".prettydir($config{dumpsetup})."\n";
94         exit 0;
95 } #}}}
96
97 1