Merge branch 'master' of git.evergreen-ils.org:Evergreen into template-toolkit-opac...
authorBill Erickson <berick@esilibrary.com>
Sun, 11 Sep 2011 22:15:28 +0000 (18:15 -0400)
committerBill Erickson <berick@esilibrary.com>
Sun, 11 Sep 2011 22:15:28 +0000 (18:15 -0400)
Open-ILS/src/extras/Makefile.install
Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/lib/OpenILS/Utils/Penalty.pm
Open-ILS/src/sql/Pg/000.english.pg91.fts-config.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/100.circ_matrix.sql
Open-ILS/src/sql/Pg/create_database_9_1.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/0620.schema.penalty_fixes.sql [new file with mode: 0644]
Open-ILS/src/support-scripts/eg_db_config.pl
Open-ILS/xul/staff_client/chrome/content/util/print.js
README

index bb69740..0812736 100644 (file)
@@ -4,7 +4,7 @@
 #
 # Makefile to install prerequisites for OpenSRF and Evergreen
 #
-# Currently supports Debian (squeeze), Ubuntu (lucid), and Fedora (14).
+# Currently supports Debian (squeeze), Ubuntu (lucid), and Fedora (15).
 # Working towards support of CentOS 5 / RHEL 5.
 # Installs Perl prereqs, libjs with Perl wrapper, libdbi, libdbi-drivers, and libyaz
 #
@@ -13,7 +13,7 @@
 #      - or -
 #      make -f Makefile.install ubuntu-lucid
 #      - or -
-#      make -f Makefile.install fedora14
+#      make -f Makefile.install fedora15
 #      - or -
 #      make -f Makefile.install centos
 #      - or -
@@ -180,7 +180,7 @@ FEDORA_RPMS = \
        perl-Text-CSV \
        perl-Text-CSV_XS \
        perl-XML-Writer \
-       postgresql90-devel \
+       postgresql-devel \
        readline-devel \
        tcp_wrappers-devel \
        wget \
@@ -272,8 +272,7 @@ centos: install_centos_pgsql centos_like
 rhel: install_redhat_pgsql centos_like
 centos_like: install_centos_rpms install_yaz install_cpan_marc install install_centos_perl create_ld_local install_cpan_safe install_cpan_force
 
-fedora14: install_fedora_rpms install_cpan install_cpan_fedora install_cpan_marc install_js_sm install_cpan_force
-fedora15: fedora14
+fedora15: install_fedora_rpms install_cpan install_cpan_fedora install_cpan_marc install_js_sm install_cpan_force
 
 debian-squeeze: squeeze generic_debian
 squeeze: install_pgsql_client_debs_90  install_extra_debs_squeeze
@@ -309,7 +308,7 @@ install_cpan_force:
 install_cpan_safe: 
        for m in $(CPAN_MODULES_SAFE); do perl -MCPAN -e "install \"$$m\";"; done
 
-# Install the CPAN modules for Fedora 13
+# Install the CPAN modules for Fedora
 install_cpan_fedora: 
        for m in $(FEDORA_CPAN); do \
                echo "force install $$m" | perl -MCPAN -e shell;\
@@ -335,8 +334,14 @@ install_libjs:
        mkdir -p $(JS_INSTALL_PREFIX)/include/js/
        cp js/src/*.h $(JS_INSTALL_PREFIX)/include/js/
        cp js/src/*.tbl $(JS_INSTALL_PREFIX)/include/js/
-       cp js/src/Linux_All_DBG.OBJ/*.so $(JS_INSTALL_PREFIX)/lib/
-       cp js/src/Linux_All_DBG.OBJ/*.a $(JS_INSTALL_PREFIX)/lib/
+       if [ ! -z $(FEDORA_64) ]; then \
+               cp js/src/Linux_All_DBG.OBJ/*.so $(JS_INSTALL_PREFIX)/lib64/ && \
+               cp js/src/Linux_All_DBG.OBJ/*.a $(JS_INSTALL_PREFIX)/lib64/; \
+       else \
+               cp js/src/Linux_All_DBG.OBJ/*.so $(JS_INSTALL_PREFIX)/lib/ && \
+               cp js/src/Linux_All_DBG.OBJ/*.a $(JS_INSTALL_PREFIX)/lib/; \
+       fi;
+       ldconfig
 
 install_spidermonkey:
        if [ ! -f $(LIBJS_PERL).tar.gz ]; then wget $(LIBJS_PERL_URL); fi;
@@ -421,7 +426,7 @@ install_extra_encode:
 
 # ------------------------------------------------------------------
 
-# FEDORA 13
+# FEDORA
 install_fedora_rpms:
        yum -y update
        yum -y install $(FEDORA_RPMS)
index c6eef0e..4710d81 100644 (file)
@@ -2916,7 +2916,7 @@ sub new_flesh_user {
                         {stop_date => undef},
                         {stop_date => {'>' => 'now'}}
                     ],
-                    org_unit => $U->get_org_ancestors($e->requestor->ws_ou)
+                    org_unit => $U->get_org_full_path($e->requestor->ws_ou)
                 },
                 {   flesh => 1,
                     flesh_fields => {ausp => ['standing_penalty']}
index f259345..94c561c 100644 (file)
@@ -109,7 +109,7 @@ sub retrieve_usr_penalties {
     return $e->search_actor_user_standing_penalty([
         {
             usr => $user_id, 
-            org_unit => $U->get_org_ancestors($context_org),
+            org_unit => $U->get_org_full_path($context_org),
             '-or' => [
                 {stop_date => undef},
                 {stop_date => {'>' => 'now'}}
diff --git a/Open-ILS/src/sql/Pg/000.english.pg91.fts-config.sql b/Open-ILS/src/sql/Pg/000.english.pg91.fts-config.sql
new file mode 100644 (file)
index 0000000..7ddce06
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2004-2008  Georgia Public Library Service
+ * Copyright (C) 2008  Equinox Software, Inc., Laurentian University
+ * Mike Rylander <miker@esilibrary.com>
+ * Dan Scott <dscott@laurentian.ca>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+BEGIN;
+
+SET search_path = public, pg_catalog;
+
+CREATE OR REPLACE FUNCTION oils_tsearch2 () RETURNS TRIGGER AS $$
+BEGIN
+       NEW.index_vector = to_tsvector((TG_ARGV[0])::regconfig, NEW.value);
+       RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+DROP TEXT SEARCH DICTIONARY IF EXISTS english_nostop CASCADE;
+
+CREATE TEXT SEARCH DICTIONARY english_nostop (TEMPLATE=pg_catalog.snowball, language='english');
+COMMENT ON TEXT SEARCH DICTIONARY english_nostop IS 'English snowball stemmer with no stopwords for ASCII words only.';
+
+CREATE TEXT SEARCH CONFIGURATION title ( COPY = pg_catalog.english );
+ALTER TEXT SEARCH CONFIGURATION title ALTER MAPPING FOR word, hword, hword_part WITH pg_catalog.simple;
+ALTER TEXT SEARCH CONFIGURATION title ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH english_nostop;
+CREATE TEXT SEARCH CONFIGURATION author ( COPY = title );
+CREATE TEXT SEARCH CONFIGURATION subject ( COPY = title );
+CREATE TEXT SEARCH CONFIGURATION keyword ( COPY = title );
+CREATE TEXT SEARCH CONFIGURATION identifier ( COPY = title );
+CREATE TEXT SEARCH CONFIGURATION series ( COPY = title );
+CREATE TEXT SEARCH CONFIGURATION "default" ( COPY = title );
+
+COMMIT;
index eb0c6d0..13427af 100644 (file)
@@ -86,7 +86,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0619', :eg_version); -- tsbere/phasefx
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0620', :eg_version); -- tsbere/miker
 
 CREATE TABLE config.bib_source (
        id              SERIAL  PRIMARY KEY,
index 79fc705..5cf5f9b 100644 (file)
@@ -465,8 +465,8 @@ BEGIN
         RETURN NEXT result;
     END IF;
 
-    -- Apparently....use the circ matchpoint org unit to determine what org units are valid.
-    SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( circ_matchpoint.org_unit );
+    -- Use Circ OU for penalties and such
+    SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( circ_ou );
 
     IF renewal THEN
         penalty_type = '%RENEW%';
diff --git a/Open-ILS/src/sql/Pg/create_database_9_1.sql b/Open-ILS/src/sql/Pg/create_database_9_1.sql
new file mode 100644 (file)
index 0000000..97739f9
--- /dev/null
@@ -0,0 +1,23 @@
+-- This file is intended to be called by eg_db_config.pl
+
+-- If manually calling:
+-- Connect to the postgres database initially
+-- Specify the database to create as -vdb_name=DATABASE
+-- Specify the postgres contrib directory as -vcontrib_dir=CONTRIBDIR
+-- You can get the contrib directory using pg_config --sharedir and adding a /contrib to it
+
+-- NOTE: This file does not do transactions
+-- This is intentional. Please do not wrap in BEGIN/COMMIT.
+DROP DATABASE IF EXISTS :db_name;
+
+CREATE DATABASE :db_name TEMPLATE template0 ENCODING 'UNICODE' LC_COLLATE 'C' LC_CTYPE 'C';
+
+\connect :db_name
+
+CREATE LANGUAGE plperl;
+CREATE LANGUAGE plperlu;
+
+CREATE EXTENSION tablefunc;
+CREATE EXTENSION tsearch2;
+CREATE EXTENSION xml2;
+CREATE EXTENSION hstore;
diff --git a/Open-ILS/src/sql/Pg/upgrade/0620.schema.penalty_fixes.sql b/Open-ILS/src/sql/Pg/upgrade/0620.schema.penalty_fixes.sql
new file mode 100644 (file)
index 0000000..d7b4a6d
--- /dev/null
@@ -0,0 +1,203 @@
+-- Evergreen DB patch 0620.schema.penalty_fixes.sql
+--
+--
+BEGIN;
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0620', :eg_version);
+
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.circ_matrix_test_result AS $func$
+DECLARE
+    user_object             actor.usr%ROWTYPE;
+    standing_penalty        config.standing_penalty%ROWTYPE;
+    item_object             asset.copy%ROWTYPE;
+    item_status_object      config.copy_status%ROWTYPE;
+    item_location_object    asset.copy_location%ROWTYPE;
+    result                  action.circ_matrix_test_result;
+    circ_test               action.found_circ_matrix_matchpoint;
+    circ_matchpoint         config.circ_matrix_matchpoint%ROWTYPE;
+    out_by_circ_mod         config.circ_matrix_circ_mod_test%ROWTYPE;
+    circ_mod_map            config.circ_matrix_circ_mod_test_map%ROWTYPE;
+    hold_ratio              action.hold_stats%ROWTYPE;
+    penalty_type            TEXT;
+    items_out               INT;
+    context_org_list        INT[];
+    done                    BOOL := FALSE;
+BEGIN
+    -- Assume success unless we hit a failure condition
+    result.success := TRUE;
+
+    -- Need user info to look up matchpoints
+    SELECT INTO user_object * FROM actor.usr WHERE id = match_user AND NOT deleted;
+
+    -- (Insta)Fail if we couldn't find the user
+    IF user_object.id IS NULL THEN
+        result.fail_part := 'no_user';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    -- Need item info to look up matchpoints
+    SELECT INTO item_object * FROM asset.copy WHERE id = match_item AND NOT deleted;
+
+    -- (Insta)Fail if we couldn't find the item 
+    IF item_object.id IS NULL THEN
+        result.fail_part := 'no_item';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    SELECT INTO circ_test * FROM action.find_circ_matrix_matchpoint(circ_ou, item_object, user_object, renewal);
+
+    circ_matchpoint             := circ_test.matchpoint;
+    result.matchpoint           := circ_matchpoint.id;
+    result.circulate            := circ_matchpoint.circulate;
+    result.duration_rule        := circ_matchpoint.duration_rule;
+    result.recurring_fine_rule  := circ_matchpoint.recurring_fine_rule;
+    result.max_fine_rule        := circ_matchpoint.max_fine_rule;
+    result.hard_due_date        := circ_matchpoint.hard_due_date;
+    result.renewals             := circ_matchpoint.renewals;
+    result.grace_period         := circ_matchpoint.grace_period;
+    result.buildrows            := circ_test.buildrows;
+
+    -- (Insta)Fail if we couldn't find a matchpoint
+    IF circ_test.success = false THEN
+        result.fail_part := 'no_matchpoint';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    -- All failures before this point are non-recoverable
+    -- Below this point are possibly overridable failures
+
+    -- Fail if the user is barred
+    IF user_object.barred IS TRUE THEN
+        result.fail_part := 'actor.usr.barred';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item can't circulate
+    IF item_object.circulate IS FALSE THEN
+        result.fail_part := 'asset.copy.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item isn't in a circulateable status on a non-renewal
+    IF NOT renewal AND item_object.status NOT IN ( 0, 7, 8 ) THEN 
+        result.fail_part := 'asset.copy.status';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    -- Alternately, fail if the item isn't checked out on a renewal
+    ELSIF renewal AND item_object.status <> 1 THEN
+        result.fail_part := 'asset.copy.status';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item can't circulate because of the shelving location
+    SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
+    IF item_location_object.circulate IS FALSE THEN
+        result.fail_part := 'asset.copy_location.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Use Circ OU for penalties and such
+    SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( circ_ou );
+
+    IF renewal THEN
+        penalty_type = '%RENEW%';
+    ELSE
+        penalty_type = '%CIRC%';
+    END IF;
+
+    FOR standing_penalty IN
+        SELECT  DISTINCT csp.*
+          FROM  actor.usr_standing_penalty usp
+                JOIN config.standing_penalty csp ON (csp.id = usp.standing_penalty)
+          WHERE usr = match_user
+                AND usp.org_unit IN ( SELECT * FROM unnest(context_org_list) )
+                AND (usp.stop_date IS NULL or usp.stop_date > NOW())
+                AND csp.block_list LIKE penalty_type LOOP
+
+        result.fail_part := standing_penalty.name;
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END LOOP;
+
+    -- Fail if the test is set to hard non-circulating
+    IF circ_matchpoint.circulate IS FALSE THEN
+        result.fail_part := 'config.circ_matrix_test.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the total copy-hold ratio is too low
+    IF circ_matchpoint.total_copy_hold_ratio IS NOT NULL THEN
+        SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+        IF hold_ratio.total_copy_ratio IS NOT NULL AND hold_ratio.total_copy_ratio < circ_matchpoint.total_copy_hold_ratio THEN
+            result.fail_part := 'config.circ_matrix_test.total_copy_hold_ratio';
+            result.success := FALSE;
+            done := TRUE;
+            RETURN NEXT result;
+        END IF;
+    END IF;
+
+    -- Fail if the available copy-hold ratio is too low
+    IF circ_matchpoint.available_copy_hold_ratio IS NOT NULL THEN
+        IF hold_ratio.hold_count IS NULL THEN
+            SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+        END IF;
+        IF hold_ratio.available_copy_ratio IS NOT NULL AND hold_ratio.available_copy_ratio < circ_matchpoint.available_copy_hold_ratio THEN
+            result.fail_part := 'config.circ_matrix_test.available_copy_hold_ratio';
+            result.success := FALSE;
+            done := TRUE;
+            RETURN NEXT result;
+        END IF;
+    END IF;
+
+    -- Fail if the user has too many items with specific circ_modifiers checked out
+    FOR out_by_circ_mod IN SELECT * FROM config.circ_matrix_circ_mod_test WHERE matchpoint = circ_matchpoint.id LOOP
+        SELECT  INTO items_out COUNT(*)
+          FROM  action.circulation circ
+            JOIN asset.copy cp ON (cp.id = circ.target_copy)
+          WHERE circ.usr = match_user
+               AND circ.circ_lib IN ( SELECT * FROM unnest(context_org_list) )
+            AND circ.checkin_time IS NULL
+            AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL)
+            AND cp.circ_modifier IN (SELECT circ_mod FROM config.circ_matrix_circ_mod_test_map WHERE circ_mod_test = out_by_circ_mod.id);
+        IF items_out >= out_by_circ_mod.items_out THEN
+            result.fail_part := 'config.circ_matrix_circ_mod_test';
+            result.success := FALSE;
+            done := TRUE;
+            RETURN NEXT result;
+        END IF;
+    END LOOP;
+
+    -- If we passed everything, return the successful matchpoint
+    IF NOT done THEN
+        RETURN NEXT result;
+    END IF;
+
+    RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+COMMIT;
index 894f716..93c53fa 100755 (executable)
@@ -33,6 +33,7 @@ my $prefix = '';
 my $sysconfdir = '';
 my $pg_contribdir = '';
 my $create_db_sql = '';
+my $create_db_sql_9_1 = '';
 my @services;
 
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@@ -135,9 +136,36 @@ sub create_database {
        $ENV{'PGPASSWORD'} = $settings->{pw};
        $ENV{'PGPORT'} = $settings->{port};
        $ENV{'PGHOST'} = $settings->{host};
-       my $cmd = 'psql -vdb_name=' . $settings->{db} . ' -vcontrib_dir=' . $pg_contribdir .
-               ' -d postgres -f ' . $create_db_sql;
-       system($cmd);
+       my @temp = `psql -d postgres -qtc 'show server_version;' | xargs | cut -c1,3`;
+       chomp $temp[0];
+       my $pgversion = $temp[0];
+       my $cmd;
+       # If it looks like it is 9.1 or greater, use create_database_9_1.sql
+       # Otherwise use create_database.sql
+       if($pgversion >= '91') {
+               $cmd = 'psql -vdb_name=' . $settings->{db} . ' -d postgres -f ' . $create_db_sql_9_1;
+       } else {
+               $cmd = 'psql -vdb_name=' . $settings->{db} . ' -vcontrib_dir=' . $pg_contribdir .
+                       ' -d postgres -f ' . $create_db_sql;
+       }
+       my @output = `$cmd 2>&1`;
+       if(grep(/(ERROR|No such file or directory)/,@output)) {
+               push(@output, "\n------------------------------------------------------------------------------\n",
+                       "There was a problem creating the database.\n",
+                       "See above for more information.\n");
+               if(grep/unsupported language/, @output) {
+                       push(@output, "\nYou may need to install the postgresql plperl package on the database server.\n");
+               }
+               if(grep/No such file or directory/, @output) {
+                       if($pgversion >= '91') {
+                               push(@output, "\nYou may need to install the postgresql contrib package on the database server.\n"); 
+                       } else {
+                               push(@output, "\nYou may need to install the postgresql contrib package on this server.\n");
+                       }
+               }
+               push(@output, "------------------------------------------------------------------------------\n");
+               die(@output);
+       }
 }
 
 =item create_schema() - Creates the database schema by calling build-db.sh
@@ -194,6 +222,7 @@ GetOptions("create-schema" => \$cschema,
                "build-db-file=s" => \$build_db_sh,
                "pg-contrib-dir=s" => \$pg_contribdir,
                "create-db-sql=s" => \$create_db_sql,
+               "create-db-sql-9-1=s" => \$create_db_sql_9_1,
                "pg-config=s" => \$pgconfig,
                "admin-user=s" => \$admin_user,
                "admin-password=s" => \$admin_pw,
@@ -240,13 +269,16 @@ if (!$create_db_sql) {
        $create_db_sql = File::Spec->catfile($script_dir, '../sql/Pg/create_database.sql');
 }
 
+if (!$create_db_sql_9_1) {
+       $create_db_sql_9_1 = File::Spec->catfile($script_dir, '../sql/Pg/create_database_9_1.sql');
+}
+
 if (!$offline_file) {
        $offline_file = File::Spec->catfile($sysconfdir, 'offline-config.pl');
 }
 
 unless (-e $build_db_sh) { die "Error: $build_db_sh does not exist. \n"; }
 unless (-e $config_file) { die "Error: $config_file does not exist. \n"; }
-unless (-d $pg_contribdir || !$cdatabase) { die "Error: $pg_contribdir does not exist. \n"; }
 
 if ($uconfig) { update_config(\@services, \%settings); }
 
index d520776..a4222fa 100644 (file)
@@ -448,6 +448,7 @@ util.print.prototype = {
                     + ' => ' + ( params.print_strategy || obj.data.print_strategy[obj.context] || obj.data.print_strategy['default'] ) + '\n');
                 switch(params.print_strategy || obj.data.print_strategy[obj.context] || obj.data.print_strategy['default']) {
                     case 'dos.print':
+                        params.dos_print = true;
                     case 'custom.print':
                         if (typeof w != 'string') {
                             try {
diff --git a/README b/README
index b9c3eb0..16a83af 100644 (file)
--- a/README
+++ b/README
@@ -26,9 +26,6 @@ deb http://backports.debian.org/debian-backports squeeze-backports main contrib
 deb http://archive.ubuntu.com/ubuntu lucid-backports main universe multiverse restricted
 ------------------------------------------------------------------------------
 +
-  * On Fedora 14, follow the http://yum.pgrpms.org/howtoyum.php[instructions
-    in the Yum HOWTO] to enable the PostgreSQL RPM Building Project yum
-    repository.
   * Fedora 15 comes with PostgreSQL 9, so no additional steps are required.
 +
 3. On Debian and Ubuntu, run `aptitude update` to retrieve the new packages
@@ -38,7 +35,7 @@ deb http://archive.ubuntu.com/ubuntu lucid-backports main universe multiverse re
    installer.
 5. Issue the following commands as the root user to install prerequisites
    using the Makefile.install prerequisite installer, substituting
-   `debian-squeeze`, `fedora15`, `fedora14`, `ubuntu-lucid`, `centos`, or
+   `debian-squeeze`, `fedora15`, `ubuntu-lucid`, `centos`, or
    `rhel` for <osname> below:
 +
 [source, bash]