[open-ils-commits] [GIT] Evergreen ILS branch tags/rel_2_2_5 created. e36c32fee196749929c211c6a89344ca7a5e475d

Evergreen Git git at git.evergreen-ils.org
Wed Jan 16 15:08:54 EST 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, tags/rel_2_2_5 has been created
        at  e36c32fee196749929c211c6a89344ca7a5e475d (commit)

- Log -----------------------------------------------------------------
commit e36c32fee196749929c211c6a89344ca7a5e475d
Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
Date:   Wed Jan 16 12:24:34 2013 -0500

    Bumping version numbers, adding Upgrade Script and Changelog
    
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>

diff --git a/ChangeLog b/ChangeLog
index 1f72b2c..ce95ba2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,453 @@
-Evergreen doesn't keep a GNU-style ChangeLog except in release tarballs.
-Those seeking a change log are encouraged to run 'git log -v', or read
-it online at: http://git.evergreen-ils.org/?p=Evergreen.git;a=log
+commit 0250071ae75e33f283cbc4738c30e402b4e9bba6
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Tue Jan 15 11:30:41 2013 -0500
+
+    LP#1098377: protect against even more cstore segfaults
+    
+    Following up on the preceding patch, passing null
+    as the savepoint name to savepoint.release and
+    savepoint.rollback would also segfault cstore.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+12	0	Open-ILS/src/c-apps/oils_sql.c
+
+commit c08ce1f7294b9ff51e2edb23e1dad0063c02d6e3
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Jan 15 10:58:16 2013 -0500
+
+    Verify savepoint name is non-null
+    
+    Before we attempt to mangle the name, let's ensure that it's non-null.
+    Otherwise, segfaults ensue.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+6	0	Open-ILS/src/c-apps/oils_sql.c
+
+commit afd508b93c5f847073457dbbe2b80391368448e1
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Fri Jan 11 01:32:13 2013 -0500
+
+    Protect against overly long savepoint names
+    
+    Per http://postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS,
+    the maximum identifier length works out to being 63 bytes (+1 for the
+    null terminator), so to avoid potential memory pressure by a 10GB string
+    somehow being passed in as the savepoint name, malloc no more than 64
+    bytes and copy no more than 63 bytes from the incoming name to the
+    escaped name.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+16	2	Open-ILS/src/c-apps/oils_sql.c
+
+commit df3e58f69423142418baf9583fb82d6691d55235
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jan 11 02:30:50 2013 -0500
+
+    LP#1098377: sanitize savepoint names
+    
+    When invoking open-ils.{cstore,pcrud,rstore}.savepoint.*, the
+    caller supplies a name for the savepoint.  However, the savepoint
+    names could be constructed so that the caller could execute
+    arbitrary SQL.  This patch sanitizes the name so that it contains
+    only alphanumeric and underscore characters.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+37	3	Open-ILS/src/c-apps/oils_sql.c
+
+commit 4bd4977ddd940b295da56b98ce6394010048bc01
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jan 16 11:04:23 2013 -0500
+
+    2.3.3 translations : repair Finnish translator email
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	build/i18n/po/AutoFieldWidget.js/fi-FI.po
+1	1	build/i18n/po/Searcher.js/fi-FI.po
+1	1	build/i18n/po/TranslatorPopup.js/fi-FI.po
+1	1	build/i18n/po/User.js/fi-FI.po
+1	1	build/i18n/po/XULTermLoader.js/fi-FI.po
+1	1	build/i18n/po/admin.properties/fi-FI.po
+1	1	build/i18n/po/auth.properties/fi-FI.po
+1	1	build/i18n/po/authority.js/fi-FI.po
+1	1	build/i18n/po/capture.js/fi-FI.po
+1	1	build/i18n/po/cat.properties/fi-FI.po
+1	1	build/i18n/po/circ.properties/fi-FI.po
+1	1	build/i18n/po/common.properties/fi-FI.po
+1	1	build/i18n/po/conify.dtd/fi-FI.po
+1	1	build/i18n/po/conify.js/fi-FI.po
+1	1	build/i18n/po/db.seed/fi-FI.po
+1	1	build/i18n/po/fm_IDL.dtd/fi-FI.po
+1	1	build/i18n/po/ils_events.xml/fi-FI.po
+1	1	build/i18n/po/lang.dtd/fi-FI.po
+1	1	build/i18n/po/offline.properties/fi-FI.po
+1	1	build/i18n/po/opac.dtd/fi-FI.po
+1	1	build/i18n/po/opac.js/fi-FI.po
+1	1	build/i18n/po/patron.properties/fi-FI.po
+1	1	build/i18n/po/pickup_and_return.js/fi-FI.po
+1	1	build/i18n/po/pull_list.js/fi-FI.po
+1	1	build/i18n/po/register.js/fi-FI.po
+1	1	build/i18n/po/reports.dtd/fi-FI.po
+1	1	build/i18n/po/reports.js/fi-FI.po
+1	1	build/i18n/po/reservation.js/fi-FI.po
+1	1	build/i18n/po/selfcheck.js/fi-FI.po
+1	1	build/i18n/po/serial.properties/fi-FI.po
+
+commit 019667716aa68022427bf6ae43a67db2d8d343fa
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jan 16 10:39:31 2013 -0500
+
+    2.3.3 translations : newpot
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+120	120	build/i18n/po/db.seed/db.seed.pot
+9	9	build/i18n/po/tpac/tpac.pot
+
+commit 41558633477f266cd4de68148e7c19674083e88f
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jan 16 10:35:33 2013 -0500
+
+    2.3.3 translations : update profiles
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts:
+    	build/i18n/po/AutoFieldWidget.js/fi-FI.po
+    	build/i18n/po/Searcher.js/fi-FI.po
+    	build/i18n/po/TranslatorPopup.js/fi-FI.po
+    	build/i18n/po/User.js/fi-FI.po
+    	build/i18n/po/XULTermLoader.js/fi-FI.po
+    	build/i18n/po/admin.properties/fi-FI.po
+    	build/i18n/po/auth.properties/fi-FI.po
+    	build/i18n/po/authority.js/fi-FI.po
+    	build/i18n/po/capture.js/fi-FI.po
+    	build/i18n/po/cat.properties/fi-FI.po
+    	build/i18n/po/circ.properties/fi-FI.po
+    	build/i18n/po/common.properties/fi-FI.po
+    	build/i18n/po/conify.dtd/fi-FI.po
+    	build/i18n/po/conify.js/fi-FI.po
+    	build/i18n/po/db.seed/fi-FI.po
+    	build/i18n/po/fm_IDL.dtd/fi-FI.po
+    	build/i18n/po/ils_events.xml/fi-FI.po
+    	build/i18n/po/lang.dtd/fi-FI.po
+    	build/i18n/po/multiclass_search_help.html/fi-FI.po
+    	build/i18n/po/offline.properties/fi-FI.po
+    	build/i18n/po/opac.dtd/fi-FI.po
+    	build/i18n/po/opac.js/fi-FI.po
+    	build/i18n/po/patron.properties/fi-FI.po
+    	build/i18n/po/pickup_and_return.js/fi-FI.po
+    	build/i18n/po/pull_list.js/fi-FI.po
+    	build/i18n/po/register.js/fi-FI.po
+    	build/i18n/po/reports.dtd/fi-FI.po
+    	build/i18n/po/reports.js/fi-FI.po
+    	build/i18n/po/reservation.js/fi-FI.po
+    	build/i18n/po/selfcheck.js/fi-FI.po
+    	build/i18n/po/serial.properties/fi-FI.po
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+30	0	build/i18n/po/AutoFieldWidget.js/fi-FI.po
+174	0	build/i18n/po/Searcher.js/fi-FI.po
+38	0	build/i18n/po/TranslatorPopup.js/fi-FI.po
+18	0	build/i18n/po/User.js/fi-FI.po
+38	0	build/i18n/po/XULTermLoader.js/fi-FI.po
+486	0	build/i18n/po/admin.properties/fi-FI.po
+82	0	build/i18n/po/auth.properties/fi-FI.po
+98	0	build/i18n/po/authority.js/fi-FI.po
+136	0	build/i18n/po/capture.js/fi-FI.po
+2411	0	build/i18n/po/cat.properties/fi-FI.po
+17	5	build/i18n/po/circ.properties/cs-CZ.po
+15	3	build/i18n/po/circ.properties/de-DE.po
+15	3	build/i18n/po/circ.properties/en-CA.po
+15	3	build/i18n/po/circ.properties/en-GB.po
+17	5	build/i18n/po/circ.properties/es-ES.po
+2041	0	build/i18n/po/circ.properties/fi-FI.po
+16	4	build/i18n/po/circ.properties/fr-CA.po
+16	4	build/i18n/po/circ.properties/hy-AM.po
+15	3	build/i18n/po/circ.properties/oc-FR.po
+17	5	build/i18n/po/circ.properties/pt-BR.po
+15	3	build/i18n/po/circ.properties/ru-RU.po
+203	63	build/i18n/po/circ.properties/tr-TR.po
+9	5	build/i18n/po/common.properties/cs-CZ.po
+7	3	build/i18n/po/common.properties/de-DE.po
+7	3	build/i18n/po/common.properties/en-CA.po
+9	5	build/i18n/po/common.properties/en-GB.po
+9	5	build/i18n/po/common.properties/es-ES.po
+844	0	build/i18n/po/common.properties/fi-FI.po
+7	3	build/i18n/po/common.properties/fr-CA.po
+8	4	build/i18n/po/common.properties/hy-AM.po
+7	3	build/i18n/po/common.properties/oc-FR.po
+7	3	build/i18n/po/common.properties/pt-BR.po
+7	3	build/i18n/po/common.properties/ru-RU.po
+502	0	build/i18n/po/conify.dtd/fi-FI.po
+395	0	build/i18n/po/conify.js/fi-FI.po
+791	718	build/i18n/po/db.seed/cs-CZ.po
+783	710	build/i18n/po/db.seed/de-DE.po
+719	719	build/i18n/po/db.seed/en-CA.po
+719	719	build/i18n/po/db.seed/en-GB.po
+783	710	build/i18n/po/db.seed/es-ES.po
+4319	0	build/i18n/po/db.seed/fi-FI.po
+785	706	build/i18n/po/db.seed/fr-CA.po
+795	716	build/i18n/po/db.seed/hy-AM.po
+783	710	build/i18n/po/db.seed/oc-FR.po
+791	713	build/i18n/po/db.seed/pt-BR.po
+784	706	build/i18n/po/db.seed/ru-RU.po
+783	710	build/i18n/po/db.seed/tr-TR.po
+1378	1374	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+1743	1578	build/i18n/po/fm_IDL.dtd/de-DE.po
+1375	1371	build/i18n/po/fm_IDL.dtd/en-CA.po
+1752	1587	build/i18n/po/fm_IDL.dtd/en-GB.po
+1743	1578	build/i18n/po/fm_IDL.dtd/es-ES.po
+7681	0	build/i18n/po/fm_IDL.dtd/fi-FI.po
+1736	1575	build/i18n/po/fm_IDL.dtd/fr-CA.po
+1751	1603	build/i18n/po/fm_IDL.dtd/hy-AM.po
+1375	1371	build/i18n/po/fm_IDL.dtd/oc-FR.po
+1752	1587	build/i18n/po/fm_IDL.dtd/pt-BR.po
+1752	1587	build/i18n/po/fm_IDL.dtd/ru-RU.po
+1375	1371	build/i18n/po/fm_IDL.dtd/tr-TR.po
+5	5	build/i18n/po/ils_events.xml/cs-CZ.po
+1254	0	build/i18n/po/ils_events.xml/fi-FI.po
+76	3	build/i18n/po/lang.dtd/ar-AR.po
+108	23	build/i18n/po/lang.dtd/cs-CZ.po
+76	3	build/i18n/po/lang.dtd/de-DE.po
+76	3	build/i18n/po/lang.dtd/en-CA.po
+76	3	build/i18n/po/lang.dtd/en-GB.po
+81	4	build/i18n/po/lang.dtd/es-ES.po
+14428	0	build/i18n/po/lang.dtd/fi-FI.po
+77	4	build/i18n/po/lang.dtd/fr-CA.po
+78	5	build/i18n/po/lang.dtd/hy-AM.po
+76	3	build/i18n/po/lang.dtd/oc-FR.po
+76	3	build/i18n/po/lang.dtd/pt-BR.po
+76	3	build/i18n/po/lang.dtd/ru-RU.po
+79	3	build/i18n/po/lang.dtd/tr-TR.po
+134	0	build/i18n/po/multiclass_search_help.html/fi-FI.po
+18	4	build/i18n/po/offline.properties/cs-CZ.po
+17	3	build/i18n/po/offline.properties/de-DE.po
+21	7	build/i18n/po/offline.properties/en-CA.po
+18	4	build/i18n/po/offline.properties/en-GB.po
+17	3	build/i18n/po/offline.properties/es-ES.po
+1537	0	build/i18n/po/offline.properties/fi-FI.po
+17	3	build/i18n/po/offline.properties/fr-CA.po
+19	5	build/i18n/po/offline.properties/hy-AM.po
+18	4	build/i18n/po/offline.properties/oc-FR.po
+17	3	build/i18n/po/offline.properties/pt-BR.po
+17	3	build/i18n/po/offline.properties/ru-RU.po
+17	3	build/i18n/po/offline.properties/tr-TR.po
+5	5	build/i18n/po/opac.dtd/cs-CZ.po
+2723	0	build/i18n/po/opac.dtd/fi-FI.po
+16	16	build/i18n/po/opac.dtd/oc-FR.po
+190	0	build/i18n/po/opac.js/fi-FI.po
+10	4	build/i18n/po/patron.properties/cs-CZ.po
+7	3	build/i18n/po/patron.properties/de-DE.po
+7	3	build/i18n/po/patron.properties/en-CA.po
+7	3	build/i18n/po/patron.properties/en-GB.po
+7	3	build/i18n/po/patron.properties/es-ES.po
+1993	0	build/i18n/po/patron.properties/fi-FI.po
+7	3	build/i18n/po/patron.properties/fr-CA.po
+8	4	build/i18n/po/patron.properties/hy-AM.po
+7	3	build/i18n/po/patron.properties/oc-FR.po
+7	3	build/i18n/po/patron.properties/pt-BR.po
+7	3	build/i18n/po/patron.properties/ru-RU.po
+7	3	build/i18n/po/patron.properties/tr-TR.po
+156	0	build/i18n/po/pickup_and_return.js/fi-FI.po
+90	0	build/i18n/po/pull_list.js/fi-FI.po
+180	0	build/i18n/po/register.js/fi-FI.po
+19	15	build/i18n/po/register.js/fr-CA.po
+819	0	build/i18n/po/reports.dtd/fi-FI.po
+434	0	build/i18n/po/reports.js/fi-FI.po
+287	0	build/i18n/po/reservation.js/fi-FI.po
+200	0	build/i18n/po/selfcheck.js/fi-FI.po
+690	0	build/i18n/po/serial.properties/fi-FI.po
+ create mode 100644 build/i18n/po/AutoFieldWidget.js/fi-FI.po
+ create mode 100644 build/i18n/po/Searcher.js/fi-FI.po
+ create mode 100644 build/i18n/po/TranslatorPopup.js/fi-FI.po
+ create mode 100644 build/i18n/po/User.js/fi-FI.po
+ create mode 100644 build/i18n/po/XULTermLoader.js/fi-FI.po
+ create mode 100644 build/i18n/po/admin.properties/fi-FI.po
+ create mode 100644 build/i18n/po/auth.properties/fi-FI.po
+ create mode 100644 build/i18n/po/authority.js/fi-FI.po
+ create mode 100644 build/i18n/po/capture.js/fi-FI.po
+ create mode 100644 build/i18n/po/cat.properties/fi-FI.po
+ create mode 100644 build/i18n/po/circ.properties/fi-FI.po
+ create mode 100644 build/i18n/po/common.properties/fi-FI.po
+ create mode 100644 build/i18n/po/conify.dtd/fi-FI.po
+ create mode 100644 build/i18n/po/conify.js/fi-FI.po
+ create mode 100644 build/i18n/po/db.seed/fi-FI.po
+ create mode 100644 build/i18n/po/fm_IDL.dtd/fi-FI.po
+ create mode 100644 build/i18n/po/ils_events.xml/fi-FI.po
+ create mode 100644 build/i18n/po/lang.dtd/fi-FI.po
+ create mode 100644 build/i18n/po/multiclass_search_help.html/fi-FI.po
+ create mode 100644 build/i18n/po/offline.properties/fi-FI.po
+ create mode 100644 build/i18n/po/opac.dtd/fi-FI.po
+ create mode 100644 build/i18n/po/opac.js/fi-FI.po
+ create mode 100644 build/i18n/po/patron.properties/fi-FI.po
+ create mode 100644 build/i18n/po/pickup_and_return.js/fi-FI.po
+ create mode 100644 build/i18n/po/pull_list.js/fi-FI.po
+ create mode 100644 build/i18n/po/register.js/fi-FI.po
+ create mode 100644 build/i18n/po/reports.dtd/fi-FI.po
+ create mode 100644 build/i18n/po/reports.js/fi-FI.po
+ create mode 100644 build/i18n/po/reservation.js/fi-FI.po
+ create mode 100644 build/i18n/po/selfcheck.js/fi-FI.po
+ create mode 100644 build/i18n/po/serial.properties/fi-FI.po
+
+commit da96028092880cd2f1d5a03b2de1239412adbccd
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Fri Nov 2 09:53:30 2012 -0400
+
+    Fix backdate near DST changes
+    
+    When the due date and the backdate date are on opposite sides of a DST
+    boundary we were getting an hour off on the checkin time (using the
+    original due date's time).
+    
+    This commit changes it so that instead we just set the hour and minute
+    values on the backdate date to the due date's versions, leaving the time
+    zone alone.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+3	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 8b8f0a0e0a51a5321729cc1a58578099b33401fb
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Fri Jan 11 08:49:11 2013 -0500
+
+    Fix a data destruction bug when authorities are updated.
+    
+    Modify the two-argument form of vandelay.merge_record_xml to return
+    the target_marc when the add_rule, preserve_rule, replace_rule and
+    strip_rule are all empty.
+    
+    This method is used by authority.propagate_changes and would replace
+    the bibliographic record's marc with the overlay template when the
+    above would happen. By returning the biblographic record entry's own
+    marc in that case, we prevent data destruction.
+    
+    Additionally, protect bib and authority template overlay functions
+    in the same manner.
+    
+    Commit includes an upgrade script for this change as well as
+    for the previous commit's authority.generate_overlay_template fix.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/002.schema.config.sql
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+12	3	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+275	0	Open-ILS/src/sql/Pg/upgrade/0750.function.authority.generate_overlay_template.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0750.function.authority.generate_overlay_template.sql
+
+commit 8b988e9da676b2b65b20c503197112a8ccef8d7a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jan 10 16:35:44 2013 -0500
+
+    Only consider main entry headings for bib overlay
+    
+    Restrict the authority fields we will pull overlay data from to those
+    that do not subordinate themselves to other authority fields.  That
+    is, skip see-from/see-also/etc for bib overlay.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/011.schema.authority.sql
+
+commit c208c4c555063f40f21d64caa1bbe0fc9c1cbf79
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Jan 9 16:20:39 2013 -0500
+
+    LP #1075167: Serials: Avoid infinite loop in holdings summarization
+    
+    When receiving items with unworkable combinations of holdings and
+    patterns, the holdings summarization code can get stuck in an infinite
+    loop.  This solution prevents that, sparing the open-ils.serial
+    process and server resources, although it doesn't help the user out.
+    
+    It will take further examination of the problem and reëvalution of how
+    we deal with problems reported by OpenILS::Utils::MFHD to help the
+    user avoid or resolve these situations.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Caption.pm
+
+commit c1054b299e19f2101996cb707f8408379beb1472
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Dec 20 14:32:46 2012 -0500
+
+    LP 1088561 - part 2, fix all update forms to not show saved passwords
+    
+    Bug re-opened due to locating a few other locations in my account area
+    where the password was being saved by browsers like Firefox instead of
+    requiring users to key in current password to make changes.
+    
+    This patch covers those two additional cases and changes the quoting
+    around the first case to be more consistent with the rest of the line.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Simon Mai <hieu.mai at mnsu.edu>
+
+1	1	Open-ILS/src/templates/opac/myopac/update_email.tt2
+1	1	Open-ILS/src/templates/opac/myopac/update_password.tt2
+1	1	Open-ILS/src/templates/opac/myopac/update_username.tt2
+
+commit 4665317984a3492efa992f9dba9fe287530c0c48
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Fri Dec 21 21:15:49 2012 -0500
+
+    Facets should not be sticky when users click "Search"
+    
+    We were using a hidden form variable to track which facets were in use,
+    at the same time as relying on the GET params to actually display the
+    facets, and munging the links on the remaining facets to properly
+    add/subtract facets.
+    
+    The result of the hidden form variable was that:
+    
+    1) clicking the Search button would unexpectedly result in the facet
+    applying to the new search (wat)
+    
+    2) applying two facets at once and then searching again would result
+    in the facet vars being treated as a raw array.
+    
+    Thanks to Dan Pearl for inspiring this patch with his fix for the latter
+    problem, and Kathy Lussier's recognition of the basic problem.
+    
+    Closes LP# 1092946 and 1091659.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	3	Open-ILS/src/templates/opac/results.tt2
+
+commit fae6c4cee9fd197da492060692a370d56ca74954
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Dec 20 16:50:44 2012 -0500
+
+    Master didn't get these two rel_2_2 series upgrade scripts
+    
+    [nor did rel_2_2 itself!]
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+519	0	Open-ILS/src/sql/Pg/version-upgrade/2.2.2-2.2.3-upgrade-db.sql
+33	0	Open-ILS/src/sql/Pg/version-upgrade/2.2.3-2.2.4-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.2.2-2.2.3-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.2.3-2.2.4-upgrade-db.sql
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
index 7e36e0e..1f17a9a 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
@@ -6,7 +6,7 @@ use base qw/OpenSRF::Application/;
 sub ils_version {
     # version format is "x-y-z", for example "2-0-0" for Evergreen 2.0.0
     # For branches, format is "x-y"
-    return "2-2";
+    return "2-2-5";
 }
 
 __PACKAGE__->register_method(
diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 559022f..1e2c0b2 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -88,6 +88,7 @@ CREATE TRIGGER no_overlapping_deps
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0750', :eg_version); -- miker/jstephenson
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.2.5', :eg_version);
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.2.4-2.2.5-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.2.4-2.2.5-upgrade-db.sql
new file mode 100644
index 0000000..6fba4b1
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.2.4-2.2.5-upgrade-db.sql
@@ -0,0 +1,278 @@
+--Upgrade Script for 2.2.4 to 2.2.5
+\set eg_version '''2.2.5'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.2.5', :eg_version);
+-- Only consider main entry headings for bib overlay
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0750', :eg_version);
+
+
+-- Function to generate an ephemeral overlay template from an authority record
+CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
+DECLARE
+    cset                INT;
+    main_entry          authority.control_set_authority_field%ROWTYPE;
+    bib_field           authority.control_set_bib_field%ROWTYPE;
+    auth_id             INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
+    replace_data        XML[] DEFAULT '{}'::XML[];
+    replace_rules       TEXT[] DEFAULT '{}'::TEXT[];
+    auth_field          XML[];
+BEGIN
+    IF auth_id IS NULL THEN
+        RETURN NULL;
+    END IF;
+
+    -- Default to the LoC controll set
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    -- if none, make a best guess
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN (
+                    SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
+                      FROM  authority.record_entry
+                      WHERE id = auth_id
+                )
+          LIMIT 1;
+    END IF;
+
+    -- if STILL none, no-op change
+    IF cset IS NULL THEN
+        RETURN XMLELEMENT(
+            name record,
+            XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
+            XMLELEMENT( name leader, '00881nam a2200193   4500'),
+            XMLELEMENT(
+                name datafield,
+                XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
+                XMLELEMENT(
+                    name subfield,
+                    XMLATTRIBUTES('d' AS code),
+                    '901c'
+                )
+            )
+        )::TEXT;
+    END IF;
+
+    FOR main_entry IN SELECT * FROM authority.control_set_authority_field acsaf WHERE acsaf.control_set = cset AND acsaf.main_entry IS NULL LOOP
+        auth_field := XPATH('//*[@tag="'||main_entry.tag||'"][1]',source_xml::XML);
+        IF ARRAY_LENGTH(auth_field,1) > 0 THEN
+            FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
+                replace_data := replace_data || XMLELEMENT( name datafield, XMLATTRIBUTES(bib_field.tag AS tag), XPATH('//*[local-name()="subfield"]',auth_field[1])::XML[]);
+                replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
+            END LOOP;
+            EXIT;
+        END IF;
+    END LOOP;
+
+    RETURN XMLELEMENT(
+        name record,
+        XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
+        XMLELEMENT( name leader, '00881nam a2200193   4500'),
+        replace_data,
+        XMLELEMENT(
+            name datafield,
+            XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
+            XMLELEMENT(
+                name subfield,
+                XMLATTRIBUTES('r' AS code),
+                ARRAY_TO_STRING(replace_rules,',')
+            )
+        )
+    )::TEXT;
+END;
+$f$ STABLE LANGUAGE PLPGSQL;
+
+-- Change the two argument form of vandelay.merge_record_xml to
+-- prevent bibliographic record destruction when there is nothing to
+-- do.
+
+
+CREATE OR REPLACE FUNCTION vandelay.merge_record_xml ( target_marc TEXT, template_marc TEXT ) RETURNS TEXT AS $$
+DECLARE
+    dyn_profile     vandelay.compile_profile%ROWTYPE;
+    replace_rule    TEXT;
+    tmp_marc        TEXT;
+    trgt_marc        TEXT;
+    tmpl_marc        TEXT;
+    match_count     INT;
+BEGIN
+
+    IF target_marc IS NULL OR template_marc IS NULL THEN
+        -- RAISE NOTICE 'no marc for target or template record';
+        RETURN NULL;
+    END IF;
+
+    dyn_profile := vandelay.compile_profile( template_marc );
+
+    IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
+        -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
+        RETURN NULL;
+    END IF;
+
+    IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' THEN
+        --Since we have nothing to do, just return what we were given.
+        RETURN target_marc;
+    ELSIF dyn_profile.replace_rule <> '' THEN
+        trgt_marc = target_marc;
+        tmpl_marc = template_marc;
+        replace_rule = dyn_profile.replace_rule;
+    ELSE
+        tmp_marc = target_marc;
+        trgt_marc = template_marc;
+        tmpl_marc = tmp_marc;
+        replace_rule = dyn_profile.preserve_rule;
+    END IF;
+
+    RETURN vandelay.merge_record_xml( trgt_marc, tmpl_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule );
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION vandelay.template_overlay_bib_record ( v_marc TEXT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+    merge_profile   vandelay.merge_profile%ROWTYPE;
+    dyn_profile     vandelay.compile_profile%ROWTYPE;
+    editor_string   TEXT;
+    editor_id       INT;
+    source_marc     TEXT;
+    target_marc     TEXT;
+    eg_marc         TEXT;
+    replace_rule    TEXT;
+    match_count     INT;
+BEGIN
+
+    SELECT  b.marc INTO eg_marc
+      FROM  biblio.record_entry b
+      WHERE b.id = eg_id
+      LIMIT 1;
+
+    IF eg_marc IS NULL OR v_marc IS NULL THEN
+        -- RAISE NOTICE 'no marc for template or bib record';
+        RETURN FALSE;
+    END IF;
+
+    dyn_profile := vandelay.compile_profile( v_marc );
+
+    IF merge_profile_id IS NOT NULL THEN
+        SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
+        IF FOUND THEN
+            dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
+            dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
+            dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
+            dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
+        END IF;
+    END IF;
+
+    IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
+        -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
+        RETURN FALSE;
+    END IF;
+
+    IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
+        --Since we have nothing to do, just return a NOOP "we did it"
+        RETURN TRUE;
+    ELSIF dyn_profile.replace_rule <> '' THEN
+        source_marc = v_marc;
+        target_marc = eg_marc;
+        replace_rule = dyn_profile.replace_rule;
+    ELSE
+        source_marc = eg_marc;
+        target_marc = v_marc;
+        replace_rule = dyn_profile.preserve_rule;
+    END IF;
+
+    UPDATE  biblio.record_entry
+      SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule )
+      WHERE id = eg_id;
+
+    IF NOT FOUND THEN
+        -- RAISE NOTICE 'update of biblio.record_entry failed';
+        RETURN FALSE;
+    END IF;
+
+    RETURN TRUE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+    merge_profile   vandelay.merge_profile%ROWTYPE;
+    dyn_profile     vandelay.compile_profile%ROWTYPE;
+    source_marc     TEXT;
+    target_marc     TEXT;
+    eg_marc         TEXT;
+    v_marc          TEXT;
+    replace_rule    TEXT;
+    match_count     INT;
+BEGIN
+
+    SELECT  b.marc INTO eg_marc
+      FROM  authority.record_entry b
+            JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id)
+      LIMIT 1;
+
+    SELECT  q.marc INTO v_marc
+      FROM  vandelay.queued_record q
+            JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id)
+      LIMIT 1;
+
+    IF eg_marc IS NULL OR v_marc IS NULL THEN
+        -- RAISE NOTICE 'no marc for vandelay or authority record';
+        RETURN FALSE;
+    END IF;
+
+    dyn_profile := vandelay.compile_profile( v_marc );
+
+    IF merge_profile_id IS NOT NULL THEN
+        SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
+        IF FOUND THEN
+            dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
+            dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
+            dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
+            dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
+        END IF;
+    END IF;
+
+    IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
+        -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
+        RETURN FALSE;
+    END IF;
+
+    IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
+        --Since we have nothing to do, just return a NOOP "we did it"
+        RETURN TRUE;
+    ELSIF dyn_profile.replace_rule <> '' THEN
+        source_marc = v_marc;
+        target_marc = eg_marc;
+        replace_rule = dyn_profile.replace_rule;
+    ELSE
+        source_marc = eg_marc;
+        target_marc = v_marc;
+        replace_rule = dyn_profile.preserve_rule;
+    END IF;
+
+    UPDATE  authority.record_entry
+      SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule )
+      WHERE id = eg_id;
+
+    IF FOUND THEN
+        UPDATE  vandelay.queued_authority_record
+          SET   imported_as = eg_id,
+                import_time = NOW()
+          WHERE id = import_id;
+        RETURN TRUE;
+    END IF;
+
+    -- RAISE NOTICE 'update of authority.record_entry failed';
+
+    RETURN FALSE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+COMMIT;
diff --git a/README b/README
deleted file mode 120000
index b57451a..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/installation/server_installation.txt
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..902f093
--- /dev/null
+++ b/README
@@ -0,0 +1,549 @@
+Installing the Evergreen server
+===============================
+:toc:
+:numbered:
+
+Preamble: referenced user accounts
+----------------------------------
+
+In subsequent sections, we will refer to a number of different accounts, as
+follows:
+
+  * Linux user accounts:
+    ** The *user* Linux account is the account that you use to log onto the
+       Linux system as a regular user.
+    ** The *root* Linux account is an account that has system administrator
+       privileges. On Debian and Fedora you can switch to this account from
+       your *user* account by issuing the `su -` command and entering the
+       password for the *root* account when prompted. On Ubuntu you can switch
+       to this account from your *user* account using the `sudo su -` command
+       and entering the password for your *user* account when prompted.
+    ** The *opensrf* Linux account is an account that you create when installing
+       OpenSRF. You can switch to this account from the *root* account by
+       issuing the `su - opensrf` command.
+    ** The *postgres* Linux account is created automatically when you install
+       the PostgreSQL database server. You can switch to this account from the
+       *root* account by issuing the `su - postgres` command.
+  * PostgreSQL user accounts:
+    ** The *evergreen* PostgreSQL account is a superuser account that you will
+       create to connect to the PostgreSQL database server.
+  * Evergreen administrator account:
+    ** The *egadmin* Evergreen account is an administrator account for
+       Evergreen that you will use to test connectivity and configure your
+       Evergreen instance.
+
+Preamble: developer instructions
+--------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, must install some extra packages
+and perform one step before they can proceed with the `./configure` step.
+
+As the *root* Linux account, install the following packages:
+
+  * autoconf
+  * automake
+  * libtool
+
+As the *user* Linux account, issue the following command in the Evergreen
+source directory to generate the configure script and Makefiles:
+
+[source, bash]
+------------------------------------------------------------------------------
+autoreconf -i
+------------------------------------------------------------------------------
+
+After running `make install`, developers also need to install the Dojo Toolkit
+set of JavaScript libraries. The appropriate version of Dojo is included
+in Evergreen release tarballs. Developers should install the Dojo 1.3.3
+version of Dojo by issuing the following commands as the *opensrf* Linux
+account:
+
+[source, bash]
+------------------------------------------------------------------------------
+wget http://download.dojotoolkit.org/release-1.3.3/dojo-release-1.3.3.tar.gz
+tar -C /openils/var/web/js -xzf dojo-release-1.3.3.tar.gz
+cp -r /openils/var/web/js/dojo-release-1.3.3/* /openils/var/web/js/dojo/.
+------------------------------------------------------------------------------
+
+Installing prerequisites
+------------------------
+
+Evergreen has a number of prerequisite packages that must be installed
+before you can successfully configure, compile, and install Evergreen.
+
+1. Begin by installing the most recent version of OpenSRF (2.1 or later).
+   You can download OpenSRF releases from http://evergreen-ils.org/opensrf.php
+2. On many distributions, it is necessary to install PostgreSQL 9 from external
+   repositories.
++
+  * On Debian Squeeze, open `/etc/apt/sources.list` in a text editor as the
+    *root* Linux account and add the following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+deb http://backports.debian.org/debian-backports squeeze-backports main contrib
+------------------------------------------------------------------------------
++
+  * On Ubuntu Lucid, you can use a PPA (personal package archive), which are 
+    package sources hosted on Launchpad. The one most commonly used by Evergreen
+    Community members is maintained by Martin Pitt, who also maintains the
+    official PostgreSQL packages for Ubuntu. As the *root* Linux account, issue
+    the following commands to add the PPA source:
++
+[source, bash]
+------------------------------------------------------------------------------
+apt-get install python-software-properties
+add-apt-repository ppa:pitti/postgresql
+------------------------------------------------------------------------------
++
+  * Ubuntu Precise comes with PostgreSQL 9, so no additional steps are required.
++
+  * Fedora comes with PostgreSQL 9, so no additional steps are required.
++
+3. On Debian and Ubuntu, run `aptitude update` as the *root* Linux account to
+   retrieve the new packages from the backports repository.
+4. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-squeeze`, `fedora`, `ubuntu-lucid`, or
+   `ubuntu-precise` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+5. Add the libdbi-libdbd libraries to the system dynamic library path by
+   issuing the following commands as the *root* Linux account:
++
+[NOTE]
+You should skip this step if installing on Ubuntu Precise. The ubuntu-precise
+target uses libdbd-pgsql from packages.
++
+.Debian / Ubuntu Lucid
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/local/lib/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
++
+.Fedora
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/lib64/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
+
+Configuration and compilation instructions
+------------------------------------------
+
+For the time being, we are still installing everything in the `/openils/`
+directory. From the Evergreen source directory, issue the following commands as
+the *user* Linux account to configure and build Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+./configure --prefix=/openils --sysconfdir=/openils/conf
+make
+------------------------------------------------------------------------------
+
+Installation instructions
+-------------------------
+
+1. Once you have configured and compiled Evergreen, issue the following
+   command as the *root* Linux account to install Evergreen, build the server
+   portion of the staff client, and copy example configuration files to
+   `/openils/conf`.
+   Change the value of the `STAFF_CLIENT_STAMP_ID` variable to match the version
+   of the staff client that you will use to connect to the Evergreen server.
++
+[source, bash]
+------------------------------------------------------------------------------
+make STAFF_CLIENT_STAMP_ID=rel_2_2_5 install
+------------------------------------------------------------------------------
++
+2. The server portion of the staff client expects `http://hostname/xul/server`
+   to resolve. Issue the following commands as the *root* Linux account to
+   create a symbolic link pointing to the `server` subdirectory of the server
+   portion of the staff client that we just built using the staff client ID
+   'rel_name':
++
+[source, bash]
+------------------------------------------------------------------------------
+cd /openils/var/web/xul
+ln -sf rel_name/server server
+------------------------------------------------------------------------------
+
+Change ownership of the Evergreen files
+---------------------------------------
+
+All files in the `/openils/` directory and subdirectories must be owned by the
+`opensrf` user. Issue the following command as the *root* Linux account to
+change the ownership on the files:
+
+[source, bash]
+------------------------------------------------------------------------------
+chown -R opensrf:opensrf /openils
+------------------------------------------------------------------------------
+
+Configure the Apache Web server
+-------------------------------
+
+1. Use the example configuration files in `Open-ILS/examples/apache/` to
+configure your Web server for the Evergreen catalog, staff client, Web
+services, and administration interfaces. Issue the following commands as the
+*root* Linux account:
++
+.Debian and Ubuntu
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache/eg.conf       /etc/apache2/sites-available/
+cp Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/
+cp Open-ILS/examples/apache/startup.pl    /etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------
++
+.Fedora
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache/eg.conf       /etc/httpd/conf.d/
+cp Open-ILS/examples/apache/eg_vhost.conf /etc/httpd/
+cp Open-ILS/examples/apache/startup.pl    /etc/httpd/
+# Now set up SSL
+mkdir /etc/httpd/ssl
+cd /etc/httpd/ssl
+------------------------------------------------------------------------------
++
+2. The `openssl` command cuts a new SSL key for your Apache server. For a
+production server, you should purchase a signed SSL certificate, but you can
+just use a self-signed certificate and accept the warnings in the staff client
+and browser during testing and development. Create an SSL key for the Apache
+server by issuing the following command as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------
+openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
+------------------------------------------------------------------------------
++
+3. As the *root* Linux account, edit the `eg.conf` file that you copied into
+place.
+  a. Replace `Allow from 10.0.0.0/8` with `Allow from all` (to enable
+     access to the offline upload / execute interface from any workstation on
+     any network - note that you must secure this for a production instance)
+  b. (Fedora): Change references from the non-existent `/etc/apache2/` directory
+     to `/etc/httpd/`.
+4. Change the user for the Apache server.
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+  * (Fedora): As the *root* Linux account , edit `/etc/httpd/conf/httpd.conf`.
+    Change `User apache` to `User opensrf`.
+5. Configure Apache with performance settings appropriate for Evergreen:
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/apache2.conf`:
+  * (Fedora): As the *root* Linux account, edit `/etc/httpd/conf/httpd.conf`:
+    a. Change `KeepAliveTimeout` to `1`. Higher values reduce the chance of
+       a request timing out unexpectedly, but increase the risk of using up
+       all available Apache child processes.
+    b. 'Optional': Change `MaxKeepAliveRequests` to `100`
+    c. Update the prefork configuration section to suit your environment. The
+       following settings apply to a busy system:
++
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers           20
+   MinSpareServers         5
+   MaxSpareServers        15
+   MaxClients            150
+   MaxRequestsPerChild 10000
+</IfModule>
+------------------------------------------------------------------------------
++
+6. (Fedora): As the *root* Linux account, edit the `/etc/httpd/eg_vhost.conf`
+   file to change references from the non-existent `/etc/apache2/` directory
+   to `/etc/httpd/`.
+7. (Debian and Ubuntu): As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
+
+Configure OpenSRF for the Evergreen application
+-----------------------------------------------
+There are a number of example OpenSRF configuration files in `/openils/conf/`
+that you can use as a template for your Evergreen installation. Issue the
+following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
+cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml
+------------------------------------------------------------------------------
+
+When you installed OpenSRF, you created four Jabber users on two
+separate domains and edited the `opensrf_core.xml` file accordingly. Please
+refer back to the OpenSRF README and, as the *opensrf* Linux account, edit the
+Evergreen version of the `opensrf_core.xml` file using the same Jabber users
+and domains as you used while installing and testing OpenSRF.
+
+[NOTE]
+The `-b` flag tells the `cp` command to create a backup version of the
+destination file. The backup version of the destination file has a tilde (`~`)
+appended to the file name, so if you have forgotten the Jabber users and
+domains, you can retrieve the settings from the backup version of the files.
+
+`eg_db_config.pl`, described in the following section, sets the database
+connection information in `opensrf.xml` for you.
+
+Creating the Evergreen database
+-------------------------------
+
+By default, the `Makefile.install` prerequisite installer does not install
+the PostgreSQL 9 database server required by every Evergreen system;
+for production use, most libraries install the PostgreSQL database server on a
+dedicated machine. You can install the packages required by Debian or Ubuntu Lucid
+on the machine of your choice using the following commands as the *root*
+Linux account:
+
+.(Debian and Ubuntu Lucid) Installing PostgreSQL 9.1 server packages
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install install_pgsql_server_backport_debs_91
+------------------------------------------------------------------------------
+
+.(Ubuntu Precise) Installing PostgreSQL 9.1 server packages
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install install_pgsql_server_debs_91
+------------------------------------------------------------------------------
+
+You can install the packages required by Fedora on the machine of your choice
+using the following commands as the *root* Linux account:
+
+.(Fedora) Installing PostgreSQL server packages
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install install_fedora_pgsql_server
+postgresql-setup initdb
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules as the
+*root* Linux account:
+
+.(Debian / Ubuntu) Installing additional Perl modules on a standalone PostgreSQL 9 server
+[source, bash]
+------------------------------------------------------------------------------
+aptitude install gcc libxml-libxml-perl libxml-libxslt-perl
+cpan Business::ISBN
+cpan JSON::XS
+cpan Library::CallNumber::LC
+cpan MARC::Record
+cpan MARC::File::XML
+cpan UUID::Tiny
+------------------------------------------------------------------------------
+
+.(Fedora) Installing additional Perl modules on a standalone PostgreSQL 9 server
+[source, bash]
+------------------------------------------------------------------------------
+yum install gcc perl-XML-LibXML perl-XML-LibXSLT perl-Business-ISBN
+cpan Library::CallNumber::LC
+cpan MARC::Record
+cpan MARC::File::XML
+cpan UUID::Tiny
+------------------------------------------------------------------------------
+
+You need to create a PostgreSQL superuser to create and access the database.
+Issue the following command as the *postgres* Linux account to create a new
+PostgreSQL superuser named `evergreen`. When prompted, enter the new user's
+password:
+
+[source, bash]
+------------------------------------------------------------------------------
+createuser -s -P evergreen
+------------------------------------------------------------------------------
+
+Once you have created the *evergreen* PostgreSQL account, you also need to
+create the database and schema, and configure your configuration files to point
+at the database server. Issue the following command as the *root* Linux account
+from inside the Evergreen source directory, replacing <user>, <password>,
+<hostname>, <port>, and <dbname> with the appropriate values for your
+PostgreSQL database (where <user> and <password> are for the *evergreen*
+PostgreSQL account you just created), and replace <admin-user> and <admin-pass>
+with the values you want for the *egadmin* Evergreen administrator account:
+
+[source, bash]
+------------------------------------------------------------------------------
+perl Open-ILS/src/support-scripts/eg_db_config.pl --update-config \
+       --service all --create-database --create-schema --create-offline \
+       --user <user> --password <password> --hostname <hostname> --port <port> \
+       --database <dbname> --admin-user <admin-user> --admin-pass <admin-pass>
+------------------------------------------------------------------------------
+
+This creates the database and schema and configures all of the services in
+your `/openils/conf/opensrf.xml` configuration file to point to that database.
+It also creates the configuration files required by the Evergreen `cgi-bin`
+administration scripts, and sets the user name and password for the *egadmin*
+Evergreen administrator account to your requested values.
+
+Creating the database on a remote server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In a production instance of Evergreen, your PostgreSQL server should be
+installed on a dedicated server.
+
+PostgreSQL 9.1 and later
+^^^^^^^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.1 or later, simply use the `--create-database` flag on `eg_db_config.pl`.
+
+For PostgreSQL 9.0
+^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.0, you can either:
+
+  *  Install the PostgreSQL contrib modules on the machine on which you
+     are installing the Evergreen code, and use the `--create-database`
+     option from that machine, or
+  *  Copy the `Open-ILS/src/sql/Pg/create_database.sql` script to your
+     PostgreSQL server and invoke it as the *postgres* Linux account:
++
+[source, bash]
+------------------------------------------------------------------------------
+psql -vdb_name=<dbname> -vcontrib_dir=`pg_config --sharedir`/contrib -f create_database.sql
+------------------------------------------------------------------------------
+
+Then you can issue the `eg_db_config.pl` command as above _without_ the
+`--create-database` argument to create your schema and configure your
+configuration files.
+
+Starting Evergreen
+------------------
+1. As the *root* Linux account, start the `memcached` and `ejabberd` services
+(if they aren't already running):
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/ejabberd start
+/etc/init.d/memcached start
+------------------------------------------------------------------------------
++
+2. As the *opensrf* Linux account, start Evergreen. The `-l` flag in the
+following command is only necessary if you want to force Evergreen to treat the
+hostname as `localhost`; if you configured `opensrf.xml` using the real
+hostname of your machine as returned by `perl -ENet::Domain 'print
+Net::Domain::hostfqdn() . "\n";'`, you should not use the `-l` flag.
++
+[source, bash]
+------------------------------------------------------------------------------
+osrf_ctl.sh -l -a start_all
+------------------------------------------------------------------------------
++
+  ** If you receive the error message `bash: osrf_ctl.sh: command not found`,
+     then your environment variable `PATH` does not include the `/openils/bin`
+     directory; this should have been set in the *opensrf* Linux account's
+     `.bashrc` configuration file. To manually set the `PATH` variable, edit the
+     configuration file `~/.bashrc` as the *opensrf* Linux account and add the
+     following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+export PATH=$PATH:/openils/bin
+------------------------------------------------------------------------------
++
+3. As the *opensrf* Linux account, generate the Web files needed by the staff
+   client and catalogue and update the organization unit proximity (you need to do
+   this the first time you start Evergreen, and after that each time you change
+   the library hierarchy in `config.cgi`):
++
+[source, bash]
+------------------------------------------------------------------------------
+autogen.sh -u
+------------------------------------------------------------------------------
++
+4. As the *root* Linux account, restart the Apache Web server:
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/apache2 restart
+------------------------------------------------------------------------------
++
+If the Apache Web server was running when you started the OpenSRF services, you
+might not be able to successfully log in to the OPAC or staff client until the
+Apache Web server is restarted.
+
+Testing connections to Evergreen
+--------------------------------
+
+Once you have installed and started Evergreen, test your connection to
+Evergreen via `srfsh`. As the *opensrf* Linux account, issue the following
+commands to start `srfsh` and try to log onto the Evergreen server using the
+*egadmin* Evergreen administrator user name and password that you set using the
+`eg_db_config.pl` command:
+
+[source, bash]
+------------------------------------------------------------------------------
+/openils/bin/srfsh
+srfsh% login <admin-user> <admin-pass>
+------------------------------------------------------------------------------
+
+You should see a result like:
+
+    Received Data: "250bf1518c7527a03249858687714376"
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 0.045286
+    ------------------------------------
+
+    Received Data: {
+       "ilsevent":0,
+       "textcode":"SUCCESS",
+       "desc":" ",
+       "pid":21616,
+       "stacktrace":"oils_auth.c:304",
+       "payload":{
+          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
+          "authtime":420
+       }
+
+    }
+
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 1.336568
+    ------------------------------------
+
+If this does not work, it's time to do some troubleshooting.
+
+  * As the *opensrf* Linux acccount, run the `settings-tester.pl` script to see
+    if it finds any system configuration problems. The script is found at
+    `Open-ILS/src/support-scripts/settings-tester.pl` in the Evergreen source
+    tree.
+  * Follow the steps in the http://evergreen-ils.org/dokuwiki/doku.php?id=troubleshooting:checking_for_errors[troubleshooting guide].
+  * If you have faithfully followed the entire set of installation steps
+    listed here, you are probably extremely close to a working system.
+    Gather your configuration files and log files and contact the
+    http://open-ils.org/listserv.php[Evergreen development mailing list]
+    for assistance before making any drastic changes to your system
+    configuration.
+
+Getting help
+------------
+
+Need help installing or using Evergreen? Join the mailing lists at
+http://evergreen-ils.org/listserv.php or contact us on the Freenode
+IRC network on the #evergreen channel.
+
+License
+-------
+This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
+Unported License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
diff --git a/configure.ac b/configure.ac
index d599a51..6bd4c39 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,8 +20,8 @@
 
 export PATH=${PATH}:/usr/sbin
 AC_PREREQ(2.61)
-AC_INIT(Open-ILS, 2.2, open-ils-dev at list.georgialibraries.org)
-AM_INIT_AUTOMAKE([OpenILS], [2.2])
+AC_INIT(Open-ILS, 2.2.5, open-ils-dev at list.georgialibraries.org)
+AM_INIT_AUTOMAKE([OpenILS], [2.2.5])
 AC_REVISION($Revision: 0.1 $)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_PREFIX_DEFAULT([/openils/])

commit 0250071ae75e33f283cbc4738c30e402b4e9bba6
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue Jan 15 11:30:41 2013 -0500

    LP#1098377: protect against even more cstore segfaults
    
    Following up on the preceding patch, passing null
    as the savepoint name to savepoint.release and
    savepoint.rollback would also segfault cstore.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Bill Erickson <berick at esilibrary.com>

diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c
index 18b0f9c..c67362b 100644
--- a/Open-ILS/src/c-apps/oils_sql.c
+++ b/Open-ILS/src/c-apps/oils_sql.c
@@ -969,6 +969,12 @@ int releaseSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+
+	if (!spName) {
+		osrfLogWarning(OSRF_LOG_MARK, "savepoint.release called with no name");
+		return -1;
+	}
+
 	char *safeSpName = _sanitize_savepoint_name( spName );
 
 	dbi_result result = dbi_conn_queryf( writehandle, "RELEASE SAVEPOINT \"%s\";", safeSpName );
@@ -1042,6 +1048,12 @@ int rollbackSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+
+	if (!spName) {
+		osrfLogWarning(OSRF_LOG_MARK, "savepoint.rollback called with no name");
+		return -1;
+	}
+
 	char *safeSpName = _sanitize_savepoint_name( spName );
 
 	dbi_result result = dbi_conn_queryf( writehandle, "ROLLBACK TO SAVEPOINT \"%s\";", safeSpName );

commit c08ce1f7294b9ff51e2edb23e1dad0063c02d6e3
Author: Bill Erickson <berick at esilibrary.com>
Date:   Tue Jan 15 10:58:16 2013 -0500

    Verify savepoint name is non-null
    
    Before we attempt to mangle the name, let's ensure that it's non-null.
    Otherwise, segfaults ensue.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c
index d27c272..18b0f9c 100644
--- a/Open-ILS/src/c-apps/oils_sql.c
+++ b/Open-ILS/src/c-apps/oils_sql.c
@@ -890,6 +890,12 @@ int setSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+
+	if (!spName) {
+		osrfLogWarning(OSRF_LOG_MARK, "savepoint.set called with no name");
+		return -1;
+	}
+
 	char *safeSpName = _sanitize_savepoint_name( spName );
 
 	dbi_result result = dbi_conn_queryf( writehandle, "SAVEPOINT \"%s\";", safeSpName );

commit afd508b93c5f847073457dbbe2b80391368448e1
Author: Dan Scott <dscott at laurentian.ca>
Date:   Fri Jan 11 01:32:13 2013 -0500

    Protect against overly long savepoint names
    
    Per http://postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS,
    the maximum identifier length works out to being 63 bytes (+1 for the
    null terminator), so to avoid potential memory pressure by a 10GB string
    somehow being passed in as the savepoint name, malloc no more than 64
    bytes and copy no more than 63 bytes from the incoming name to the
    escaped name.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c
index 08a390b..d27c272 100644
--- a/Open-ILS/src/c-apps/oils_sql.c
+++ b/Open-ILS/src/c-apps/oils_sql.c
@@ -7288,11 +7288,25 @@ int writeAuditInfo( osrfMethodContext* ctx, const char* user_id, const char* ws_
 static char* _sanitize_savepoint_name( const char* sp ) {
 
 	const char* safe_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789_";
-	char* safeSpName = safe_malloc( strlen( sp ) + 1);
+
+	// PostgreSQL uses NAMEDATALEN-1 as a max length for identifiers,
+	// and the default value of NAMEDATALEN is 64; that should be long enough
+	// for our purposes, and it's unlikely that anyone is going to recompile
+	// PostgreSQL to have a smaller value, so cap the identifier name
+	// accordingly to avoid the remote chance that someone manages to pass in a
+	// 12GB savepoint name
+	const int MAX_LITERAL_NAMELEN = 63;
+	int len = 0;
+	len = strlen( sp );
+	if (len > MAX_LITERAL_NAMELEN) {
+		len = MAX_LITERAL_NAMELEN;
+	}
+
+	char* safeSpName = safe_malloc( len + 1 );
 	int i = 0;
 	int j;
 	char* found;
-	for (j = 0; j < strlen( sp ); j++) {
+	for (j = 0; j < len; j++) {
 	found = strchr(safe_chars, sp[j]);
 		if (found) {
 			safeSpName[ i++ ] = found[0];

commit df3e58f69423142418baf9583fb82d6691d55235
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Fri Jan 11 02:30:50 2013 -0500

    LP#1098377: sanitize savepoint names
    
    When invoking open-ils.{cstore,pcrud,rstore}.savepoint.*, the
    caller supplies a name for the savepoint.  However, the savepoint
    names could be constructed so that the caller could execute
    arbitrary SQL.  This patch sanitizes the name so that it contains
    only alphanumeric and underscore characters.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c
index a0ba678..08a390b 100644
--- a/Open-ILS/src/c-apps/oils_sql.c
+++ b/Open-ILS/src/c-apps/oils_sql.c
@@ -145,6 +145,8 @@ static char* modulename = NULL;
 
 int writeAuditInfo( osrfMethodContext* ctx, const char* user_id, const char* ws_id);
 
+static char* _sanitize_savepoint_name( const char* sp );
+
 /**
 	@brief Connect to the database.
 	@return A database connection if successful, or NULL if not.
@@ -888,8 +890,10 @@ int setSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+	char *safeSpName = _sanitize_savepoint_name( spName );
 
-	dbi_result result = dbi_conn_queryf( writehandle, "SAVEPOINT \"%s\";", spName );
+	dbi_result result = dbi_conn_queryf( writehandle, "SAVEPOINT \"%s\";", safeSpName );
+	free( safeSpName );
 	if( !result ) {
 		const char* msg;
 		int errnum = dbi_conn_error( writehandle, &msg );
@@ -959,8 +963,10 @@ int releaseSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+	char *safeSpName = _sanitize_savepoint_name( spName );
 
-	dbi_result result = dbi_conn_queryf( writehandle, "RELEASE SAVEPOINT \"%s\";", spName );
+	dbi_result result = dbi_conn_queryf( writehandle, "RELEASE SAVEPOINT \"%s\";", safeSpName );
+	free( safeSpName );
 	if( !result ) {
 		const char* msg;
 		int errnum = dbi_conn_error( writehandle, &msg );
@@ -1030,8 +1036,10 @@ int rollbackSavepoint( osrfMethodContext* ctx ) {
 
 	// Get the savepoint name from the method params
 	const char* spName = jsonObjectGetString( jsonObjectGetIndex(ctx->params, spNamePos) );
+	char *safeSpName = _sanitize_savepoint_name( spName );
 
-	dbi_result result = dbi_conn_queryf( writehandle, "ROLLBACK TO SAVEPOINT \"%s\";", spName );
+	dbi_result result = dbi_conn_queryf( writehandle, "ROLLBACK TO SAVEPOINT \"%s\";", safeSpName );
+	free( safeSpName );
 	if( !result ) {
 		const char* msg;
 		int errnum = dbi_conn_error( writehandle, &msg );
@@ -7268,4 +7276,30 @@ int writeAuditInfo( osrfMethodContext* ctx, const char* user_id, const char* ws_
 	return 0;
 }
 
+/**
+	@brief Remove all but safe character from savepoint name
+	@param sp User-supplied savepoint name
+	@return sanitized savepoint name, or NULL
+
+    The caller is expected to free the returned string.  Note that
+    this function exists only because we can't use PQescapeLiteral
+    without either forking libdbi or abandoning it.
+*/
+static char* _sanitize_savepoint_name( const char* sp ) {
+
+	const char* safe_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789_";
+	char* safeSpName = safe_malloc( strlen( sp ) + 1);
+	int i = 0;
+	int j;
+	char* found;
+	for (j = 0; j < strlen( sp ); j++) {
+	found = strchr(safe_chars, sp[j]);
+		if (found) {
+			safeSpName[ i++ ] = found[0];
+		}
+	}
+	safeSpName[ i ] = '\0';
+	return safeSpName;
+}
+
 /*@}*/

-----------------------------------------------------------------------


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list