source: trunk/Build.PL @ 594

Last change on this file since 594 was 587, checked in by kake, 17 years ago

Encapsulate config data in OpenGuides::Config.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1use strict;
2use lib "lib";
3use OpenGuides::Build;
4use OpenGuides::Config;
5use Data::Dumper;
6
7eval "use Config::Tiny";
8die "Config::Tiny is required to configure this application.\n" if $@;
9
10print <<EOF;
11
12Beginning install process... if you already have an OpenGuides
13configuration file and you don't want to have to type in all your config
14parameters over again, abort this process now, copy that file to this
15directory, and start again.
16
17EOF
18
19my $continue = Module::Build->y_n("Continue with install?", "y");
20exit 0 unless $continue;
21
22my $existing_config = OpenGuides::Config->new( file => "wiki.conf" );
23
24my %yn_vars = map { $_ => 1 }
25   qw(use_plucene enable_page_deletion navbar_on_home_page backlinks_in_title);
26
27my $skip_config = Module::Build->y_n("Skip OpenGuides configuration?", "n");
28if ( $skip_config ) {
29    print <<EOF;
30===========================================================================
31Skipping OpenGuides configuration - any configuration options previously
32saved will be used instead.  You may tweak your configuration now by
33editing the 'wiki.conf' file produced by this script.
34===========================================================================
35EOF
36}
37
38my @answers;
39
40# It is an ancient Configurer, and he chooseth one of three.
41my $dbtype;
42my $dbtype_qu = $existing_config->dbtype__qu;
43if ( $skip_config ) {
44    $dbtype = $existing_config->dbtype;
45} else {
46    until ( $dbtype ) {
47        my $def = $existing_config->dbtype;
48        $dbtype = Module::Build->prompt("\n$dbtype_qu", $def);
49        $dbtype = lc($dbtype);
50        $dbtype =~ s/^\s*//;
51        $dbtype =~ s/\s*$//;
52        unless ( $dbtype eq "postgres" or $dbtype eq "mysql"
53                 or $dbtype eq "sqlite" ) {
54            undef $dbtype;
55        }
56    }
57}
58
59# Check they have the relevant DBD driver installed.
60my %drivers = ( postgres => "DBD::Pg",
61                mysql    => "DBD::mysql",
62                sqlite   => "DBD::SQLite",
63              );
64eval "require $drivers{$dbtype}";
65die "$drivers{$dbtype} is needed to run a $dbtype database" if $@;
66
67push @answers, { question => $dbtype_qu,
68                 variable => "dbtype",
69                 value    => $dbtype };
70
71my $install_directory; # used to suggest template paths
72foreach my $var ( qw(
73   dbname dbuser dbpass dbhost script_name
74   install_directory template_path custom_template_path script_url
75   custom_lib_path use_plucene indexing_directory enable_page_deletion
76   admin_pass stylesheet_url site_name navbar_on_home_page home_name
77   site_desc default_city default_country contact_email default_language
78   formatting_rules_node backlinks_in_title
79  ) ) {
80    my $q_method = $var . "__qu";
81    my $qu  = $existing_config->$q_method;
82    my $type = $yn_vars{$var} ? "y_n" : "";
83    my $def = $existing_config->$var;
84    my $val = $def;
85
86    # Override dbname question for SQLite only.
87    if ( $dbtype eq "sqlite" and $var eq "dbname" ) {
88        $qu = "what's the full filename of the SQLite database this site runs on?";
89    }
90
91    if ( $dbtype eq "sqlite" and
92         ( $var eq "dbuser" or $var eq "dbpass" or $var eq "dbhost" )
93       ) {
94        print "$var not relevant for SQLite... skipping...\n";
95        push @answers, { question => $qu,
96                         variable => $var,
97                         value    => "not-used" };
98        next;
99    }
100
101    # Make sensible suggestions for template paths if we don't already
102    # have them stored.  Not really a default, but a useful hint/shortcut.
103    if ( $var eq "template_path" && !defined $existing_config->$var ) {
104        $def = $install_directory;
105        $def .= "/" unless $def =~ m|/$|;
106        $def .= "templates";
107    }
108    if ( $var eq "custom_template_path" && !defined $existing_config->$var ) {
109        $def = $install_directory;
110        $def .= "/" unless $def =~ m|/$|;
111        $def .= "custom-templates";
112    }
113
114    # Here is where we actually ask the questions.
115    unless ( $skip_config ) {
116        if ( $type eq "y_n" ) {
117            # may be stored as true/false integer value
118            if ( $def =~ /^\d+$/ ) {
119                $def = $def ? "y" : "n";
120            }
121            $val = Module::Build->y_n("\n$qu ", $def);
122        } else {
123            $val = Module::Build->prompt("\n$qu ", $def);
124        }
125    }
126
127    # Store install_directory so we can use it to suggest template paths.
128    $install_directory = $val if $var eq "install_directory";
129
130    # Make sure that script_url ends in a /
131    if ( $var eq "script_url" and $val !~ /\/$/ ) {
132        $val .= "/";
133    }
134
135    push @answers, { question => $qu,
136                     variable => $var,
137                     value    => $val };
138}
139
140# Now deal with the geo stuff.
141my $geo_handler;
142my $geo_handler_qu = "Distance calculation methods available are:"
143                   . "\n  1) British National Grid"
144                   . "\n  2) Irish National Grid"
145                   . "\n  3) UTM ellipsoid"
146                   . "\nWhich would you like to use?";
147
148if ( $skip_config ) {
149    # We default to GB National Grid for historical reasons.
150    $geo_handler = $existing_config->geo_handler;
151} else {
152    my $choice;
153    until ( $choice ) {
154        my $def = $existing_config->geo_handler;
155        $choice = Module::Build->prompt("\n".$geo_handler_qu, $def);
156        $choice =~ s/^\s*//;
157        $choice =~ s/\s*$//;
158        unless ( $choice eq "1" or $choice eq "2" or $choice eq "3" ) {
159            undef $choice;
160        }
161    }
162    $geo_handler = $choice;
163}
164
165$geo_handler_qu =~ s/\n//gs;
166push @answers, {
167                 question => $geo_handler_qu,
168                 variable => "geo_handler",
169                 value    => $geo_handler,
170               };
171
172if ( $geo_handler eq "3" ) {
173    my $qu = $existing_config->ellipsoid__qu;
174    my $ellipsoid;
175    if ( $skip_config ) {
176        $ellipsoid = $existing_config->ellipsoid;
177    } else {
178        my $def = $existing_config->ellipsoid;
179        $ellipsoid = Module::Build->prompt("\n".$qu, $def);
180        $ellipsoid =~ s/^\s*//;
181        $ellipsoid =~ s/\s*$//;
182    }
183    push @answers, {
184                     question => $qu,
185                     variable => "ellipsoid",
186                     value    => $ellipsoid,
187                   };
188}
189
190# Create a user-friendly config file from answers to prompts.
191open FILE, ">wiki.conf" or die "Can't open wiki.conf for writing: $!";
192foreach my $ans (@answers) {
193    print FILE "# $ans->{question}\n";
194    print FILE "$ans->{variable} = $ans->{value}\n\n";
195}
196close FILE or die "Can't close wiki.conf: $!";
197
198#####
199##### When updating the prereqs PLEASE REMEMBER to update PREREQUISITES.
200#####
201
202# Create the build object.
203my $build = OpenGuides::Build->new(
204    dist_name => "OpenGuides",
205    dist_version_from => "wiki.cgi",
206    license => "perl",
207    requires => {
208        'Algorithm::Diff'                 => '0.13', # for sdiff
209        'CGI'                             => '2.92', # avoid escapeHTML bug
210        'CGI::Carp'                       => 0,
211        'CGI::Cookie'                     => 0,
212        'CGI::Wiki'                       => '0.54',
213        'CGI::Wiki::Formatter::UseMod'    => '0.16', # macros
214        'CGI::Wiki::Plugin::Categoriser'  => 0,
215        'CGI::Wiki::Plugin::Diff'         => '0.07', # earlier buggy
216        'CGI::Wiki::Plugin::Locator::Grid'=> '0.02', # cope with sqlite 3
217        'CGI::Wiki::Plugin::RSS::ModWiki' => '0.06', # for fancy stuff
218        'CGI::Wiki::Plugin::RSS::Reader'  => '1.3',  # earlier versions don't support RSS 2.0
219        'Class::Accessor'                 => 0,
220        'Config::Tiny'                    => 0,
221        'Data::Dumper'                    => 0,
222        $drivers{$dbtype}                 => 0,
223        'File::Spec::Functions'           => 0,
224        'File::Temp'                      => 0,
225        'Geography::NationalGrid'         => 0,
226        'LWP::Simple'                     => 0,
227        'Parse::RecDescent'               => 0,
228        'Search::InvertedIndex'           => 0,
229        'Template'                        => 0,
230        'Test::MockObject'                => '0.07', # earlier doesn't use 'mock'
231        'Time::Piece'                     => 0,
232        'URI::Escape'                     => 0,
233        'XML::RSS'                        => 0,
234        },
235    build_requires => {
236        'Module::Build' => '0.18', # earlier doesn't install script files
237        },
238    recommends => {
239        'DBD::SQLite'         => 0, # for testing
240        'Test::HTML::Content' => 0, # for testing, oddly enough
241    },
242    dynamic_config => 1,
243    create_makefile_pl => "passthrough"
244);
245
246$build->add_to_cleanup( "t/indexes/" );
247$build->add_to_cleanup( "t/node.db" );
248
249# Tell OpenGuides::Build which additional scripts and templates to install.
250$build->{config}{__extra_scripts}     = 
251                      [ "wiki.conf", "preferences.cgi", "supersearch.cgi",
252                        "newpage.cgi" ];
253$build->{config}{__templates}         = [
254                      "backlink_results.tt",
255                      "banner.tt",
256                      "delete_confirm.tt",
257                      "delete_done.tt",
258                      "delete_password_wrong.tt",
259                      "differences.tt",
260                      "display_metadata.tt",
261                      "edit_conflict.tt",
262                      "edit_form.tt",
263                      "error.tt",
264                      "footer.tt",
265                      "header.tt",
266                      "home_node.tt",
267                      "navbar.tt",
268                      "newpage.tt",
269                      "node.tt",
270                      "node_history.tt",
271                      "openguides_information_boxes.tt",
272                      "preferences.tt",
273                      "rdf_index.tt",
274                      "recent_changes.tt",
275                      "search_results.tt",
276                      "site_index.tt",
277                      "supersearch.tt",
278                      "userstats.tt",
279                      "wanted_pages.tt"
280    ];
281
282# Finally write the build script.
283$build->create_build_script;
Note: See TracBrowser for help on using the repository browser.