← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~elderp/openlp/packaging-iss-fix into lp:openlp

 

Stevan Pettit has proposed merging lp:~elderp/openlp/packaging-iss-fix into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~elderp/openlp/packaging-iss-fix/+merge/239677

Changed the location of the Windows innosetup executable to match the current location that is being use in the 2.0.x builds.

If the executable is placed in openlp/dist/OpenLP it is copied to the portable apps build location by windows-builder.py.

Placing the setup into openlp/dist prevents this.
-- 
https://code.launchpad.net/~elderp/openlp/packaging-iss-fix/+merge/239677
Your team OpenLP Core is requested to review the proposed merge of lp:~elderp/openlp/packaging-iss-fix into lp:openlp.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2014-10-27 01:58:14 +0000
@@ -0,0 +1,36 @@
+*.pyc
+*.*~
+\#*\#
+*.eric4project
+*.eric5project
+*.ropeproject
+*.e4*
+.eric4project
+.komodotools
+*.komodoproject
+list
+openlp.org 2.0.e4*
+documentation/build/html
+documentation/build/doctrees
+*.log*
+dist
+OpenLP.egg-info
+build
+resources/innosetup/Output
+_eric4project
+.pylint.d
+*.qm
+openlp/core/resources.py.old
+*.qm
+resources/windows/warnOpenLP.txt
+openlp.cfg
+.idea
+openlp.pro
+.kdev4
+tests.kdev4
+*.nja
+*.orig
+__pycache__
+*.dll
+*.DS_Store
+config.ini

=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added directory 'gentoo'
=== added file 'gentoo/openlp-1.9.4.ebuild'
--- gentoo/openlp-1.9.4.ebuild	1970-01-01 00:00:00 +0000
+++ gentoo/openlp-1.9.4.ebuild	2014-10-27 01:58:14 +0000
@@ -0,0 +1,30 @@
+# Copyright 1999-2009 Gentoo Foundation
+# Copyright 2010 Jaak Ristioja
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=2
+RESTRICT_PYTHON_ABIS="3.*"
+inherit python
+
+DESCRIPTION="Free church presentation software"
+HOMEPAGE="http://openlp.org/";
+SRC_URI="mirror://sourceforge/${PN}/${PV}/OpenLP-${PV}-src.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 sparc x86 x86-fbsd x86-freebsd amd64-linux x86-linux x86-macos x86-solaris"
+
+RDEPEND=">=dev-lang/python-2.5.0
+         dev-python/beautifulsoup
+         dev-python/chardet
+         dev-python/lxml
+         dev-python/pyenchant
+         dev-python/PyQt4[X,multimedia]
+         dev-python/sqlalchemy"
+DEPEND="${RDEPEND}"
+
+PYTHON_DEPEND="2:2.5"
+PYTHON_MODNAME="openlp"
+
+S=${WORKDIR}/OpenLP-${PV}-src

=== added directory 'launchpad-ppa'
=== added file 'launchpad-ppa/Makefile'
--- launchpad-ppa/Makefile	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/Makefile	2014-10-27 01:58:14 +0000
@@ -0,0 +1,17 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+build:
+	mkdir -p resources/i18n/qm
+	for TSFILE in resources/i18n/*.ts; do\
+		lrelease-qt4 $$TSFILE -qm resources/i18n/qm/`basename $$TSFILE .ts`.qm;\
+	done
+
+install:
+	mkdir -p $(DESTDIR)/usr/share/openlp/i18n
+	cd resources/i18n/qm && for QMFILE in*.qm; do\
+		mv $QMFILE $(DESTDIR)/usr/share/openlp/i18n;\
+	done
+
+clean:
+	rm -fR resources/i18n/qm

=== added directory 'launchpad-ppa/debian'
=== added file 'launchpad-ppa/debian/changelog'
--- launchpad-ppa/debian/changelog	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/changelog	2014-10-27 01:58:14 +0000
@@ -0,0 +1,389 @@
+openlp (1.9.4+bzr1355-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:10:03 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:07:03 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:05:27 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:03:17 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:08:15 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:06:40 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:05:09 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:03:14 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:04:49 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:04:15 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:03:34 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:02:43 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:56 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:30 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:05 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:02:26 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:44 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:28 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:03 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:04:05 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:03:48 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:03:20 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:02:34 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:04:02 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:03:44 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:03:18 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:02:32 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:04:00 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:03:41 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:03:16 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:02:36 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:47 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:31 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:07 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:48 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:33 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:08 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:04:06 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:03:52 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:03:28 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:02:42 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:59 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:45 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:21 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:02:41 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:32:08 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:31:51 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:31:28 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:30:49 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:24:12 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:23:51 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:23:28 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:22:49 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:35:36 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:35:21 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:34:53 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:34:10 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:58:14 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:57:40 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:57:11 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:56:17 -0500
+
+openlp (0.0.0+bzr664-0ubuntu1) karmic; urgency=low
+
+  * Initial release
+
+ -- Michael Gorven <michael@xxxxxxxxxxxxx>  Fri, 06 Nov 2009 09:46:40 +0200

=== added file 'launchpad-ppa/debian/compat'
--- launchpad-ppa/debian/compat	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/compat	2014-10-27 01:58:14 +0000
@@ -0,0 +1,1 @@
+5

=== added file 'launchpad-ppa/debian/control'
--- launchpad-ppa/debian/control	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/control	2014-10-27 01:58:14 +0000
@@ -0,0 +1,20 @@
+Source: openlp
+Section: python
+Priority: extra
+Maintainer: OpenLP Developers <openlp-dev@xxxxxxxxxxxxxxxxxxx>
+Build-Depends: cdbs, debhelper (>= 5), python-setuptools, python-support,
+ python, qt4-dev-tools
+Standards-Version: 3.8.3
+Homepage: http://openlp.org/
+
+Package: openlp
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-qt4,
+ python-qt4-phonon, python-qt4-gl, python-sqlalchemy, python-chardet,
+ python-beautifulsoup, python-lxml, python-sqlite, python-enchant,
+ python-mako, python-migrate
+Conflicts: python-openlp
+Description: Church lyrics projection application
+ OpenLP is free church presentation software, or lyrics projection software,
+ used to display slides of songs, Bible verses, videos, images, and even
+ presentations for church worship using a computer and a data projector.

=== added file 'launchpad-ppa/debian/copyright'
--- launchpad-ppa/debian/copyright	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/copyright	2014-10-27 01:58:14 +0000
@@ -0,0 +1,10 @@
+Format-Specification: http://wiki.debian.org/Proposals/CopyrightFormat
+Upstream-Name: OpenLP
+Upstream-Maintainer: OpenLP Developers <openlp-dev@xxxxxxxxxxxxxxxxxxx>
+Upstream-Source: http://openlp.org/
+
+Files: *
+Copyright: (c) 2008-2009 Raoul Snyman
+License: GPL-2
+X-Comment: On Debian GNU/Linux systems, the complete text of the
+ GPL-2 License can be found in /usr/share/common-licenses/GPL-2

=== added file 'launchpad-ppa/debian/docs'
--- launchpad-ppa/debian/docs	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/docs	2014-10-27 01:58:14 +0000
@@ -0,0 +1,1 @@
+documentation

=== added file 'launchpad-ppa/debian/openlp.install'
--- launchpad-ppa/debian/openlp.install	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/openlp.install	2014-10-27 01:58:14 +0000
@@ -0,0 +1,1 @@
+resources/openlp.desktop /usr/share/applications

=== added file 'launchpad-ppa/debian/pycompat'
--- launchpad-ppa/debian/pycompat	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/pycompat	2014-10-27 01:58:14 +0000
@@ -0,0 +1,1 @@
+2

=== added file 'launchpad-ppa/debian/pyversions'
--- launchpad-ppa/debian/pyversions	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/pyversions	2014-10-27 01:58:14 +0000
@@ -0,0 +1,1 @@
+2.5-

=== added file 'launchpad-ppa/debian/rules'
--- launchpad-ppa/debian/rules	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/rules	2014-10-27 01:58:14 +0000
@@ -0,0 +1,21 @@
+#!/usr/bin/make -f
+
+DEB_PYTHON_SYSTEM := pysupport
+DEB_MAKE_BUILD_TARGET := build
+DEB_MAKE_INSTALL_TARGET := install
+DEB_MAKE_CLEAN_TARGET := clean
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+include /usr/share/cdbs/1/class/makefile.mk
+
+binary-post-install/openlp::
+	for SIZE in 16x16 32x32 48x48 64x64 128x128 256x256; do \
+		mkdir -p debian/openlp/usr/share/icons/hicolor/$$SIZE/apps && \
+		cp resources/images/openlp-logo-$$SIZE.png debian/openlp/usr/share/icons/hicolor/$$SIZE/apps/openlp.png; \
+	done
+
+	mkdir -p debian/openlp/usr/share/icons/hicolor/scalable/apps && \
+	cp resources/images/openlp-logo.svg debian/openlp/usr/share/icons/hicolor/scalable/apps/openlp.svg
+
+	cd debian/openlp/usr/bin/ && mv openlp.pyw openlp

=== added directory 'osx'
=== added file 'osx/DmgImageIcon.png'
Binary files osx/DmgImageIcon.png	1970-01-01 00:00:00 +0000 and osx/DmgImageIcon.png	2014-10-27 01:58:14 +0000 differ
=== added file 'osx/DmgImageInstallBackground.png'
Binary files osx/DmgImageInstallBackground.png	1970-01-01 00:00:00 +0000 and osx/DmgImageInstallBackground.png	2014-10-27 01:58:14 +0000 differ
=== added file 'osx/DmgImageInstallBackgroundClean.png'
Binary files osx/DmgImageInstallBackgroundClean.png	1970-01-01 00:00:00 +0000 and osx/DmgImageInstallBackgroundClean.png	2014-10-27 01:58:14 +0000 differ
=== added file 'osx/Info.plist'
--- osx/Info.plist	1970-01-01 00:00:00 +0000
+++ osx/Info.plist	2014-10-27 01:58:14 +0000
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
+<plist version="1.0">
+<dict>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>osz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Service</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.osz</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>otz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Theme</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.otz</string>
+			</array>
+		</dict>
+	</array>
+	<key>UTExportedTypeDeclarations</key>
+	<array>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.osz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Service</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>osz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-service</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.otz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Theme</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>otz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-theme</string>
+				</array>
+			</dict>
+		</dict>
+	</array>
+	<key>CFBundleIdentifier</key>
+	<string>org.openlp</string>
+	<key>CFBundleShortVersionString</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleVersion</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleDisplayName</key>
+	<string>OpenLP</string>
+	<key>CFBundleIconFile</key>
+	<string>OpenLP.icns</string>
+	<key>CFBundleExecutable</key>
+	<string>MacOS/OpenLP</string>
+	<key>CFBundleName</key>
+	<string>OpenLP</string>
+	<key>CFBundleGetInfoString</key>
+	<string>OpenLP %(openlp_version)s</string>
+	<key>LSHasLocalizedDisplayName</key>
+	<false/>
+	<key>NSAppleScriptEnabled</key>
+	<false/>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>LSBackgroundOnly</key>
+	<true/>
+	<key>NSHighResolutionCapable</key>
+	<true/>
+</dict>
+</plist>

=== added file 'osx/LICENSE.txt'
--- osx/LICENSE.txt	1970-01-01 00:00:00 +0000
+++ osx/LICENSE.txt	2014-10-27 01:58:14 +0000
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'osx/OpenLP.icns'
Binary files osx/OpenLP.icns	1970-01-01 00:00:00 +0000 and osx/OpenLP.icns	2014-10-27 01:58:14 +0000 differ
=== added file 'osx/applescript-adjust-dmg-view.master'
--- osx/applescript-adjust-dmg-view.master	1970-01-01 00:00:00 +0000
+++ osx/applescript-adjust-dmg-view.master	2014-10-27 01:58:14 +0000
@@ -0,0 +1,31 @@
+on run
+	-- wait for virus scanner
+	delay 2
+
+	tell application "Finder"
+		tell disk "%s"
+			open
+			set current view of container window to icon view
+			set toolbar visible of container window to false
+			set statusbar visible of container window to false
+			set the bounds of container window to {400, 100, 1100, 500}
+			set theViewOptions to the icon view options of container window
+			set arrangement of theViewOptions to not arranged
+			set icon size of theViewOptions to 128
+			set background picture of theViewOptions to file ".background:installer-background.png"
+			set position of item "%s" of container window to {160, 200}
+			set position of item "Applications" of container window to {550, 200}
+			set position of item ".background" of container window to {100, 500}
+			set position of item ".DS_Store" of container window to {200, 500}
+			set position of item ".fseventsd" of container window to {300, 500}
+			set position of item ".Trashes" of container window to {400, 500}
+            set position of item ".VolumeIcon.icns" of container window to {500, 500}
+			open
+			close
+			update without registering applications
+			-- wait until the virus scan completes
+			delay 5
+			-- eject
+		end tell
+	end tell
+end run

=== added file 'osx/config.ini.default'
--- osx/config.ini.default	1970-01-01 00:00:00 +0000
+++ osx/config.ini.default	2014-10-27 01:58:14 +0000
@@ -0,0 +1,20 @@
+[executables]
+sphinx = sphinx-build-2.7
+pyinstaller = %(projects)s/pyinstaller/pyinstaller.py
+lrelease = lrelease
+diskutil = diskutil
+hdiutil = hdiutil
+osascript = osascript
+mudrawbin = /opt/local/bin/mudraw
+
+[paths]
+branch = %(projects)s/trunk
+documentation = %(projects)s/documentation
+macicon = %(here)s/OpenLP.icns
+bundleinfo = %(here)s/Info.plist
+hooks = %(here)s/../pyinstaller-hooks
+dmg_background = %(here)s/DmgImageInstallBackground.png
+
+[transifex]
+username =
+password =

=== added file 'osx/macosx-builder.py'
--- osx/macosx-builder.py	1970-01-01 00:00:00 +0000
+++ osx/macosx-builder.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,732 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+"""
+Mac OS X Build Script
+--------------------
+
+This script is used to build the Mac OS X app bundle and pack it into dmg file.
+For this script to work out of the box, it depends on a number of things:
+
+Python 3.3/3.4
+
+PyQt4
+    You should already have this installed, OpenLP doesn't work without it. The
+    version the script expects is the packaged one available from River Bank
+    Computing.
+
+PyEnchant
+    This script expects the precompiled, installable version of PyEnchant to be
+    installed. You can find this on the PyEnchant site.
+
+Sphinx
+    This is used to build the documentation.  The documentation trunk must be at
+    the same directory level as OpenLP trunk and named "documentation".
+
+PyInstaller
+    PyInstaller should be a git clone of either
+    https://github.com/matysek/pyinstaller branch python3 or
+    https://github.com/pyinstaller/pyinstaller branch python3
+
+Bazaar
+    You need the command line "bzr" client installed.
+
+OpenLP
+    A checkout of the latest code, in a branch directory, which is in a Bazaar
+    shared repository directory. This means your code should be in a directory
+    structure like this: "openlp\branch-name".
+
+macosx-builder.py
+    This script, of course. It should be in the "osx-package" directory
+    at the same level as OpenLP trunk.
+
+Mako
+    Mako Templates for Python.  This package is required for building the
+    remote plugin.  It can be installed by going to your
+    python_directory\scripts\.. and running "easy_install Mako".  If you do not
+    have easy_install, the Mako package can be obtained here:
+
+        http://www.makotemplates.org/download.html
+
+SQLAlchemy Migrate
+    Required for the databases used in OpenLP.  The package can be
+    obtained here:
+
+        http://code.google.com/p/sqlalchemy-migrate/
+
+MuPDF
+    Required for PDF support in OpenLP. Install using macports, or use the
+    mudrawbin option in the config file to point to the mudraw binary.
+
+MachOLib
+    Python library to analyze and edit Mach-O headers, the executable format
+    used by Mac OS X. Used to relink the mudraw binary from MuPDF to the bundled
+    libraries. Install using macports or pip.
+
+MachOLib
+    Python library to analyze and edit Mach-O headers, the executable format
+    used by Mac OS X. Used to relink the mudraw binary from MuPDF to the bundled
+    libraries. Install using macports or pip.
+
+config.ini.default
+    The configuration file contains settings of the version string to include
+    in the bundle as well as directory and file settings for different
+    purposes (e.g. PyInstaller location or installer background image)
+
+To start the build process do a
+
+   make
+
+The result should be a {openlp_dmgname}.dmg
+file in the same directory. If something went wrong - this sometimes happen
+with the graphical commands in the Apple script - do a
+
+   make clean
+
+and start the build process again. If you want to execute only parts of the
+build process you can specify different make targets
+
+    make view -- runs the Apple scripts to set the icons
+    make package -- creates the dmg file and copies the application files
+    make bundle -- compresses the dmg file and sets the dmg file icon
+"""
+
+import os
+import plistlib
+import signal
+import subprocess
+import sys
+from shutil import copy, rmtree
+from subprocess import Popen, PIPE
+from configparser import ConfigParser
+from argparse import ArgumentParser
+
+from macholib.MachO import MachO
+from macholib.util import flipwritable, in_system_path
+
+
+def _which(command):
+    """
+    Return absolute path to a command found on system PATH.
+    """
+    for path in os.environ["PATH"].split(os.pathsep):
+        if os.access(os.path.join(path, command), os.X_OK):
+            print("%s/%s" % (path, command))
+            return "%s/%s" % (path, command)
+
+
+class MacosxBuilder(object):
+    """
+    The :class:`MacosxBuilder` class encapsulates everything that is needed
+    to build a Mac OS X .dmg file.
+    """
+
+    def __init__(self):
+        self.setup_args()
+        self.setup_system_paths()
+        self.read_config()
+        self.setup_executables()
+        self.setup_paths()
+
+    def _print(self, text, *args):
+        """
+        Print stuff out. Later we might want to use a log file.
+        """
+        if len(args) > 0:
+            text = text % tuple(args)
+        print(text)
+
+    def _print_verbose(self, text, *args):
+        """
+        Print output, obeying "verbose" mode.
+        """
+        if self.args.verbose:
+            self._print(text, *args)
+
+    def _run_command(self, cmd, err_msg):
+        """
+        Run command in subprocess and print error message in case of Exception.
+
+        Return text from stdout.
+        """
+        proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
+        output, error = proc.communicate()
+        code = proc.wait()
+        if code != 0:
+            self._print(output)
+            self._print(error)
+            raise Exception(err_msg)
+        return output
+
+    def _get_directory_size(self, directory):
+        """
+        Return directory size - size of everything in the dir.
+        """
+        dir_size = 0
+        for (path, dirs, files) in os.walk(directory):
+            for file in files:
+                filename = os.path.join(path, file)
+                dir_size += os.path.getsize(filename)
+        return dir_size
+
+    def _get_mountpoints(self):
+        """
+        Return list of mounted disks on Mac.
+        """
+        # Get the output in plist format.
+        paths = []
+        output = self._run_command([self.hdiutil, 'info', '-plist'], 'Detecting mount points failed.')
+        pl = plistlib.readPlistFromBytes(output)
+        for image in pl['images']:
+            for se in image['system-entities']:
+                if se.get('mount-point'):
+                    paths.append(se.get('mount-point'))
+
+        return paths
+
+    def setup_args(self):
+        """
+        Set up an argument parser and parse the command line arguments.
+        """
+        parser = ArgumentParser()
+        parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
+                            help='Specify the path to the branch you wish to build.')
+        parser.add_argument('--devel', dest='devel', action='store_true', default=False,
+                            help='Development build does not have set icons for .dmg file '
+                                 'and .dmg filename contains bzr revision number.')
+        parser.add_argument('-d', '--documentation', metavar='DOCS', dest='docs',
+                            help='Specify the path to the documentation branch.')
+        parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
+                            help='Specify the path to the configuration file.',
+                            default=os.path.abspath(os.path.join('.', 'config.ini.default')))
+        parser.add_argument('-u', '--skip-update', dest='skip_update', action='store_true', default=False,
+                            help='Do NOT update the branch before building.')
+        parser.add_argument('-t', '--skip-translations', dest='skip_translations', action='store_true', default=False,
+                            help='Do NOT update the language translation files.')
+        parser.add_argument('--transifex', dest='update_translations', action='store_true', default=False,
+                            help='Update the language translation from Transifex.')
+        parser.add_argument('--transifex-user', dest='transifex_user', help='Transifex username.')
+        parser.add_argument('--transifex-pass', dest='transifex_pass', help='Transifex password.')
+        parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                            help='Print out additional information.')
+        self.args = parser.parse_args()
+
+    def read_config(self):
+        """
+        Read the configuration from the configuration file.
+        """
+        self.config = ConfigParser(defaults={
+            'here': self.script_path,
+            'projects': os.path.abspath(os.path.join(self.script_path, '..', '..')), })
+        self.config.read(os.path.abspath(self.args.config))
+
+    def setup_system_paths(self):
+        """
+        Set up some system paths.
+        """
+        self.script_path = os.path.dirname(os.path.abspath(__file__))
+        self.python = sys.executable
+
+    def setup_executables(self):
+        """
+        Set up the paths to the executables we use.
+        """
+        self.sphinx = _which(self.config.get('executables', 'sphinx'))
+        self.pyinstaller = os.path.abspath(self.config.get('executables', 'pyinstaller'))
+        self.lrelease = _which(self.config.get('executables', 'lrelease'))
+        self.diskutil = _which(self.config.get('executables', 'diskutil'))
+        self.hdiutil = _which(self.config.get('executables', 'hdiutil'))
+        self.osascript = _which(self.config.get('executables', 'osascript'))
+        self.mudraw_bin = _which(self.config.get('executables', 'mudrawbin'))
+
+    def setup_paths(self):
+        """
+        Set up a variety of paths that we use throughout the build process.
+        """
+        if self.args.branch:
+            self.branch_path = os.path.abspath(self.args.branch)
+        else:
+            self.branch_path = self.config.get('paths', 'branch')
+        if self.args.docs:
+            self.docs_path = os.path.abspath(self.args.docs)
+        else:
+            self.docs_path = self.config.get('paths', 'documentation')
+        self.openlp_script = os.path.abspath(os.path.join(self.branch_path, 'openlp.py'))
+        self.hooks_path = os.path.abspath(os.path.join(self.branch_path, self.config.get('paths', 'hooks')))
+        self.mac_icon = os.path.abspath(self.config.get('paths', 'macicon'))
+        self.bundle_info = os.path.abspath(self.config.get('paths', 'bundleinfo'))
+        self.dmg_background_img = os.path.abspath(self.config.get('paths', 'dmg_background'))
+        self.i18n_utils = os.path.join(self.branch_path, 'scripts', 'translation_utils.py')
+        self.source_path = os.path.join(self.branch_path, 'openlp')
+        self.manual_path = os.path.join(self.docs_path, 'manual')
+        self.manual_build_path = os.path.join(self.manual_path, 'build')
+        self.i18n_path = os.path.join(self.branch_path, 'resources', 'i18n')
+        self.build_path = os.path.join(self.branch_path, 'build')
+        self.dist_app_path = os.path.join(self.branch_path, 'dist', 'OpenLP.app')
+        self.dist_path = os.path.join(self.branch_path, 'dist', 'OpenLP.app', 'Contents', 'MacOS')
+
+        # Path to Qt translation files.
+        from PyQt4.QtCore import QCoreApplication
+
+        qt_plug_dir = str(list(QCoreApplication.libraryPaths())[0])
+        self.qt_translat_path = os.path.join(os.path.dirname(qt_plug_dir), 'translations')
+
+    def update_code(self):
+        """
+        Update the code in the branch.
+        """
+        os.chdir(self.branch_path)
+        self._print('Reverting any changes to the code...')
+        bzr = Popen(('bzr', 'revert'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error reverting the code')
+        self._print('Updating the code...')
+        bzr = Popen(('bzr', 'update'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error updating the code')
+
+    def run_pyinstaller(self):
+        """
+        Run PyInstaller on the branch to build an executable.
+        """
+        self._print('Running PyInstaller...')
+        os.chdir(self.branch_path)
+        pyinstaller = Popen((self.python,
+                             self.pyinstaller,
+                             '--noconfirm',
+                             '--windowed',
+                             '--noupx',
+                             '--additional-hooks-dir', self.hooks_path,
+                             '--runtime-hook', os.path.join(self.hooks_path, 'rthook_openlp_pyqt4.py'),
+                             '--log-level=ERROR',
+                             # '--distpath', self.branch_path,
+                             # '-i', self.mac_icon,
+                             '-p', self.branch_path,
+                             '-n', 'OpenLP',
+                             self.openlp_script),
+                            stdout=PIPE)
+        output = pyinstaller.communicate()[0]
+        code = pyinstaller.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running PyInstaller')
+
+    def write_version_file(self):
+        """
+        Write the version number to a file for reading once installed.
+        """
+        self._print('Writing version file...')
+        os.chdir(self.branch_path)
+        bzr = Popen(('bzr', 'tags'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr tags')
+        lines = output.splitlines()
+        if len(lines) == 0:
+            tag = '0.0.0'
+            revision = '0'
+        else:
+            tag, revision = lines[-1].decode('utf-8').split()
+        bzr = Popen(('bzr', 'log', '--line', '-r', '-1'), stdout=PIPE)
+        output, error = bzr.communicate()
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr log')
+        latest = output.decode('utf-8').split(':')[0]
+        self.version_string = '%s-bzr%s' % (tag, latest)
+        self.version_tag = tag
+        version_file = open(os.path.join(self.dist_path, '.version'), 'w')
+        # Release version does not contain revision in .dmg name.
+        if self.args.devel:
+            version_file.write(str(self.version_string))
+        else:
+            version_file.write(str(self.version_tag))
+        version_file.close()
+
+    def copy_default_theme(self):
+        """
+        Copy the default theme to the correct directory for OpenLP.
+        """
+        self._print('Copying default theme...')
+        source = os.path.join(self.source_path, 'core', 'lib', 'json')
+        dest = os.path.join(self.dist_path, 'core', 'lib', 'json')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if filename.endswith('.json'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_plugins(self):
+        """
+        Copy all the plugins to the correct directory so that OpenLP sees that
+        it has plugins.
+        """
+        self._print('Copying plugins...')
+        source = os.path.join(self.source_path, 'plugins')
+        dest = os.path.join(self.dist_path, 'plugins')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_media_player(self):
+        """
+        Copy the media players to the correct directory for OpenLP.
+        """
+        self._print('Copying media player...')
+        source = os.path.join(self.source_path, 'core', 'ui', 'media')
+        dest = os.path.join(self.dist_path, 'core', 'ui', 'media')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_mac_bundle_files(self):
+        """
+        Copy Info.plist and OpenLP.icns to app bundle.
+        """
+        copy(self.mac_icon, os.path.join(self.dist_app_path, 'Contents', 'Resources', os.path.basename(self.mac_icon)))
+        # Add OpenLP version to Info.plist and put it to app bundle.
+        fr = open(self.bundle_info, 'r')
+        fw = open(os.path.join(self.dist_app_path, 'Contents', os.path.basename(self.bundle_info)), 'w')
+        text = fr.read()
+        text = text % {'openlp_version': self.version_string}
+        fw.write(text)
+
+        fr.close()
+        fw.close()
+
+    def copy_macosx_files(self):
+        """
+        Copy all the OSX-specific files.
+        """
+        self._print('Copying extra files for Mac OS X...')
+        self._print_verbose('... LICENSE.txt')
+        copy(os.path.join(self.script_path, 'LICENSE.txt'), os.path.join(self.dist_path, 'LICENSE.txt'))
+        self._print_verbose('... mudraw')
+        if self.mudraw_bin and os.path.isfile(self.mudraw_bin):
+            copy(os.path.join(self.mudraw_bin), os.path.join(self.dist_path, 'mudraw'))
+            self.relink_mudraw()
+        else:
+            self._print('... WARNING: mudraw not found')
+
+    def relink_mudraw(self):
+        """
+        Relink mudraw to bundled libraries
+        """
+        self._print('Linking mudraw with bundled libraries...')
+        libname = os.path.join(self.dist_path, 'mudraw')
+        distname = os.path.relpath(self.dist_path, libname)
+        self._print_verbose('... mudraw path %s', libname)
+
+        # Determine how many directories up is the directory with shared
+        # dynamic libraries. '../'
+        # E.g.  ./qt4_plugins/images/ -> ./../../
+        parent_dir = ''
+        # Check if distname is not only base filename.
+        if os.path.dirname(distname):
+            parent_level = len(os.path.dirname(distname).split(os.sep))
+            parent_dir = parent_level * (os.pardir + os.sep)
+
+        def match_func(pth):
+            """
+            For system libraries leave path unchanged.
+            """
+            # Match non system dynamic libraries.
+            if not in_system_path(pth):
+                # Use relative path to dependend dynamic libraries bases on
+                # location of the executable.
+                pth = os.path.join('@loader_path', parent_dir, os.path.basename(pth))
+                self._print_verbose('... %s', pth)
+                return pth
+
+        # Rewrite mach headers with @loader_path.
+        dll = MachO(libname)
+        dll.rewriteLoadCommands(match_func)
+
+        # Write changes into file.
+        # Write code is based on macholib example.
+        try:
+            self._print_verbose('... writing new library paths')
+            f = open(dll.filename, 'rb+')
+            for header in dll.headers:
+                f.seek(0)
+                dll.write(f)
+            f.seek(0, 2)
+            f.flush()
+            f.close()
+        except Exception:
+            pass
+
+    def update_translations(self):
+        """
+        Update the translations.
+        """
+        self._print('Updating translations...')
+        if not self.config.has_section('transifex'):
+            raise Exception('No section named "transifex" found.')
+        if not self.config.has_option('transifex', 'username'):
+            raise Exception('No option named "username" found.')
+        if not self.config.has_option('transifex', 'password'):
+            raise Exception('No option named "password" found.')
+        if self.args.transifex_user:
+            username = self.args.transifex_user
+        else:
+            username = self.config.get('transifex', 'username')
+        if self.args.transifex_pass:
+            password = self.args.transifex_pass
+        else:
+            password = self.config.get('transifex', 'password')
+        os.chdir(os.path.split(self.i18n_utils)[0])
+        translation_utils = Popen([self.python, self.i18n_utils, '-qdpu', '-U', username, '-P', password])
+        code = translation_utils.wait()
+        if code != 0:
+            raise Exception('Error running translation_utils.py')
+
+    def compile_translations(self):
+        """
+        Compile the translations for Qt.
+        """
+        self._print('Compiling translations...')
+        files = os.listdir(self.i18n_path)
+        if not os.path.exists(os.path.join(self.dist_path, 'i18n')):
+            os.makedirs(os.path.join(self.dist_path, 'i18n'))
+        for file in files:
+            if file.endswith('.ts'):
+                self._print_verbose('... %s', file)
+                source_path = os.path.join(self.i18n_path, file)
+                dest_path = os.path.join(self.dist_path, 'i18n', file.replace('.ts', '.qm'))
+                lconvert = Popen((self.lrelease, '-compress', '-silent', source_path, '-qm', dest_path))
+                code = lconvert.wait()
+                if code != 0:
+                    raise Exception('Error running lconvert on %s' % source_path)
+        self._print('Copying qm files...')
+        source = self.qt_translat_path
+        files = os.listdir(source)
+        for filename in files:
+            if filename.startswith('qt_') and filename.endswith('.qm') and len(filename) == 8:
+                self._print_verbose('... %s', filename)
+                copy(os.path.join(source, filename), os.path.join(self.dist_path, 'i18n', filename))
+
+    def run_sphinx(self):
+        """
+        Run Sphinx to build an HTML Help project.
+        """
+        self._print('Deleting previous manual build... %s', self.manual_build_path)
+        if os.path.exists(self.manual_build_path):
+            rmtree(self.manual_build_path)
+        self._print('Running Sphinx...')
+        os.chdir(self.manual_path)
+        sphinx = Popen((self.sphinx, '-b', 'htmlhelp', '-d', 'build/doctrees', 'source', 'build/htmlhelp'), stdout=PIPE)
+        output, error = sphinx.communicate()
+        code = sphinx.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running Sphinx')
+
+    def create_dmg_file(self):
+        """
+        Create .dmg file.
+        """
+        self._print('Creating dmg file...')
+
+        # Release version does not contain revision in .dmg name.
+        if self.args.devel:
+            dmg_name = 'OpenLP-' + str(self.version_string) + '.dmg'
+        else:
+            dmg_name = 'OpenLP-' + str(self.version_tag) + '.dmg'
+
+        dmg_file = os.path.join(self.branch_path, 'build', dmg_name)
+        # Remove dmg if it exists.
+        if os.path.exists(dmg_file):
+            os.remove(dmg_file)
+        # Create empty dmg file.
+        size = self._get_directory_size(self.dist_app_path)  # in bytes.
+        size = size / (1024 * 1024)  # Convert to megabytes.
+        size += 10  # Additional space in .dmg for other files.
+        self._print('... dmg disk size: %s' % size)
+        self._run_command([self.hdiutil, 'create', dmg_file, '-ov', '-megabytes', str(size), '-fs', 'HFS+', '-volname',
+                           'OpenLP'], 'Could not create dmg file.')
+
+        # Mount empty dmg file.
+        old_mounts = self._get_mountpoints()
+        self._print('... mounting the dmg file: %s' % dmg_file)
+        self._run_command([self.hdiutil, 'attach', dmg_file], 'Could not mount dmg file, cannot continue.')
+        new_mounts = self._get_mountpoints()
+        # Get the mount point from difference between paths
+        # after mounting and before mounting the dmg file.
+        dmg_volume_path = list(set(new_mounts) - set(old_mounts))[0]
+
+        # Copy OpenLP.app and other files to .dmg
+        # TODO more reliable way to determine dmg_volume_path
+        self._print('... Copying the app to the dmg: ' + dmg_volume_path)
+        self._run_command(['cp', '-r', self.dist_app_path, dmg_volume_path],
+                          'Could not copy app bundle, dmg creation failed.')
+
+        # Set icon for dmg file.
+        # http://endrift.com/blog/2010/06/14/dmg-files-volume-icons-cli/
+        self._print('... Setting the dmg icon.')
+        dmg_icon = os.path.join(dmg_volume_path, '.VolumeIcon.icns')
+        self._run_command(['cp', self.mac_icon, dmg_icon], 'Could not copy the dmg icon file, dmg creation failed.')
+        # Set proper dmg icon attributes.
+        self._run_command(['SetFile', '-c', 'icnC', dmg_icon], 'Could not set dmg icon attributes.')
+        # Ensures dmg icon will be used while mounted.
+        self._run_command(['SetFile', '-a', 'C', dmg_volume_path], 'Could not set dmg icon attributes.')
+
+        # Create symlink in dmg pointing to the /Applications directory on OS X.
+        self._print('... Creating symlink to /Applications.')
+        os.symlink('/Applications', os.path.join(dmg_volume_path, 'Applications'))
+
+        # Set dmg background. Requires running Mac OS X gui.
+        # TODO: better formatting and code refactoring
+        if not self.args.devel:
+            self._print('... Setting the background image.')
+
+            os.mkdir(os.path.join(dmg_volume_path, '.background'))
+            self._run_command(['cp', self.dmg_background_img, os.path.join(dmg_volume_path,
+                                                                           '.background/installer-background.png')],
+                              'Could not copy the background image, dmg creation failed.')
+
+            self.adjust_dmg_view(os.path.basename(dmg_volume_path))
+
+        # Unmount dmg file.
+        self._print('... unmounting the dmg.')
+        # Sometimes it could happen that OSX Finder is blocking umount.
+        # We need to find this process and kill it.
+        try:
+            output = subprocess.check_output(['fuser', dmg_volume_path]).strip()
+            if output:
+                blocking_proc_pid = int(output.split()[0])
+                os.kill(int(blocking_proc_pid), signal.SIGKILL)
+        except Exception as e:
+            print(str(e))
+            self._print('... failed to kill process using %s' % dmg_volume_path)
+        # Unmount dmg file.
+        self._run_command([self.hdiutil, 'detach', dmg_volume_path],
+                          'Could not unmount the dmg file, dmg creation failed.')
+
+        # Compress dmg file.
+        self._print('... compressing the dmg file')
+        compressed_dmg = os.path.join(self.branch_path, 'dist', os.path.basename(dmg_file))  # Put dmg to 'dist' dir.
+        # Remove dmg if it exists.
+        if os.path.exists(compressed_dmg):
+            os.remove(compressed_dmg)
+        self._run_command([self.hdiutil, 'convert', dmg_file, '-format', 'UDZO', '-imagekey', 'zlib-level=9', '-o',
+                           compressed_dmg], 'Could not compress the dmg file, dmg creation failed.')
+
+        # Jenkins integration.
+        # Continuous integration server needs to know the filename of dmg.
+        # Write java property file. For uploading dmg to openlp.
+        if self.args.devel:
+            fpath = os.path.join(self.branch_path, 'openlp.properties')
+            self._print('... writing property file for jenkins: %s' % fpath)
+            f = open(fpath, 'w')
+            f.write('OPENLP_DMGNAME=' + os.path.basename(dmg_file) + '\n')
+            f.close()
+
+        # Dmg done.
+        self._print('Finished creating dmg file, resulting file: %s' % compressed_dmg)
+
+        self.dmg_file = compressed_dmg
+
+    def adjust_dmg_view(self, dmg_volume_name):
+        try:
+            # TODO: Use only one applescript file. Remove one for osx 10.5.
+            f = open(os.path.join(self.script_path, 'applescript-adjust-dmg-view.master'))
+            p = Popen([self.osascript], stdin=PIPE)
+            p.communicate(bytes(f.read() % (dmg_volume_name, 'OpenLP'), 'utf-8'))
+            f.close()
+            result = p.returncode
+            if (result != 0):
+                self._print('Adjusting dmg view failed (non-zero exit code).')
+        except (IOError, OSError):
+            self._print('Adjusting dmg view failed.')
+
+    def main(self):
+        """
+        The main function to run the Mac OS X builder.
+        """
+        self._print_verbose('OpenLP main script: ......%s', self.openlp_script)
+        self._print_verbose('Script path: .............%s', os.path.split(os.path.abspath(__file__))[0])
+        self._print_verbose('Branch path: .............%s', self.branch_path)
+        self._print_verbose('Source path: .............%s', self.source_path)
+        self._print_verbose('"dist.app" path: .........%s', self.dist_app_path)
+        self._print_verbose('"dist" path: .............%s', self.dist_path)
+        self._print_verbose('"hooks" path: ............%s', self.hooks_path)
+        self._print_verbose('PyInstaller: .............%s', self.pyinstaller)
+        self._print_verbose('Documentation branch path:%s', self.docs_path)
+        self._print_verbose('Mudraw binary ............%s', self.mudraw_bin)
+        self._print_verbose('')
+        if not self.args.skip_update:
+            self.update_code()
+        self.run_pyinstaller()
+        self.write_version_file()
+        self.copy_mac_bundle_files()
+        self.copy_default_theme()
+        self.copy_plugins()
+        self.copy_media_player()
+        # TODO creating help on Mac
+        if os.path.exists(self.manual_path):
+            self.run_sphinx()
+        else:
+            self._print('')
+            self._print('WARNING: Documentation trunk not found. Mac OS X')
+            self._print('         Help file will not be included in build')
+            self._print('')
+        self.copy_macosx_files()
+        if not self.args.skip_translations:
+            if self.args.update_translations:
+                self.update_translations()
+            self.compile_translations()
+        self.create_dmg_file()
+
+        self._print('Done.')
+        raise SystemExit()
+
+
+if __name__ == '__main__':
+    MacosxBuilder().main()

=== added directory 'pyinstaller-hooks'
=== added file 'pyinstaller-hooks/hook-openlp.core.ui.media.py'
--- pyinstaller-hooks/hook-openlp.core.ui.media.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.core.ui.media.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.core.ui.media.phononplayer',
+                 'openlp.core.ui.media.vlcplayer',
+                 'openlp.core.ui.media.webkitplayer']

=== added file 'pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py'
--- pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.plugins.presentations.lib.impresscontroller',
+                 'openlp.plugins.presentations.lib.pdfcontroller',
+                 'openlp.plugins.presentations.lib.powerpointcontroller',
+                 'openlp.plugins.presentations.lib.pptviewcontroller']

=== added file 'pyinstaller-hooks/hook-openlp.py'
--- pyinstaller-hooks/hook-openlp.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.plugins.songs.songsplugin',
+                 'openlp.plugins.bibles.bibleplugin',
+                 'openlp.plugins.presentations.presentationplugin',
+                 'openlp.plugins.media.mediaplugin',
+                 'openlp.plugins.images.imageplugin',
+                 'openlp.plugins.custom.customplugin',
+                 'openlp.plugins.songusage.songusageplugin',
+                 'openlp.plugins.remotes.remoteplugin',
+                 'openlp.plugins.alerts.alertsplugin']

=== added file 'pyinstaller-hooks/rthook_openlp_pyqt4.py'
--- pyinstaller-hooks/rthook_openlp_pyqt4.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/rthook_openlp_pyqt4.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2013 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+
+# PyQt4 supports two different APIs: version 1 (default on Python 2) and
+# version 2 (default on Python 3). For OpenLP we want to use the version 2 API
+# with Python 2.
+#
+# The v2 API has to be set before any import of PyQt4 modules.
+# However, the executable created by PyInstaller overrides qt_plugins directory
+# (it uses PyQt4) before any code from OpenLP gets executed.
+#
+# The following code is bundled with the created executable and executed
+# before any other code.
+
+import sip
+
+sip.setapi('QDate', 2)
+sip.setapi('QDateTime', 2)
+sip.setapi('QString', 2)
+sip.setapi('QTextStream', 2)
+sip.setapi('QTime', 2)
+sip.setapi('QUrl', 2)
+sip.setapi('QVariant', 2)

=== added directory 'windows'
=== added file 'windows/LICENSE.txt'
--- windows/LICENSE.txt	1970-01-01 00:00:00 +0000
+++ windows/LICENSE.txt	2014-10-27 01:58:14 +0000
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'windows/OpenLP-2.0.iss.default'
--- windows/OpenLP-2.0.iss.default	1970-01-01 00:00:00 +0000
+++ windows/OpenLP-2.0.iss.default	2014-10-27 01:58:14 +0000
@@ -0,0 +1,182 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define AppName "OpenLP"
+#define AppVerName "OpenLP %(display_version)s"
+#define AppPublisher "OpenLP Developers"
+#define AppURL "http://openlp.org/";
+#define AppExeName "OpenLP.exe"
+
+#define FileHandle FileOpen("%(branch)s\dist\OpenLP\.version")
+#define FileLine FileRead(FileHandle)
+#define RealVersion FileLine
+#expr FileClose(FileHandle)
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485}
+AppName={#AppName}
+AppVerName={#AppVerName}
+AppPublisher={#AppPublisher}
+AppPublisherURL={#AppURL}
+AppSupportURL={#AppURL}
+AppUpdatesURL={#AppURL}
+DefaultDirName={pf}\{#AppName}
+DefaultGroupName={#AppVerName}
+AllowNoIcons=true
+LicenseFile=LICENSE.txt
+OutputDir=%(branch)s\dist\
+OutputBaseFilename=OpenLP-{#RealVersion}-setup
+Compression=lzma/Max
+SolidCompression=true
+SetupIconFile=OpenLP.ico
+WizardImageFile=WizImageBig.bmp
+WizardSmallImageFile=WizImageSmall.bmp
+ChangesAssociations=true
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl
+Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl
+Name: catalan; MessagesFile: compiler:Languages\Catalan.isl
+Name: czech; MessagesFile: compiler:Languages\Czech.isl
+Name: danish; MessagesFile: compiler:Languages\Danish.isl
+Name: dutch; MessagesFile: compiler:Languages\Dutch.isl
+Name: finnish; MessagesFile: compiler:Languages\Finnish.isl
+Name: french; MessagesFile: compiler:Languages\French.isl
+Name: german; MessagesFile: compiler:Languages\German.isl
+Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl
+Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl
+Name: italian; MessagesFile: compiler:Languages\Italian.isl
+Name: japanese; MessagesFile: compiler:Languages\Japanese.isl
+Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl
+Name: polish; MessagesFile: compiler:Languages\Polish.isl
+Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl
+Name: russian; MessagesFile: compiler:Languages\Russian.isl
+Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl
+Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
+
+[Tasks]
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
+Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1
+
+[Files]
+Source: %(branch)s\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
+; DLL used to check if the target program is running at install time
+Source: psvince.dll; flags: dontcopy
+; psvince is installed in {app} folder, so it will be loaded at
+; uninstall time to check if the target program is running
+Source: psvince.dll; DestDir: {app}
+
+[Icons]
+Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
+Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
+Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm'))
+Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
+Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
+Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon
+
+[Run]
+Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent
+
+[Registry]
+Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue
+Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey
+Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0
+Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1"""
+
+[UninstallDelete]
+; Remove support directory created when program is run:
+Type: filesandordirs; Name: {app}\support
+; Remove program directory if empty:
+Name: {app}; Type: dirifempty
+
+[Code]
+// Function to call psvince.dll at install time
+function IsModuleLoadedInstall(modulename: AnsiString ):  Boolean;
+external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
+
+// Function to call psvince.dll at uninstall time
+function IsModuleLoadedUninstall(modulename: AnsiString ):  Boolean;
+external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
+
+function GetUninstallString(): String;
+var
+  sUnInstPath: String;
+  sUnInstallString: String;
+begin
+  sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
+  sUnInstallString := '';
+  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
+    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
+  Result := sUnInstallString;
+end;
+
+function IsUpgrade(): Boolean;
+begin
+  Result := (GetUninstallString() <> '');
+end;
+
+// Return Values:
+// 1 - uninstall string is empty
+// 2 - error executing the UnInstallString
+// 3 - successfully executed the UnInstallString
+function UnInstallOldVersion(): Integer;
+var
+  sUnInstallString: String;
+  iResultCode: Integer;
+begin
+  Result := 0;
+  sUnInstallString := GetUninstallString();
+  if sUnInstallString <> '' then
+  begin
+    sUnInstallString := RemoveQuotes(sUnInstallString);
+    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
+      Result := 3
+    else
+      Result := 2;
+  end
+  else
+    Result := 1;
+end;
+
+function InitializeSetup(): Boolean;
+begin
+  Result := true;
+  while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do
+  begin
+    if MsgBox( 'Openlp is currently running, please close it to continue the install.',
+      mbError, MB_OKCANCEL ) =  IDCANCEL then
+	begin
+	  Result := false;
+	end;
+  end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+  if (CurStep=ssInstall) then
+  begin
+    if (IsUpgrade()) then
+    begin
+      UnInstallOldVersion();
+    end;
+  end;
+end;
+
+function InitializeUninstall(): Boolean;
+begin
+  Result := true;
+  while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do
+  begin
+    if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.',
+      mbError, MB_OKCANCEL ) =  IDCANCEL then
+	begin
+	  Result := false;
+	end;
+  end;
+// Unload psvince.dll, otherwise it is not deleted
+  UnloadDLL(ExpandConstant('{app}\psvince.dll'));
+end;

=== added file 'windows/OpenLP.ico'
Binary files windows/OpenLP.ico	1970-01-01 00:00:00 +0000 and windows/OpenLP.ico	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLP.reg'
Binary files windows/OpenLP.reg	1970-01-01 00:00:00 +0000 and windows/OpenLP.reg	2014-10-27 01:58:14 +0000 differ
=== added directory 'windows/OpenLPPortable'
=== added directory 'windows/OpenLPPortable/App'
=== added directory 'windows/OpenLPPortable/App/Appinfo'
=== added directory 'windows/OpenLPPortable/App/Appinfo/Launcher'
=== added file 'windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini'
--- windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini	2014-10-27 01:58:14 +0000
@@ -0,0 +1,10 @@
+[Launch]
+ProgramExecutable=OpenLP\OpenLP.exe
+CommandLineArguments="-p"
+WaitForProgram=False
+WorkingDirectory=%PAL:AppDir%\AppName
+SinglePortableAppInstance=True
+DirectoryMoveOK=Yes
+
+[Environment]
+PATH=%PATH%;%PAL:Drive%\VLCPortable\App\vlc

=== added file 'windows/OpenLPPortable/App/Appinfo/appicon.ico'
Binary files windows/OpenLPPortable/App/Appinfo/appicon.ico	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon.ico	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/App/Appinfo/appicon_16.png'
Binary files windows/OpenLPPortable/App/Appinfo/appicon_16.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon_16.png	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/App/Appinfo/appicon_32.png'
Binary files windows/OpenLPPortable/App/Appinfo/appicon_32.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon_32.png	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/App/Readme.txt'
--- windows/OpenLPPortable/App/Readme.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/App/Readme.txt	2014-10-27 01:58:14 +0000
@@ -0,0 +1,3 @@
+The files in this directory are necessary for the portable application to
+function.  There is normally no need to directly access or alter any of
+the files within these directories.

=== added directory 'windows/OpenLPPortable/Other'
=== added directory 'windows/OpenLPPortable/Other/Help'
=== added directory 'windows/OpenLPPortable/Other/Help/Images'
=== added file 'windows/OpenLPPortable/Other/Help/Images/Donation_Button.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Donation_Button.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Donation_Button.png	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Favicon.ico'
Binary files windows/OpenLPPortable/Other/Help/Images/Favicon.ico	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Favicon.ico	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png	2014-10-27 01:58:14 +0000 differ
=== added directory 'windows/OpenLPPortable/Other/Source'
=== added file 'windows/OpenLPPortable/Other/Source/LauncherLicense.txt'
--- windows/OpenLPPortable/Other/Source/LauncherLicense.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/LauncherLicense.txt	2014-10-27 01:58:14 +0000
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'windows/OpenLPPortable/Other/Source/OpenLPPortable.ini'
--- windows/OpenLPPortable/Other/Source/OpenLPPortable.ini	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/OpenLPPortable.ini	2014-10-27 01:58:14 +0000
@@ -0,0 +1,6 @@
+AdditionalParameters=
+DisableSplashScreen=false
+RunLocally=false
+
+# The above options are explained in the included readme.txt
+# This INI file is an example only and is not used unless it is placed as described in the included readme.txt

=== added file 'windows/OpenLPPortable/Other/Source/Readme.txt'
--- windows/OpenLPPortable/Other/Source/Readme.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/Readme.txt	2014-10-27 01:58:14 +0000
@@ -0,0 +1,47 @@
+The base application's source code is available from the portable app's
+homepage listed in the help.html file (if applicable).
+
+Details of most other things are available there as well.
+
+LICENSE
+=======
+
+This package's installer and launcher are released under the GPL. The launcher
+is the PortableApps.com Launcher, available with full source and documentation
+from http://portableapps.com/development. We request that developers using the
+PortableApps.com Launcher please leave this directory intact and unchanged.
+
+USER CONFIGURATION
+==================
+
+Some configuration in the PortableApps.com Launcher can be overridden by the
+user in an INI file next to OpenLPPortable.exe called OpenLPPortablePortable.ini.
+If you are happy with the default options, it is not necessary, though.  There
+is an example INI included with this package to get you started.  To use it,
+copy AppNamePortable.ini from this directory to OpenLPPortable.ini next to
+OpenLPPortable.exe. The options in the INI file are as follows:
+
+   AdditionalParameters=
+   DisableSplashScreen=false
+   RunLocally=false
+
+(There is no need for an INI header in this file; if you have one, though, it
+won't damage anything.)
+
+The AdditionalParameters entry allows you to pass additional command-line
+parameters to the application.
+
+The DisableSplashScreen entry allows you to run the launcher without the splash
+screen showing up.  The default is false.
+
+The RunLocally entry allows you to run the portable application from a read-
+only medium. This is known as Live mode. It copies what it needs to to a
+temporary directory on the host computer, runs the application, and then
+deletes it afterwards, leaving nothing behind. This can be useful for running
+the application from a CD or if you work on a computer that may have spyware or
+viruses and you'd like to keep your device set to read-only. As a consequence
+of this technique, any changes you make during the Live mode session aren't
+saved back to your device.  The default is false.
+
+There may be other values also permitted in the user configuration file by the
+portable application; refer to help.html for any details of them.

=== added file 'windows/OpenLPPortable/help.html'
--- windows/OpenLPPortable/help.html	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/help.html	2014-10-27 01:58:14 +0000
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<head>
+    <meta charset="UTF-8">
+    <title>OpenLP Portable Help</title>
+    <link rel="alternate" href="http://portableapps.com/feeds/general"; type="application/rss+xml" title="PortableApps.com">
+    <link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
+    <style type="text/css">
+        body {
+            font-family : Verdana,Arial,Helvetica,sans-serif;
+            font-size   : 76%;
+            color       : black;
+            margin      : 20px;
+            background  : #e6e8ea;
+            text-align  : center;
+        }
+        a {
+            color       : #b31616;
+            font-weight : bold;
+        }
+        a:link, a:visited, a:active {}
+        a:hover {
+            color : red;
+        }
+        h1, h2, h3, h4, h5, h6 {
+            font-family : Arial, sans-serif;
+            font-weight : normal;
+        }
+        h1 {
+            color          : #b31616;
+            font-weight    : bold;
+            letter-spacing : -2px;
+            font-size      : 2.2em;
+            border-bottom  : 1px solid silver;
+            padding-bottom : 5px;
+        }
+        h2 {
+            font-size      : 1.5em;
+            border-bottom  : 1px solid silver;
+            padding-bottom : 3px;
+            clear          : both;
+        }
+        h3 { font-size : 1.2em; }
+        h4 { font-size : 1.1em; }
+        h5 { font-size : 1.0em; }
+        h6 { font-size : 0.8em; }
+        img { border : 0; }
+        ol, ul, li, p, pre, table, tr, td, th { font-size : 1.0em; }
+        pre { font-family : monospace; }
+        strong, b { font-weight : bold; }
+        td, th {
+            border          : 1px solid #aaaaaa;
+            border-collapse : collapse;
+            padding         : 3px;
+        }
+        th {
+            background : #3667a8;
+            color      : white;
+        }
+        ol ol { list-style-type : lower-alpha; }
+        .content {
+            text-align       : left;
+            margin-left      : auto;
+            margin-right     : auto;
+            width            : 780px;
+            background-color : white;
+            border-left      : 1px solid black;
+            border-right     : 1px solid black;
+            padding          : 12px 30px;
+            line-height      : 150%;
+        }
+        .logo {
+            background   : white url("Other/Help/Images/Help_Background_Header.png") repeat-x;
+            width        : 840px;
+            margin-top   : 20px;
+            margin-left  : auto;
+            margin-right : auto;
+            text-align   : left;
+            border-right : 1px solid black;
+            border-left  : 1px solid black;
+        }
+        .footer {
+            background   : white url("Other/Help/Images/Help_Background_Footer.png") repeat-x;
+            width        : 840px;
+            height       : 16px;
+            margin-left  : auto;
+            margin-right : auto;
+            text-align   : left;
+            border-right : 1px solid black;
+            border-left  : 1px solid black;
+        }
+        .logo img {
+            padding-left : 0px;
+            border       : none;
+            position     : relative;
+            top          : -4px;
+        }
+        * html .content { width : 760px; }
+        * html .logo, * html .footer { width : 820px; }
+        .content h1 { margin : 0px; }
+        h1.hastagline { border : 0; }
+        h2.tagline {
+            color      : #747673;
+            clear      : none;
+            margin-top : 0em;
+        }
+
+            /* printer styles */
+        @media print {
+            body, .content {
+                margin  : 0;
+                padding : 0;
+            }
+            .navigation, .locator, .footer a, .message, .footer-links { display : none; }
+            .footer, .content, .header { border : none; }
+            a {
+                text-decoration : none;
+                font-weight     : normal;
+                color           : black;
+            }
+        }
+    </style>
+</head>
+
+<body>
+<div class="logo"><a href="http://portableapps.com/";><img src="Other/Help/Images/Help_Logo_Top.png" alt="PortableApps.com - Your Digital Life, Anywhere"></a></div>
+<div class="content">
+    <h1 class="hastagline">OpenLP Portable Help</h1>
+    <h2 class="tagline">Open Lyrics Projection</h2>
+    <p>OpenLP Portable is the OpenLP Lyrics Presentation program packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app";>portable app</a>, so you can manage your services on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as OpenLP, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://openlp.org";>Learn more about OpenLP...</a></p>
+
+    <p><a href="http://portableapps.com/donate";><img src="Other/Help/Images/Donation_Button.png" style="vertical-align:middle" alt="Make a Donation"></a> - Support PortableApps.com's Hosting and Development</p>
+
+    <p><a href="http://portableapps.com/node/32795";>Go to the OpenLP Portable Homepage &gt;&gt;</a></p>
+    <p><a href="http://portableapps.com/";>Get more portable apps at PortableApps.com</a></p>
+
+    <p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>
+
+    <h2>Portable App Issues</h2>
+    <ul>
+        <li><a href="http://portableapps.com/support/portable_app#downloading";>Downloading a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#installing";>Installing a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#using";>Using a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#upgrading";>Upgrading a Portable App</a></li>
+    </ul>
+    <p>You can read about advanced configuration options for the PortableApps.com Launcher in its <a href="Other/Source/Readme.txt">readme file</a>.</p>
+
+    <h2>OpenLP Help</h2>
+    <p>You can access help from within OpenLP by navigating to Help -> User Guide</p>
+    <p>Also, the following Help options are available:</p>
+    <ul>
+        <li><a href="http://openlp.org/"; target="_blank">OpenLP.org</a> - Visit the Main website for OpenLP.</li>
+        <li><a href="http://openlp.org/manual/"; target="_blank">Online Help</a> - Visit the online manual for OpenLP. (Most up-to-date documentation, internet connection required.)</li>
+        <li><a href="file:App/OpenLP/help/index.html" target="_blank">Local OpenLP Help</a> - Use the local help files (no internet connection required.)</li>
+    </ul>
+</div>
+<div class="footer"></div>
+</body>
+</html>
+

=== added file 'windows/WizImageBig.bmp'
Binary files windows/WizImageBig.bmp	1970-01-01 00:00:00 +0000 and windows/WizImageBig.bmp	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/WizImageSmall.bmp'
Binary files windows/WizImageSmall.bmp	1970-01-01 00:00:00 +0000 and windows/WizImageSmall.bmp	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/appinfo.ini.default'
--- windows/appinfo.ini.default	1970-01-01 00:00:00 +0000
+++ windows/appinfo.ini.default	2014-10-27 01:58:14 +0000
@@ -0,0 +1,32 @@
+[Format]
+Type=PortableApps.comFormat
+Version=3.0
+
+[Details]
+Name=OpenLP Portable
+AppID=OpenLPPortable
+Publisher=OpenLP.org
+Homepage=openlp.org
+Category=Utilities
+Description=Lyrics Projection
+Language=Multilingual
+
+[License]
+Shareable=true
+OpenSource=true
+Freeware=true
+CommercialUse=true
+
+[Version]
+DisplayVersion=%(display_version)s
+PackageVersion=%(package_version)s
+
+[Control]
+Icons=1
+Start=OpenLPPortable.exe
+
+[Associations]
+FileType=osz
+
+[FileTypeIcons]
+osz=app

=== added file 'windows/config.ini.default'
--- windows/config.ini.default	1970-01-01 00:00:00 +0000
+++ windows/config.ini.default	2014-10-27 01:58:14 +0000
@@ -0,0 +1,22 @@
+[executables]
+innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe
+sphinx = %(pyroot)s\Scripts\sphinx-build.exe
+pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py
+vcbuild = %(progfiles)s\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe
+htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe
+psvince = %(here)s\psvince.dll
+lrelease = %(sitepackages)s\PyQt4\bin\lrelease.exe
+portablelauncher = %(progfiles)s\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe
+portableinstaller = %(progfiles)s\PortableApps.comInstaller\PortableApps.comInstaller.exe
+mudrawbin = %(here)s\..\mupdf-1.5-windows\mudraw.exe
+
+[paths]
+branch = %(projects)s\trunk
+documentation = %(projects)s\documentation
+win32icon = %(here)s\OpenLP.ico
+hooks = %(here)s\..\pyinstaller-hooks
+portable = %(projects)s\OpenLPPortable
+
+[transifex]
+username =
+password =

=== added file 'windows/openlp.conf'
--- windows/openlp.conf	1970-01-01 00:00:00 +0000
+++ windows/openlp.conf	2014-10-27 01:58:14 +0000
@@ -0,0 +1,26 @@
+[bibles]
+status = 1
+
+[media]
+status = 1
+
+[alerts]
+status = 1
+
+[presentations]
+status = 1
+
+[custom]
+status = 1
+
+[remotes]
+status = 0
+
+[images]
+status = 1
+
+[songusage]
+status = 1
+
+[songs]
+status = 1

=== added file 'windows/psvince.dll'
Binary files windows/psvince.dll	1970-01-01 00:00:00 +0000 and windows/psvince.dll	2014-10-27 01:58:14 +0000 differ
=== added file 'windows/windows-builder.py'
--- windows/windows-builder.py	1970-01-01 00:00:00 +0000
+++ windows/windows-builder.py	2014-10-27 01:58:14 +0000
@@ -0,0 +1,648 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# 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.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+"""
+Windows Build Script
+--------------------
+
+This script is used to build the Windows binary and the accompanying installer.
+For this script to work out of the box, it depends on a number of things:
+
+Python 3.3/3.4
+
+PyQt4
+    You should already have this installed, OpenLP doesn't work without it. The
+    version the script expects is the packaged one available from River Bank
+    Computing.
+
+PyEnchant
+    This script expects the precompiled, installable version of PyEnchant to be
+    installed. You can find this on the PyEnchant site.
+
+Inno Setup 5
+    Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5"
+
+Sphinx
+    This is used to build the documentation.  The documentation trunk must be at
+    the same directory level as OpenLP trunk and named "documentation".
+
+HTML Help Workshop
+    This is used to create the help file.
+
+PyInstaller
+    PyInstaller should be a git clone of either
+    https://github.com/matysek/pyinstaller branch python3 or
+    https://github.com/pyinstaller/pyinstaller branch python3
+
+Bazaar
+    You need the command line "bzr" client installed.
+
+OpenLP
+    A checkout of the latest code, in a branch directory, which is in a Bazaar
+    shared repository directory. This means your code should be in a directory
+    structure like this: "openlp\branch-name".
+
+Visual C++ 2008 Express Edition
+    This is to build pptviewlib.dll, the library for controlling the
+    PowerPointViewer.
+
+windows-builder.py
+    This script, of course. It should be in the "windows-installer" directory
+    at the same level as OpenLP trunk.
+
+psvince.dll
+    This dll is used during the actual install of OpenLP to check if OpenLP is
+    running on the users machine prior to the setup.  If OpenLP is running,
+    the install will fail.  The dll can be obtained from here:
+
+        http://www.vincenzo.net/isxkb/index.php?title=PSVince)
+
+    The dll is presently included with this script.
+
+Mako
+    Mako Templates for Python.  This package is required for building the
+    remote plugin.  It can be installed by going to your
+    python_directory\scripts\.. and running "easy_install Mako".  If you do not
+    have easy_install, the Mako package can be obtained here:
+
+        http://www.makotemplates.org/download.html
+
+SQLAlchemy Migrate
+    Required for the databases used in OpenLP.  The package can be
+    obtained here:
+
+        http://code.google.com/p/sqlalchemy-migrate/
+
+MuPDF
+    Required for PDF support in OpenLP. Download the windows build from
+    mupdf.com, extract it, and set the mudrawbin option in the config file to
+    point to mudraw.exe
+
+Portable App Builds
+    The following are required if you are planning to make a portable build of
+    OpenLP.  The portable build conforms to the standards published by
+    PortableApps.com:
+
+        http://portableapps.com/development/portableapps.com_format
+
+    PortableApps.com Installer:
+
+        http://portableapps.com/apps/development/portableapps.com_installer
+
+    PortableApps.com Launcher:
+
+        http://portableapps.com/apps/development/portableapps.com_launcher
+
+    NSIS Portable (Unicode version):
+
+        http://portableapps.com/apps/development/nsis_portable
+"""
+
+import os
+import sys
+from shutil import copy, rmtree, move
+from distutils import dir_util
+from subprocess import Popen, PIPE
+from configparser import ConfigParser
+from argparse import ArgumentParser
+
+
+class WindowsBuilder(object):
+    """
+    The :class:`WindowsBuilder` class encapsulates everything that is needed
+    to build a Windows installer.
+    """
+
+    def __init__(self):
+        self.setup_args()
+        self.setup_system_paths()
+        self.read_config()
+        self.setup_executables()
+        self.setup_paths()
+        self.version = ''
+
+    def _print(self, text, *args):
+        """
+        Print stuff out. Later we might want to use a log file.
+        """
+        if len(args) > 0:
+            text = text % tuple(args)
+        print(text)
+
+    def _print_verbose(self, text, *args):
+        """
+        Print output, obeying "verbose" mode.
+        """
+        if self.args.verbose:
+            self._print(text, *args)
+
+    def setup_args(self):
+        """
+        Set up an argument parser and parse the command line arguments.
+        """
+        parser = ArgumentParser()
+        parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
+                            help='Specify the path to the branch you wish to build.', default=None)
+        parser.add_argument('-d', '--documentation', metavar='DOCS', dest='docs', default=None,
+                            help='Specify the path to the documentation branch.')
+        parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
+                            help='Specify the path to the configuration file.',
+                            default=os.path.abspath(os.path.join('.', 'config.ini')))
+        parser.add_argument('-u', '--skip-update', dest='skip_update', action='store_true', default=False,
+                            help='Do NOT update the branch before building.')
+        parser.add_argument('-p', '--portable', metavar='PORTABLE', dest='portable', default=None,
+                            help='Specify the path to build the portable installation.')
+        parser.add_argument('-t', '--skip-translations', dest='skip_translations', action='store_true', default=False,
+                            help='Do NOT update the language translation files.')
+        parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                            help='Print out additional information.')
+        self.args = parser.parse_args()
+
+    def read_config(self):
+        """
+        Read the configuration from the configuration file.
+        """
+        self.config = ConfigParser(defaults={
+            'pyroot': self.python_root,
+            'progfiles': self.program_files,
+            'sitepackages': self.site_packages,
+            'here': self.script_path,
+            'projects': os.path.abspath(os.path.join(self.script_path, '..', '..')),
+        })
+        self.config.read(os.path.abspath(self.args.config))
+
+    def setup_system_paths(self):
+        """
+        Set up some system paths.
+        """
+        self.script_path = os.path.dirname(os.path.abspath(__file__))
+        self.python = sys.executable
+        self.python_root = os.path.dirname(self.python)
+        self.site_packages = os.path.join(self.python_root, 'Lib', 'site-packages')
+        self.program_files = os.getenv('PROGRAMFILES')
+
+    def setup_executables(self):
+        """
+        Set up the paths to the executables we use.
+        """
+        self.innosetup = os.path.abspath(self.config.get('executables', 'innosetup'))
+        self.sphinx = os.path.abspath(self.config.get('executables', 'sphinx'))
+        self.pyinstaller = os.path.abspath(self.config.get('executables', 'pyinstaller'))
+        self.vcbuild = os.path.abspath(self.config.get('executables', 'vcbuild'))
+        self.hhc = os.path.abspath(self.config.get('executables', 'htmlhelp'))
+        self.psvince = os.path.abspath(self.config.get('executables', 'psvince'))
+        self.portableinstaller = os.path.abspath(self.config.get('executables', 'portableinstaller'))
+        self.portablelauncher = os.path.abspath(self.config.get('executables', 'portablelauncher'))
+        self.mudraw_bin = os.path.abspath(self.config.get('executables', 'mudrawbin'))
+        if os.path.exists(os.path.join(self.site_packages, 'PyQt4', 'bin')):
+            # Older versions of the PyQt4 Windows installer put their binaries
+            # in the "bin" directory
+            self.lrelease = os.path.join(self.site_packages, 'PyQt4', 'bin', 'lrelease.exe')
+        else:
+            # Newer versions of the PyQt4 Windows installer put their binaries
+            # in the base directory of the installation
+            self.lrelease = os.path.join(self.site_packages, 'PyQt4', 'lrelease.exe')
+
+    def setup_paths(self):
+        """
+        Set up a variety of paths that we use throughout the build process.
+        """
+        if self.args.branch:
+            branch_path = self.args.branch
+        else:
+            branch_path = self.config.get('paths', 'branch')
+        self.branch_path = os.path.abspath(branch_path)
+        if self.args.docs:
+            docs_path = self.args.docs
+        else:
+            docs_path = self.config.get('paths', 'documentation')
+        self.docs_path = os.path.abspath(docs_path)
+        if self.args.portable:
+            portable_path = self.args.portable
+        else:
+            try:
+                portable_path = self.config.get('paths', 'portable')
+            except:
+                portable_path = ''
+        if portable_path:
+            self.portable_path = os.path.abspath(portable_path)
+            self.args.portable = self.portable_path
+        else:
+            self.portable_path = ''
+        self.openlp_script = os.path.abspath(os.path.join(branch_path, 'openlp.py'))
+        self.hooks_path = os.path.abspath(self.config.get('paths', 'hooks'))
+        self.win32_icon = os.path.abspath(self.config.get('paths', 'win32icon'))
+        self.i18n_utils = os.path.join(self.branch_path, 'scripts', 'translation_utils.py')
+        self.source_path = os.path.join(self.branch_path, 'openlp')
+        self.manual_path = os.path.join(self.docs_path, 'manual')
+        self.manual_build_path = os.path.join(self.manual_path, 'build')
+        self.helpfile_path = os.path.join(self.manual_build_path, 'htmlhelp')
+        self.i18n_path = os.path.join(self.branch_path, 'resources', 'i18n')
+        self.winres_path = os.path.join(self.branch_path, 'resources', 'windows')
+        self.build_path = os.path.join(self.branch_path, 'build')
+        self.dist_path = os.path.join(self.branch_path, 'dist', 'OpenLP')
+        self.dist_path_pyinst_arg = os.path.join(self.branch_path, 'dist')
+        self.pptviewlib_path = os.path.join(self.source_path, 'plugins', 'presentations', 'lib', 'pptviewlib')
+
+    def update_code(self):
+        """
+        Update the code in the branch.
+        """
+        os.chdir(self.branch_path)
+        self._print('Reverting any changes to the code...')
+        bzr = Popen(('bzr', 'revert'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error reverting the code')
+        self._print('Updating the code...')
+        bzr = Popen(('bzr', 'update'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error updating the code')
+
+    def run_pyinstaller(self):
+        """
+        Run PyInstaller on the branch to build an executable.
+        """
+        self._print('Running PyInstaller...')
+        os.chdir(self.branch_path)
+        pyinstaller = Popen((self.python, self.pyinstaller,
+                             '--noconfirm',
+                             '--windowed',
+                             '--noupx',
+                             '--additional-hooks-dir', self.hooks_path,
+                             '--runtime-hook', os.path.join(self.hooks_path, 'rthook_openlp_pyqt4.py'),
+                             '--log-level=DEBUG',
+                             '--distpath', self.dist_path_pyinst_arg,
+                             '-i', self.win32_icon,
+                             '-p', self.branch_path,
+                             '-n', 'OpenLP',
+                             self.openlp_script),
+                            stdout=PIPE)
+        output = pyinstaller.communicate()[0]
+        code = pyinstaller.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running PyInstaller')
+
+    def write_version_file(self):
+        """
+        Write the version number to a file for reading once installed.
+        """
+        self._print('Writing version file...')
+        os.chdir(self.branch_path)
+        bzr = Popen(('bzr', 'tags'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr tags')
+        lines = output.splitlines()
+        if len(lines) == 0:
+            tag = '0.0.0'
+            revision = '0'
+        else:
+            tag, revision = lines[-1].decode('utf-8').split()
+        bzr = Popen(('bzr', 'log', '--line', '-r', '-1'), stdout=PIPE)
+        output, error = bzr.communicate()
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr log')
+        latest = output.decode('utf-8').split(':')[0]
+        version_string = latest == revision and tag or '%s-bzr%s' % (tag, latest)
+        # Save decimal version in case we need to do a portable build.
+        self.version = latest == revision and tag or '%s.%s' % (tag, latest)
+        version_file = open(os.path.join(self.dist_path, '.version'), 'w')
+        version_file.write(str(version_string))
+        version_file.close()
+
+    def copy_default_theme(self):
+        """
+        Copy the default theme to the correct directory for OpenLP.
+        """
+        self._print('Copying default theme...')
+        source = os.path.join(self.source_path, 'core', 'lib', 'json')
+        dest = os.path.join(self.dist_path, 'core', 'lib', 'json')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if filename.endswith('.json'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_plugins(self):
+        """
+        Copy all the plugins to the correct directory so that OpenLP sees that
+        it has plugins.
+        """
+        self._print('Copying plugins...')
+        source = os.path.join(self.source_path, 'plugins')
+        dest = os.path.join(self.dist_path, 'plugins')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_media_player(self):
+        """
+        Copy the media players to the correct directory for OpenLP.
+        """
+        self._print('Copying media player...')
+        source = os.path.join(self.source_path, 'core', 'ui', 'media')
+        dest = os.path.join(self.dist_path, 'core', 'ui', 'media')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_windows_files(self):
+        """
+        Copy all the Windows-specific files.
+        """
+        self._print('Copying extra files for Windows...')
+        self._print_verbose('... OpenLP.ico')
+        copy(os.path.join(self.script_path, 'OpenLP.ico'), os.path.join(self.dist_path, 'OpenLP.ico'))
+        self._print_verbose('... LICENSE.txt')
+        copy(os.path.join(self.script_path, 'LICENSE.txt'), os.path.join(self.dist_path, 'LICENSE.txt'))
+        self._print_verbose('... psvince.dll')
+        copy(self.psvince, os.path.join(self.dist_path, 'psvince.dll'))
+        if os.path.isfile(os.path.join(self.helpfile_path, 'OpenLP.chm')):
+            self._print_verbose('... OpenLP.chm')
+            copy(os.path.join(self.helpfile_path, 'OpenLP.chm'), os.path.join(self.dist_path, 'OpenLP.chm'))
+        else:
+            self._print('... WARNING: Windows help file not found')
+        self._print_verbose('... mudraw.exe')
+        if self.mudraw_bin and os.path.isfile(self.mudraw_bin):
+            copy(os.path.join(self.mudraw_bin), os.path.join(self.dist_path, 'mudraw.exe'))
+        else:
+            self._print('... WARNING: mudraw.exe not found')
+
+    def update_translations(self):
+        """
+        Update the translations.
+        """
+        self._print('Updating translations...')
+        if not self.config.has_section('transifex'):
+            raise Exception('No section named "transifex" found.')
+        if not self.config.has_option('transifex', 'username'):
+            raise Exception('No option named "username" found.')
+        if not self.config.has_option('transifex', 'password'):
+            raise Exception('No option named "password" found.')
+        username = self.config.get('transifex', 'username')
+        password = self.config.get('transifex', 'password')
+        os.chdir(os.path.dirname(self.i18n_utils))
+        translation_utils = Popen([self.python, self.i18n_utils, '-qdpu', '-U', username, '-P', password])
+        code = translation_utils.wait()
+        if code != 0:
+            raise Exception('Error running translation_utils.py')
+
+    def compile_translations(self):
+        """
+        Compile the translations for Qt.
+        """
+        self._print('Compiling translations...')
+        files = os.listdir(self.i18n_path)
+        if not os.path.exists(os.path.join(self.dist_path, 'i18n')):
+            os.makedirs(os.path.join(self.dist_path, 'i18n'))
+        for file in files:
+            if file.endswith('.ts'):
+                self._print_verbose('... %s', file)
+                source_path = os.path.join(self.i18n_path, file)
+                dest_path = os.path.join(self.dist_path, 'i18n', file.replace('.ts', '.qm'))
+                lconvert = Popen((self.lrelease, '-compress', '-silent', source_path, '-qm', dest_path))
+                code = lconvert.wait()
+                if code != 0:
+                    raise Exception('Error running lconvert on %s' % source_path)
+        self._print('Copying qm files...')
+        source = os.path.join(self.site_packages, 'PyQt4', 'translations')
+        files = os.listdir(source)
+        for filename in files:
+            if filename.startswith('qt_') and filename.endswith('.qm') and len(filename) == 8:
+                self._print_verbose('... %s', filename)
+                copy(os.path.join(source, filename), os.path.join(self.dist_path, 'i18n', filename))
+
+    def run_sphinx(self):
+        """
+        Run Sphinx to build an HTML Help project.
+        """
+        self._print('Deleting previous help manual build... %s', self.manual_build_path)
+        if os.path.exists(self.manual_build_path):
+            rmtree(self.manual_build_path)
+        self._print('Running Sphinx...')
+        os.chdir(self.manual_path)
+        sphinx = Popen((self.sphinx, '-b', 'htmlhelp', '-d', 'build/doctrees', 'source', 'build/htmlhelp'), stdout=PIPE)
+        output, error = sphinx.communicate()
+        code = sphinx.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running Sphinx')
+
+    def run_htmlhelp(self):
+        """
+        Run HTML Help Workshop to convert the Sphinx output into a manual.
+        """
+        self._print('Running HTML Help Workshop...')
+        os.chdir(os.path.join(self.manual_build_path, 'htmlhelp'))
+        hhc = Popen((self.hhc, 'OpenLP.chm'), stdout=PIPE)
+        output, error = hhc.communicate()
+        code = hhc.wait()
+        if code != 1:
+            self._print('Exit code:', code)
+            self._print(output)
+            raise Exception('Error running HTML Help Workshop')
+
+    def create_innosetup_file(self):
+        """
+        Create an InnoSetup file pointing to the branch being built.
+        """
+        self._print('Creating Inno Setup file...')
+        input = open(os.path.join(self.script_path, 'OpenLP-2.0.iss.default'), 'r').read()
+        output = input.replace('%(branch)s', self.branch_path)
+        output = output.replace('%(display_version)s', self.version)
+        outfile = open(os.path.join(self.script_path, 'OpenLP-2.0.iss'), 'w')
+        outfile.write(output)
+        outfile.close()
+
+    def check_portableapp_directory(self):
+        """
+        Checks the PortableApp directory structure amd creates
+        missing subdirs
+        """
+        self._print('  Checking PortableApps directory structure...')
+        launcher_path = os.path.join(self.portable_path, 'App', 'Appinfo', 'Launcher')
+        if not os.path.exists(launcher_path):
+            os.makedirs(launcher_path)
+        settings_path = os.path.join(self.portable_path, 'Data', 'Settings')
+        if not os.path.exists(settings_path):
+            os.makedirs(settings_path)
+
+    def create_portableapps_appinfo_file(self):
+        """
+        Create a Portabbleapps appinfo.ini file.
+        """
+        self._print('  Creating PortableApps appinfo file ...')
+        portable_version = self.version + '.0' * (3 - self.version.count('.'))
+        input = open(os.path.join(self.script_path, 'appinfo.ini.default'), 'r').read()
+        output = input.replace('%(display_version)s', self.version)
+        output = output.replace('%(package_version)s', portable_version)
+        outfile = open(os.path.join(self.portable_path, 'App', 'Appinfo', 'appinfo.ini'), 'w')
+        outfile.write(output)
+        outfile.close()
+
+    def run_innosetup(self):
+        """
+        Run InnoSetup to create an installer.
+        """
+        self._print('Running Inno Setup...')
+        os.chdir(self.script_path)
+        innosetup = Popen((self.innosetup, os.path.join(self.script_path, 'OpenLP-2.0.iss'), '/q'))
+        code = innosetup.wait()
+        if code != 0:
+            raise Exception('Error running Inno Setup')
+
+    def run_portableapp_builder(self):
+        """
+        Creates a portable installer.
+        1  Copies the distribution to the portable apps directory
+        2  Builds the PortableApps Launcher
+        3  Builds the PortableApps Install
+        """
+        self._print('Running PortableApps Builder...')
+        self._print('  Clearing old files')
+        # Remove previous contents of portableapp build directory.
+        if os.path.exists(self.portable_path):
+            rmtree(self.portable_path)
+        self._print('  Creating PortableApps build directory')
+        # Copy the contents of the OpenLPPortable directory to the portable
+        # build directory.
+        dir_util.copy_tree(os.path.join(self.script_path, 'OpenLPPortable'), self.portable_path)
+        self.check_portableapp_directory()
+        self.create_portableapps_appinfo_file()
+        # Copy distribution files to portableapp build directory.
+        self._print('  Copying distribution files')
+        portable_app_path = os.path.join(self.portable_path, 'App', 'OpenLP')
+        dir_util.copy_tree(self.dist_path, portable_app_path)
+        # Copy help files to portableapp build directory.
+        self._print('  Copying help files')
+        dir_util.copy_tree(self.helpfile_path, os.path.join(portable_app_path, 'help'))
+        # Build the launcher.
+        self._print('  Building PortableApps Launcher')
+        portableapps = Popen((self.portablelauncher, self.portable_path), stdout=PIPE)
+        code = portableapps.wait()
+        if code != 0:
+            raise Exception('Error creating PortableAppa Launcher')
+        # Build the portable installer.
+        self._print('  Building PortableApps Installer')
+        portableapps = Popen((self.portableinstaller, self.portable_path), stdout=PIPE)
+        code = portableapps.wait()
+        if code != 0:
+            raise Exception('Error running PortableApps Installer')
+        portable_app = os.path.abspath(os.path.join(self.portable_path, '..',
+                                                    'OpenLPPortable_%s.paf.exe' % self.version))
+        if os.path.exists(portable_app):
+            move(portable_app, os.path.abspath(os.path.join(self.dist_path, '..')))
+            self._print('  PortableApp build complete')
+        else:
+            raise Exception('PortableApp failed to build')
+
+    def build_pptviewlib(self):
+        """
+        Build the PowerPoint Viewer DLL using Visual Studio.
+        """
+        self._print('Building PPTVIEWLIB.DLL...')
+        vcbuild = Popen((self.vcbuild, '/rebuild', os.path.join(self.pptviewlib_path, 'pptviewlib.vcproj'),
+                         'Release|Win32'))
+        code = vcbuild.wait()
+        if code != 0:
+            raise Exception('Error building pptviewlib.dll')
+        copy(os.path.join(self.pptviewlib_path, 'Release', 'pptviewlib.dll'), self.pptviewlib_path)
+
+    def main(self):
+        """
+        The main function to run the Windows builder.
+        """
+        self._print_verbose('OpenLP main script: ......%s', self.openlp_script)
+        self._print_verbose('Script path: .............%s', os.path.dirname(os.path.abspath(__file__)))
+        self._print_verbose('Branch path: .............%s', self.branch_path)
+        self._print_verbose('Source path: .............%s', self.source_path)
+        self._print_verbose('Dist path: ...............%s', self.dist_path)
+        self._print_verbose('Portable path: ...........%s', self.portable_path)
+        self._print_verbose('PyInstaller: .............%s', self.pyinstaller)
+        self._print_verbose('Documentation branch path:%s', self.docs_path)
+        self._print_verbose('Help file build path: ....%s', self.helpfile_path)
+        self._print_verbose('Inno Setup path: .........%s', self.innosetup)
+        self._print_verbose('PortableApp Launcher......%s', self.portablelauncher)
+        self._print_verbose('PortableApp Installer.....%s', self.portableinstaller)
+        self._print_verbose('Windows resources: .......%s', self.winres_path)
+        self._print_verbose('VCBuild path: ............%s', self.vcbuild)
+        self._print_verbose('PPTVIEWLIB path: .........%s', self.pptviewlib_path)
+        self._print_verbose('Mudraw binary ............%s', self.mudraw_bin)
+        self._print_verbose('')
+        if not self.args.skip_update:
+            self.update_code()
+        self.build_pptviewlib()
+        self.run_pyinstaller()
+        self.write_version_file()
+        self.copy_default_theme()
+        self.copy_plugins()
+        self.copy_media_player()
+        if os.path.exists(self.manual_path):
+            self.run_sphinx()
+            self.run_htmlhelp()
+        else:
+            self._print('')
+            self._print('WARNING: Documentation trunk not found. Windows')
+            self._print('         Help file will not be included in build')
+            self._print('')
+        self.copy_windows_files()
+        if not self.args.skip_translations:
+            self.update_translations()
+        self.compile_translations()
+        self.create_innosetup_file()
+        self.run_innosetup()
+        if self.args.portable:
+            self.run_portableapp_builder()
+        self._print('Done.')
+
+
+if __name__ == '__main__':
+    WindowsBuilder().main()