source: trunk/Build.PL @ 769

Last change on this file since 769 was 769, checked in by Dominic Hargreaves, 16 years ago

Revert changes using CGI::Wiki::Plugin::Atom pending CGI::Wiki/Wiki::Toolkit refactoring.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 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}";
65warn "$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
72my $use_plucene; # keep track of this so we know what to put in prereqs
73foreach my $var ( qw(
74   dbname dbuser dbpass dbhost script_name
75   install_directory template_path custom_template_path script_url
76   custom_lib_path use_plucene indexing_directory enable_page_deletion
77   admin_pass stylesheet_url site_name navbar_on_home_page home_name
78   site_desc default_city default_country contact_email default_language
79   formatting_rules_node backlinks_in_title gmaps_api_key centre_long
80   centre_lat default_gmaps_zoom default_gmaps_search_zoom force_wgs84
81  ) ) {
82    my $q_method = $var . "__qu";
83    my $qu  = $existing_config->$q_method;
84    my $type = $yn_vars{$var} ? "y_n" : "";
85    my $def = $existing_config->$var;
86    my $val = $def;
87
88    # Override dbname question for SQLite only.
89    if ( $dbtype eq "sqlite" and $var eq "dbname" ) {
90        $qu = "what's the full filename of the SQLite database this site runs on?";
91    }
92
93    if ( $dbtype eq "sqlite" and
94         ( $var eq "dbuser" or $var eq "dbpass" or $var eq "dbhost" )
95       ) {
96        print "$var not relevant for SQLite... skipping...\n";
97        push @answers, { question => $qu,
98                            variable => $var,
99                         value    => "not-used" };
100        next;
101    }
102
103    # Make sensible suggestions for template paths if we don't already
104    # have them stored.  Not really a default, but a useful hint/shortcut.
105    if ( $var eq "template_path" && !defined $existing_config->$var ) {
106        $def = $install_directory;
107        $def .= "/" unless $def =~ m|/$|;
108        $def .= "templates";
109    }
110    if ( $var eq "custom_template_path" && !defined $existing_config->$var ) {
111        $def = $install_directory;
112        $def .= "/" unless $def =~ m|/$|;
113        $def .= "custom-templates";
114    }
115
116    # Here is where we actually ask the questions.
117    unless ( $skip_config ) {
118        if ( $type eq "y_n" ) {
119            # may be stored as true/false integer value
120            if ( $def =~ /^\d+$/ ) {
121                $def = $def ? "y" : "n";
122            }
123            $val = Module::Build->y_n("\n$qu ", $def);
124        } else {
125            $val = Module::Build->prompt("\n$qu ", $def);
126        }
127    }
128
129    # Store install_directory so we can use it to suggest template paths.
130    $install_directory = $val if $var eq "install_directory";
131
132    # Keep track of chosen search method so we know what to put in prereqs.
133    # From Module::Build docs: ->y_n returns a Perl boolean true or false.
134    $use_plucene = 1 if $var eq "use_plucene" and $val;
135
136    # Make sure that script_url ends in a /
137    if ( $var eq "script_url" and $val !~ /\/$/ ) {
138        $val .= "/";
139    }
140
141    push @answers, { question => $qu,
142                     variable => $var,
143                     value    => $val };
144}
145
146# Now deal with the geo stuff.
147my $geo_handler;
148my $geo_handler_qu = "Distance calculation methods available are:"
149                   . "\n  1) British National Grid"
150                   . "\n  2) Irish National Grid"
151                   . "\n  3) UTM ellipsoid"
152                   . "\nWhich would you like to use?";
153
154if ( $skip_config ) {
155    # We default to GB National Grid for historical reasons.
156    $geo_handler = $existing_config->geo_handler;
157} else {
158    my $choice;
159    until ( $choice ) {
160        my $def = $existing_config->geo_handler;
161        $choice = Module::Build->prompt("\n".$geo_handler_qu, $def);
162        $choice =~ s/^\s*//;
163        $choice =~ s/\s*$//;
164        unless ( $choice eq "1" or $choice eq "2" or $choice eq "3" ) {
165            undef $choice;
166        }
167    }
168    $geo_handler = $choice;
169}
170
171$geo_handler_qu =~ s/\n//gs;
172push @answers, {
173                 question => $geo_handler_qu,
174                 variable => "geo_handler",
175                 value    => $geo_handler,
176               };
177
178if ( $geo_handler eq "3" ) {
179    my $qu = $existing_config->ellipsoid__qu;
180    my $ellipsoid;
181    if ( $skip_config ) {
182        $ellipsoid = $existing_config->ellipsoid;
183    } else {
184        my $def = $existing_config->ellipsoid;
185        $ellipsoid = Module::Build->prompt("\n".$qu, $def);
186        $ellipsoid =~ s/^\s*//;
187        $ellipsoid =~ s/\s*$//;
188    }
189    push @answers, {
190                     question => $qu,
191                     variable => "ellipsoid",
192                     value    => $ellipsoid,
193                   };
194}
195
196# Create a user-friendly config file from answers to prompts.
197open FILE, ">wiki.conf" or die "Can't open wiki.conf for writing: $!";
198foreach my $ans (@answers) {
199    print FILE "# $ans->{question}\n";
200    print FILE "$ans->{variable} = $ans->{value}\n\n";
201}
202close FILE or die "Can't close wiki.conf: $!";
203
204#####
205##### When updating the prereqs PLEASE REMEMBER to update PREREQUISITES.
206#####
207
208my $search_module = $use_plucene ? "Plucene" : "Search::InvertedIndex";
209
210# Create the build object.
211my $build = OpenGuides::Build->new(
212    sign => 1,
213    dist_name => "OpenGuides",
214    dist_version_from => "wiki.cgi",
215    license => "perl",
216    requires => {
217        'Algorithm::Diff'                 => '0.13',  # for sdiff
218        'CGI'                             => '2.92',  # avoid escapeHTML bug
219        'CGI::Carp'                       => 0,
220        'CGI::Cookie'                     => 0,
221        'CGI::Wiki'                       => '0.62',  # fixed delete version
222        'CGI::Wiki::Formatter::UseMod'    => '0.16',  # macros
223        'CGI::Wiki::Plugin::Categoriser'  => 0,
224        'CGI::Wiki::Plugin::Diff'         => '0.08',  # earlier buggy
225        'CGI::Wiki::Plugin::Locator::Grid'=> '0.02',  # cope with sqlite 3
226        'CGI::Wiki::Plugin::RSS::ModWiki' => '0.09',  # fixes date formatting bug
227        'CGI::Wiki::Plugin::RSS::Reader'  => '1.3',   # earlier versions don't support RSS 2.0
228        'Class::Accessor'                 => 0,
229        'Config::Tiny'                    => 0,
230        'Data::Dumper'                    => 0,
231        $drivers{$dbtype}                 => 0,
232        'File::Spec::Functions'           => 0,
233        'File::Temp'                      => 0,
234        'Geography::NationalGrid'         => 0,
235        'LWP::Simple'                     => 0,
236        'Parse::RecDescent'               => 0,
237        $search_module                    => 0,
238        'POSIX'                           => 0,
239        'Template'                        => 0,
240        'Test::MockObject'                => '0.07', # earlier doesn't use 'mock'
241        'Time::Piece'                     => 0,
242        'URI::Escape'                     => 0,
243        'XML::RSS'                        => 0,
244        },
245    build_requires => {
246        'Module::Build' => '0.18', # earlier doesn't install script files
247        },
248    recommends => {
249        'DBD::SQLite'         => 0, # for testing
250        'Test::HTML::Content' => 0, # for testing, oddly enough
251    },
252    dynamic_config => 1,
253    create_makefile_pl => "passthrough"
254);
255
256$build->add_to_cleanup( "t/indexes/" );
257$build->add_to_cleanup( "t/node.db" );
258
259# Tell OpenGuides::Build which additional scripts and templates to install.
260$build->{config}{__extra_scripts}     = 
261                      [ "wiki.conf", "preferences.cgi", "search.cgi",
262                        "newpage.cgi" ];
263$build->{config}{__templates}         = [
264                      "backlink_results.tt",
265                      "banner.tt",
266                      "delete_confirm.tt",
267                      "delete_done.tt",
268                      "delete_password_wrong.tt",
269                      "differences.tt",
270                      "display_metadata.tt",
271                      "edit_conflict.tt",
272                      "edit_form.tt",
273                      "error.tt",
274                      "footer.tt",
275                      "header.tt",
276                      "home_node.tt",
277                      "map_index.tt",
278                      "navbar.tt",
279                      "newpage.tt",
280                      "node.tt",
281                      "node_history.tt",
282                      "openguides_information_boxes.tt",
283                      "preferences.tt",
284                      "rdf_index.tt",
285                      "recent_changes.tt",
286                      "search_results.tt",
287                      "site_index.tt",
288                      "search.tt",
289                      "userstats.tt",
290                      "wanted_pages.tt"
291    ];
292
293# Finally write the build script.
294$build->create_build_script;
Note: See TracBrowser for help on using the repository browser.