# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
# Contributor: G.J.R. Timmer <gjr.timmer@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
setvar pkgname = 'postgresql'
setvar pkgver = '9.6.5'
setvar pkgrel = '0'
setvar pkgdesc = ""A sophisticated object-relational DBMS""
setvar url = ""http://www.postgresql.org/""
setvar arch = ""all""
setvar license = ""BSD""
setvar depends = ""postgresql-client""
setvar install = ""$pkgname.pre-upgrade""
setvar pkgusers = ""postgres""
setvar pkggroups = ""postgres""
setvar checkdepends = ""diffutils""
setvar depends_dev = ""libressl-dev""
setvar makedepends = ""$depends_dev libedit-dev zlib-dev libxml2-dev util-linux-dev
	openldap-dev tcl-dev perl-dev python2-dev python3-dev""
setvar subpackages = ""$pkgname-contrib $pkgname-dev $pkgname-doc libpq $pkgname-libs
	$pkgname-client $pkgname-pltcl
	$pkgname-plperl $pkgname-plperl-contrib:plperl_contrib
	$pkgname-plpython2 $pkgname-plpython2-contrib:plpython2_contrib
	$pkgname-plpython3 $pkgname-plpython3-contrib:plpython3_contrib""
setvar source = ""https://ftp.postgresql.org/pub/source/v$pkgver/$pkgname-$pkgver.tar.bz2
	initdb.patch
	perl-rpath.patch
	conf-unix_socket_directories.patch
	$pkgname.initd
	$pkgname.confd
	pg-restore.initd
	pg-restore.confd
	pltcl_create_tables.sql
	""
setvar builddir = ""$srcdir/$pkgname-$pkgver""
setvar options = ""!checkroot""

# secfixes:
#   9.6.4-r0:
#   - CVE-2017-7546
#   - CVE-2017-7547
#   - CVE-2017-7548
#   9.6.3-r0:
#   - CVE-2017-7484
#   - CVE-2017-7485
#   - CVE-2017-7486

proc prepare {
	default_prepare
	cd $builddir

	local file; for file in $pkgname.initd $pkgname.confd {
		sed "s|@VERSION@|${pkgver%.*}|" "$srcdir"/$file > $file
	}

	# XXX: Disable dblink and postgres_fdw tests. The tests fail due to
	#  some linking issue, but there's no problem in runtime. I have no
	#  clue what's wrong here.
	sed -Ei 's/^(REGRESS)/#\1/' \
		contrib/dblink/Makefile \
		contrib/postgres_fdw/Makefile

	cp -al $builddir "$builddir"~py3
}

# NOTE: plpython requires separate configure/build runs to build against
# python 2 versus python 3. Note that the installed Makefile.global will
# reflect the python 2 build, which seems appropriate since that's still
# considered the default plpython version.
proc build {
	msg "Building plpython3"

	cd "$builddir"~py3
	export PYTHON=/usr/bin/python3

	_configure
	make -C src/backend submake-errcodes
	make -C src/pl/plpython all


	msg "Building all"

	cd $builddir
	export PYTHON=/usr/bin/python2

	_configure && make world

	unset PYTHON
}

# Note: (...) instead of {...} is NOT a typo!
proc _configure _configure() (
	export CFLAGS="${CFLAGS/-Os/-O2}"
	export CPPFLAGS="${CPPFLAGS/-Os/-O2}"

	./configure \
		--build=$CBUILD \
		--host=$CHOST \
		--prefix=/usr \
		--mandir=/usr/share/man \
		--with-ldap \
		--with-libedit-preferred \
		--with-libxml \
		--with-openssl \
		--with-uuid=e2fs \
		--disable-rpath \
		--with-perl \
		--with-python \
		--with-tcl
)

proc check {
	cd $builddir

	_run_tests src/test
	_run_tests src/pl

	# Note: test_decoding fails when running in parallel.
	_run_tests contrib -j1
}

proc package {
	cd $builddir

	make DESTDIR="$pkgdir" install install-docs

	install -d -m750 -o postgres -g postgres \
		"$pkgdir"/var/lib/postgresql \
		"$pkgdir"/var/log/$pkgname

	install -D -m755 postgresql.initd \
		"$pkgdir"/etc/init.d/postgresql
	install -D -m644 postgresql.confd \
		"$pkgdir"/etc/conf.d/postgresql

	install -D -m755 "$srcdir"/pg-restore.initd \
		"$pkgdir"/etc/init.d/pg-restore
	install -D -m644 "$srcdir"/pg-restore.confd \
		"$pkgdir"/etc/conf.d/pg-restore
}

proc dev {
	default_dev

	mkdir -p "$subpkgdir"/usr/bin "$subpkgdir"/usr/lib/postgresql
	mv "$pkgdir"/usr/bin/pg_config \
		"$pkgdir"/usr/bin/ecpg \
		"$subpkgdir"/usr/bin/
	mv "$pkgdir"/usr/lib/postgresql/pgxs "$subpkgdir"/usr/lib/postgresql/
}

proc libpq {
	setvar pkgdesc = ""PostgreSQL libraries""
	setvar depends = """"

	mkdir -p "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libpq.so.* "$subpkgdir"/usr/lib/
}

proc libs {
	setvar depends = """"
	default_libs
}

proc client {
	setvar pkgdesc = ""PostgreSQL client""
	setvar depends = """"

	mkdir -p "$subpkgdir"/usr/bin
	mv \
		"$pkgdir"/usr/bin/clusterdb \
		"$pkgdir"/usr/bin/createdb \
		"$pkgdir"/usr/bin/createlang \
		"$pkgdir"/usr/bin/createuser \
		"$pkgdir"/usr/bin/dropdb \
		"$pkgdir"/usr/bin/droplang \
		"$pkgdir"/usr/bin/dropuser \
		"$pkgdir"/usr/bin/pg_basebackup \
		"$pkgdir"/usr/bin/pg_dump \
		"$pkgdir"/usr/bin/pg_dumpall \
		"$pkgdir"/usr/bin/pg_isready \
		"$pkgdir"/usr/bin/pg_receivexlog \
		"$pkgdir"/usr/bin/pg_recvlogical \
		"$pkgdir"/usr/bin/pg_restore \
		"$pkgdir"/usr/bin/psql \
		"$pkgdir"/usr/bin/reindexdb \
		"$pkgdir"/usr/bin/vacuumdb \
		"$subpkgdir"/usr/bin/
}

proc contrib {
	setvar pkgdesc = ""Extension modules distributed with PostgreSQL""
	setvar depends = """"

	cd $builddir

	# Avoid installing plperl and plpython extensions, these will be
	# installed into separate subpackages.
	sed -Ei -e 's/(.*_plperl)/#\1/' \
		-e 's/(.*_plpython)/#\1/' \
		contrib/Makefile

	make -C contrib DESTDIR="$subpkgdir" install

	mv "$subpkgdir"/usr/share/doc/postgresql/extension \
		"$pkgdir"/usr/share/doc/postgresql/
	rmdir -p "$subpkgdir"/usr/share/doc/postgresql || true
}

proc pltcl {
	setvar pkgdesc = ""PL/Tcl procedural language for PostgreSQL""
	setvar depends = ""pgtcl""

	cd $pkgdir
	_submv usr/bin/pltcl* \
		usr/lib/postgresql/pltcl.so \
		usr/share/postgresql/unknown.pltcl \
		usr/share/postgresql/extension/pltcl*

	install -m 644 "$srcdir"/pltcl_create_tables.sql \
		"$subpkgdir"/usr/share/postgresql/
}

proc plperl {
	setvar pkgdesc = ""PL/Perl procedural language for PostgreSQL""
	setvar depends = """"

	cd $pkgdir
	_submv usr/lib/postgresql/plperl.so \
		usr/share/postgresql/extension/plperl*
}

proc plperl_contrib {
	_plcontrib plperl "PL/Perl"

	cd $builddir
	make -C contrib/hstore_plperl DESTDIR="$subpkgdir" install
}

proc plpython2 {
	setvar pkgdesc = ""PL/Python2 procedural language for PostgreSQL""
	setvar depends = ""python2""

	cd $pkgdir
	_submv usr/lib/postgresql/plpython2.so \
		usr/share/postgresql/extension/plpython*
}

proc plpython2_contrib {
	_plcontrib plpython2 "PL/Python 2"

	cd $builddir
	make -C contrib/hstore_plpython DESTDIR="$subpkgdir" install
	make -C contrib/ltree_plpython DESTDIR="$subpkgdir" install

	rm "$subpkgdir"/usr/share/postgresql/extension/*plpython3*
}

proc plpython3 {
	setvar pkgdesc = ""PL/Python3 procedural language for PostgreSQL""
	setvar depends = ""python3""

	cd "$builddir"~py3
	make -C src/pl/plpython DESTDIR="$subpkgdir" install
	rm -R "$subpkgdir"/usr/include
}

proc plpython3_contrib {
	_plcontrib plpython3 "PL/Python 3"

	cd "$builddir"~py3
	make -C contrib/hstore_plpython DESTDIR="$subpkgdir" install
	make -C contrib/ltree_plpython DESTDIR="$subpkgdir" install

	cd "$subpkgdir"/usr/share/postgresql/extension/
	rm *plpython2* *plpythonu*
}

proc _plcontrib {
	local subname="$1"
	setvar pkgdesc = ""$2 extension modules distributed with PostgreSQL""
	setvar depends = ""$pkgname-$subname""
	setvar install_if = ""$pkgname-$subname=$pkgver-r$pkgrel $pkgname-contrib=$pkgver-r$pkgrel""
}

proc _run_tests {
	local path="$1"; shift

	msg "Running test suite at $path..."
	make -k -C $path $[join(ARGV)] check MAX_CONNECTIONS=5 || do {
		printf "\n%s\n\n" "Trying to find all regression.diffs files in build directory..." >&2
		find $path -name regression.diffs | while read file {
			echo "=== test failure: $file ===" >&2
			cat $file >&2
		}
		return 1
	}
}

proc _submv {
	local path; for path in "$@" {
		mkdir -p "$subpkgdir/${path%/*}"
		mv $path "$subpkgdir/$path"
	}
}

setvar sha512sums = ""ad35c27ea55b18005ea61b49d6994718df86519b3f99addd0ecb17ece1f1c34764eb5194f8961c45cfa75703d810baf54433f8538cfd43a70bd908e1e5878df9  postgresql-9.6.5.tar.bz2
0b88eee78380ed6cf543c851ac1cea5fc50bb6ef1bb51e03694003f43d2bf4e117ff06657f958d0e9c00ace3b8a6bab6ed0bd017d23f80cfd203dab33da81d46  initdb.patch
5f9d8bb4957194069d01af8ab3abc6d4d83a7e7f8bd7ebe1caae5361d621a3e58f91b14b952958138a794e0a80bc154fbb7e3e78d211e2a95b9b7901335de854  perl-rpath.patch
8439a6fdfdea0a4867daeb8bc23d6c825f30c00d91d4c39f48653f5ee77341f23282ce03a77aad94b5369700f11d2cb28d5aee360e59138352a9ab331a9f9d0f  conf-unix_socket_directories.patch
224e80f9e62843fd248e625abdd0d9fe477729ff3f9a64fc5c86dd37bb7176d3504107fbed7ce578e3a1db7f60b8cf2abf5fe4862c81f76b6d026e29ca495cfc  postgresql.initd
a6d9cba5c7270484b3a22083b2b37742faefb01b6643040050c92235840c601b2e206ebda32804937b729c6cf42c79a558b921900e52fc420df2a03b5f29e1f7  postgresql.confd
f5a1cba051e7d846c2d16703514601cb25729ed96b677c9bd0c199d64552120a8b14b238af01917fdb87106681e12dee6fff7447558155ba273e4f96be5e2892  pg-restore.initd
c14a5684e914abb3b0ee71bbf15eed71a9264deacaa404a6e3af6bfc330d93e7598624d0ed11a94263106cc660f7f54c8ff57e759033cf606a795f69ff6c1c7c  pg-restore.confd
5c9bfd9e295dcf678298bf0aa974347a7c311d6e7c2aa76a6920fcb751d01fd1ab77abbec11f3c672f927ad9deaa88e04e370c0b5cd1b60087554c474b748731  pltcl_create_tables.sql""