source: trunk/Build.PL @ 716

Last change on this file since 716 was 705, checked in by Earle Martin, 16 years ago

Bump C::W::P::RSS::ModWiki to 0.081 (there was a bugfix).

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