source: trunk/Build.PL @ 942

Last change on this file since 942 was 942, checked in by kake, 15 years ago

Split out "modules" from navbar.tt into separate templates - navbar_*.tt - to make it easier for people to change their order in a custom template.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.0 KB
Line 
1use strict;
2use lib "lib";
3use Data::Dumper;
4
5eval {
6    require Config::Tiny;
7    # OpenGuides::Build and OpenGuides::Config both use Config::Tiny.
8    require OpenGuides::Build;
9    require OpenGuides::Config;
10};
11
12die "Config::Tiny is required to configure this application.\n" if $@;
13
14print <<EOF;
15
16Beginning install process... if you already have an OpenGuides
17configuration file and you don't want to have to type in all your config
18parameters over again, abort this process now, copy that file to this
19directory, and start again.
20
21EOF
22
23my $continue = Module::Build->y_n("Continue with install?", "y");
24exit 0 unless $continue;
25
26my $existing_config_file = 'wiki.conf';
27my $existing_config;
28
29if (-f $existing_config_file) {
30    $existing_config = OpenGuides::Config->new(file => $existing_config_file);
31} else {
32    print <<EOF;
33No existing configuration file found; assuming this is a new install.
34See the message above if this isn't correct.
35
36EOF
37    $existing_config = OpenGuides::Config->new();
38}
39
40my %yn_vars = map { $_ => 1 }
41   qw(use_plucene enable_page_deletion navbar_on_home_page backlinks_in_title
42      moderation_requires_password enable_node_image enable_common_categories
43      enable_common_locales recent_changes_on_home_page);
44
45my $skip_config = Module::Build->y_n("Skip OpenGuides configuration?", "n");
46if ( $skip_config ) {
47    print <<EOF;
48===========================================================================
49Skipping OpenGuides configuration - any configuration options previously
50saved will be used instead.  You may tweak your configuration now by
51editing the 'wiki.conf' file produced by this script.
52===========================================================================
53EOF
54}
55
56my @answers;
57
58# It is an ancient Configurer, and he chooseth one of three.
59my $dbtype;
60my $dbtype_qu = $existing_config->dbtype__qu;
61if ( $skip_config ) {
62    $dbtype = $existing_config->dbtype;
63} else {
64    until ( $dbtype ) {
65        my $def = $existing_config->dbtype;
66        $dbtype = Module::Build->prompt("\n$dbtype_qu", $def);
67        $dbtype = lc($dbtype);
68        $dbtype =~ s/^\s*//;
69        $dbtype =~ s/\s*$//;
70        unless ( $dbtype eq "postgres" or $dbtype eq "mysql"
71                 or $dbtype eq "sqlite" ) {
72            undef $dbtype;
73        }
74    }
75}
76
77# Check they have the relevant DBD driver installed.
78my %drivers = ( postgres => "DBD::Pg",
79                mysql    => "DBD::mysql",
80                sqlite   => "DBD::SQLite",
81              );
82eval "require $drivers{$dbtype}";
83warn "$drivers{$dbtype} is needed to run a $dbtype database" if $@;
84
85push @answers, { question => $dbtype_qu,
86                 variable => "dbtype",
87                 value    => $dbtype };
88
89my $install_directory; # used to suggest template paths
90my $use_plucene = 1; # keep track of this so we know what to put in prereqs
91my $centre_lat = ''; # contains centre lat derived from Google Maps URL
92foreach my $var ( qw(
93   dbname dbuser dbpass dbhost script_name
94   install_directory template_path custom_template_path script_url
95   custom_lib_path use_plucene indexing_directory enable_page_deletion
96   admin_pass stylesheet_url site_name navbar_on_home_page
97   recent_changes_on_home_page home_name
98   site_desc default_city default_country contact_email default_language
99   formatting_rules_node backlinks_in_title gmaps_api_key centre_long
100   centre_lat default_gmaps_zoom default_gmaps_search_zoom force_wgs84
101   licence_name licence_url licence_info_url moderation_requires_password
102   enable_node_image enable_common_categories enable_common_locales
103  ) ) {
104    my $q_method = $var . "__qu";
105    my $qu  = $existing_config->$q_method;
106    my $type = $yn_vars{$var} ? "y_n" : "";
107    my $def = $existing_config->$var;
108    my $val = $def;
109
110    # Override dbname question for SQLite only.
111    if ( $dbtype eq "sqlite" and $var eq "dbname" ) {
112        $qu = "what's the full filename of the SQLite database this site runs on?";
113    }
114
115    if ( $dbtype eq "sqlite" and
116         ( $var eq "dbuser" or $var eq "dbpass" or $var eq "dbhost" )
117       ) {
118        print "$var not relevant for SQLite... skipping...\n";
119        push @answers, { question => $qu,
120                            variable => $var,
121                         value    => "not-used" };
122        next;
123    }
124
125    # We don't ask this for new installs as Search::InvertedIndex is
126    # deprecated
127    if ( $var eq "use_plucene" and $existing_config->$var == 1) {
128        print "Skipping question about plucene\n";
129        push @answers, { question => $qu,
130                         variable => $var,
131                         value => 1 };
132        next;
133    }
134
135    # Make sensible suggestions for template paths if we don't already
136    # have them stored.  Not really a default, but a useful hint/shortcut.
137    if ( $var eq "template_path" && !defined $existing_config->$var ) {
138        $def = $install_directory;
139        $def .= "/" unless $def =~ m|/$|;
140        $def .= "templates";
141    }
142    if ( $var eq "custom_template_path" && !defined $existing_config->$var ) {
143        $def = $install_directory;
144        $def .= "/" unless $def =~ m|/$|;
145        $def .= "custom-templates";
146    }
147
148    # If a Google Maps URL was provided last time we know the centre_lat
149    if ( $var eq 'centre_lat' && $centre_lat ) {
150        $val = $centre_lat;
151        next;
152    }   
153
154    # Here is where we actually ask the questions.
155    unless ( $skip_config ) {
156        if ( $type eq "y_n" ) {
157            # may be stored as true/false integer value
158            if ( $def =~ /^\d+$/ ) {
159                $def = $def ? "y" : "n";
160            }
161            $val = Module::Build->y_n("\n$qu ", $def);
162        } else {
163            $val = Module::Build->prompt("\n$qu ", $def);
164        }
165    }
166
167    # Allow user to use a Google Maps URL rather than enter lat/long by hand.
168    # We assume centre_long is being asked for first; ensure so in big list above.
169    if ( $var eq 'centre_long' ) {
170        if ( $val =~ /ll=([-\d.]+),([-\d.]+)/ ) {
171            print "Got a Google Maps URL with centre long,lat: [$1, $2]\n";
172            $val = $1;
173            $centre_lat = $2;
174        }
175    }
176
177    # Store install_directory so we can use it to suggest template paths.
178    $install_directory = $val if $var eq "install_directory";
179
180    # Keep track of chosen search method so we know what to put in prereqs.
181    # From Module::Build docs: ->y_n returns a Perl boolean true or false.
182    $use_plucene = 1 if $var eq "use_plucene" and $val;
183
184    # Make sure that script_url ends in a /
185    if ( $var eq "script_url" and $val !~ /\/$/ ) {
186        $val .= "/";
187    }
188
189    push @answers, { question => $qu,
190                     variable => $var,
191                     value    => $val };
192}
193
194# Now deal with the geo stuff.
195my $geo_handler;
196my $geo_handler_qu = "Distance calculation methods available are:"
197                   . "\n  1) British National Grid"
198                   . "\n  2) Irish National Grid"
199                   . "\n  3) UTM ellipsoid"
200                   . "\nWhich would you like to use?";
201
202if ( $skip_config ) {
203    # We default to GB National Grid for historical reasons.
204    $geo_handler = $existing_config->geo_handler;
205} else {
206    my $choice;
207    until ( $choice ) {
208        my $def = $existing_config->geo_handler;
209        $choice = Module::Build->prompt("\n".$geo_handler_qu, $def);
210        $choice =~ s/^\s*//;
211        $choice =~ s/\s*$//;
212        unless ( $choice eq "1" or $choice eq "2" or $choice eq "3" ) {
213            undef $choice;
214        }
215    }
216    $geo_handler = $choice;
217}
218
219$geo_handler_qu =~ s/\n//gs;
220push @answers, {
221                 question => $geo_handler_qu,
222                 variable => "geo_handler",
223                 value    => $geo_handler,
224               };
225
226if ( $geo_handler eq "3" ) {
227    my $qu = $existing_config->ellipsoid__qu;
228    my $ellipsoid;
229    if ( $skip_config ) {
230        $ellipsoid = $existing_config->ellipsoid;
231    } else {
232        my $def = $existing_config->ellipsoid;
233        $ellipsoid = Module::Build->prompt("\n".$qu, $def);
234        $ellipsoid =~ s/^\s*//;
235        $ellipsoid =~ s/\s*$//;
236    }
237    push @answers, {
238                     question => $qu,
239                     variable => "ellipsoid",
240                     value    => $ellipsoid,
241                   };
242}
243
244# Create a user-friendly config file from answers to prompts.
245open FILE, ">wiki.conf" or die "Can't open wiki.conf for writing: $!";
246foreach my $ans (@answers) {
247    print FILE "# $ans->{question}\n";
248    print FILE "$ans->{variable} = $ans->{value}\n\n";
249}
250close FILE or die "Can't close wiki.conf: $!";
251
252#####
253##### When updating the prereqs PLEASE REMEMBER to update PREREQUISITES.
254#####
255
256# We currently only support Plucene for new installs, but may support
257# others in future
258my $search_module = $use_plucene ? "Plucene" : "Search::InvertedIndex";
259
260# Create the build object.
261my $build = OpenGuides::Build->new(
262    sign => 1,
263    dist_name => "OpenGuides",
264    dist_version_from => "wiki.cgi",
265    license => "perl",
266    requires => {
267        'Algorithm::Diff'                     => '0.13',  # for sdiff
268        'CGI'                                 => '2.92',  # avoid escapeHTML bug
269        'CGI::Carp'                           => 0,
270        'CGI::Cookie'                         => 0,
271        'Wiki::Toolkit'                       => '0.73',
272        'Wiki::Toolkit::Feed::Atom'           => 0,
273        'Wiki::Toolkit::Feed::RSS'            => 0,
274        'Wiki::Toolkit::Formatter::UseMod'    => 0,
275        'Wiki::Toolkit::Plugin::Categoriser'  => 0,
276        'Wiki::Toolkit::Plugin::Diff'         => 0,
277        'Wiki::Toolkit::Plugin::Locator::Grid'=> 0,
278        'Wiki::Toolkit::Plugin::RSS::Reader'  => 0,
279        'Class::Accessor'                     => 0,
280        'Config::Tiny'                        => 0,
281        'Data::Dumper'                        => 0,
282        $drivers{$dbtype}                     => 0,
283        'File::Spec::Functions'               => 0,
284        'File::Temp'                          => 0,
285        'Geography::NationalGrid'             => 0,
286        'LWP::Simple'                         => 0,
287        'Parse::RecDescent'                   => 0,
288        $search_module                        => 0,
289        'POSIX'                               => 0,
290        'Template'                            => '2.15', # for hash.delete and string.remove vmethods
291        'Test::MockObject'                    => '0.07', # earlier doesn't use 'mock'
292        'Time::Piece'                         => 0,
293        'URI::Escape'                         => 0,
294        'XML::RSS'                            => 0,
295        },
296    build_requires => {
297        'Module::Build' => '0.18', # earlier doesn't install script files
298        },
299    recommends => {
300        'DBD::SQLite'         => 0, # for testing
301        'Test::HTML::Content' => 0, # for testing, oddly enough
302        'Wiki::Toolkit::Plugin::Ping' => 0, # for pinging external services
303        'Geo::HelmertTransform'  => 0,      # for correct WGS84 lat/long
304                                            # when using grid systems
305
306    },
307    dynamic_config => 1,
308    create_makefile_pl => "passthrough"
309);
310
311$build->add_to_cleanup( "t/indexes/" );
312$build->add_to_cleanup( "t/node.db" );
313
314# Tell OpenGuides::Build which additional scripts and templates to install.
315$build->{config}{__extra_scripts}     = 
316                      [ "wiki.conf", "preferences.cgi", "search.cgi",
317                        "newpage.cgi" ];
318$build->{config}{__templates}         = [
319                      "admin_home.tt",
320                      "backlink_results.tt",
321                      "banner.tt",
322                      "common_categories.tt",
323                      "common_locales.tt",
324                      "delete_confirm.tt",
325                      "delete_done.tt",
326                      "delete_password_wrong.tt",
327                      "differences.tt",
328                      "display_metadata.tt",
329                      "edit_form.tt",
330                      "error.tt",
331                      "footer.tt",
332                      "header.tt",
333                      "home_node.tt",
334                      "map_index.tt",
335                      "missing_metadata.tt",
336                      "moderate_confirm.tt",
337                      "moderate_password_wrong.tt",
338                      "navbar.tt",
339                      "navbar_help.tt",
340                      "navbar_home_link.tt",
341                      "navbar_options.tt",
342                      "navbar_revision_info.tt",
343                      "navbar_search.tt",
344                      "navbar_this_page.tt",
345                      "navbar_tools.tt",
346                      "needing_moderation.tt",
347                      "newpage.tt",
348                      "node.tt",
349                      "node_history.tt",
350                      "node_image_fields.tt",
351                      "node_photo_notes.tt",
352                      "openguides_information_boxes.tt",
353                      "preferences.tt",
354                      "rdf_index.tt",
355                      "recent_changes.tt",
356                      "search_results.tt",
357                      "site_index.tt",
358                      "search.tt",
359                      "userstats.tt",
360                      "wanted_pages.tt"
361    ];
362
363# Finally write the build script.
364$build->create_build_script;
Note: See TracBrowser for help on using the repository browser.