commit: f1b07f8816c2f0346d07468bdb4c5b9ce4ffada7 Author: Aaron W. Swenson <titanofold <AT> gentoo <DOT> org> AuthorDate: Mon Apr 17 13:09:56 2017 +0000 Commit: Aaron Swenson <titanofold <AT> gentoo <DOT> org> CommitDate: Mon Apr 17 15:40:58 2017 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=f1b07f88
dev-db/postgresql: Eselect and security related fixes Dependency bumped on app-eselect/eselect-postgresql to 2.0. Some of its work has been shifted into the ebuild as the files/links don’t change until this package is reemerge, unmerged, or updated. Security issues addressed in the initscripts per bugs 603716 and 603720. Bugs: 603716, 603720 Package-Manager: portage-2.3.0 dev-db/postgresql/files/postgresql.confd-9.2 | 65 +++++ dev-db/postgresql/files/postgresql.confd-9.3 | 65 +++++ dev-db/postgresql/files/postgresql.init-9.2 | 153 ++++++++++++ dev-db/postgresql/files/postgresql.init-9.3-r1 | 158 ++++++++++++ ...sql-9999.ebuild => postgresql-9.2.20-r1.ebuild} | 239 +++++++++++------- ...sql-9999.ebuild => postgresql-9.3.16-r1.ebuild} | 236 +++++++++++------- ...sql-9999.ebuild => postgresql-9.4.11-r1.ebuild} | 272 +++++++++++++------- ...esql-9999.ebuild => postgresql-9.5.6-r1.ebuild} | 276 ++++++++++++++------- ...esql-9999.ebuild => postgresql-9.6.2-r1.ebuild} | 273 +++++++++++++------- dev-db/postgresql/postgresql-9999.ebuild | 101 +++++--- 10 files changed, 1338 insertions(+), 500 deletions(-) diff --git a/dev-db/postgresql/files/postgresql.confd-9.2 b/dev-db/postgresql/files/postgresql.confd-9.2 new file mode 100644 index 00000000000..7753eeae3a8 --- /dev/null +++ b/dev-db/postgresql/files/postgresql.confd-9.2 @@ -0,0 +1,65 @@ +# Directory that contains the unix socket. Created and controlled by +# the related initscript. The directory created will be owned +# root:postgres with mode 1775. +# +# /run/postgresql is the default directory. +PG_SOCKET_DIRECTORY="/run/postgresql" + +# Which port and socket to bind PostgreSQL +PGPORT="5432" + +# How long to wait for server to start in seconds +START_TIMEOUT=10 + +# NICE_QUIT ignores new connections and wait for clients to disconnect from +# server before shutting down. NICE_TIMEOUT in seconds determines how long to +# wait for this to succeed. +NICE_TIMEOUT=60 + +# Forecfully disconnect clients from server and shut down. This is performed +# after NICE_QUIT. Terminated client connections have their open transactions +# rolled back. +# Set RUDE_QUIT to "NO" to disable. RUDE_TIMEOUT in seconds. +RUDE_QUIT="YES" +RUDE_TIMEOUT=30 + +# If the server still fails to shutdown, you can force it to quit by setting +# this to YES and a recover-run will execute on the next startup. +# Set FORCE_QUIT to "YES" to enable. FORCE_TIMEOUT in seconds. +FORCE_QUIT="NO" +FORCE_TIMEOUT=2 + +# Extra options to run postmaster with, e.g.: +# -N is the maximal number of client connections +# -B is the number of shared buffers and has to be at least 2x the value for -N +# Please read the man-page to postmaster for more options. Many of these +# options can be set directly in the configuration file. +#PGOPTS="-N 512 -B 1024" + +# Pass extra environment variables. If you have to export environment variables +# for the database process, this can be done here. +# Don't forget to escape quotes. +#PG_EXTRA_ENV="PGPASSFILE=\"/path/to/.pgpass\"" + +############################################################################## +# +# The following values should not be arbitrarily changed. +# +# `emerge --config dev-db/postgresql:@SLOT@' uses these values to +# determine where to create the data directory, where to place the +# configuration files, and any additional options to pass to initdb. +# +# The initscript also uses these variables to inform PostgreSQL where to find +# its data directory and configuration files. +# +############################################################################## + +# Location of configuration files +PGDATA="/etc/postgresql-@SLOT@/" + +# Where the data directory is located/to be created +DATA_DIR="/var/lib/postgresql/@SLOT@/data" + +# Additional options to pass to initdb. +# See `man initdb' for available options. +PG_INITDB_OPTS="--encoding=UTF8" diff --git a/dev-db/postgresql/files/postgresql.confd-9.3 b/dev-db/postgresql/files/postgresql.confd-9.3 new file mode 100644 index 00000000000..8b6d2a09728 --- /dev/null +++ b/dev-db/postgresql/files/postgresql.confd-9.3 @@ -0,0 +1,65 @@ +# Comma-separated list of directories that contain a unix +# socket. Created and controlled by the related initscript. The +# directories created will be owned root:postgres with mode 1775. +# +# /run/postgresql is the default directory. +PG_SOCKET_DIRECTORIES="/run/postgresql" + +# Which port and socket to bind PostgreSQL +PGPORT="5432" + +# How long to wait for server to start in seconds +START_TIMEOUT=10 + +# NICE_QUIT ignores new connections and wait for clients to disconnect from +# server before shutting down. NICE_TIMEOUT in seconds determines how long to +# wait for this to succeed. +NICE_TIMEOUT=60 + +# Forecfully disconnect clients from server and shut down. This is performed +# after NICE_QUIT. Terminated client connections have their open transactions +# rolled back. +# Set RUDE_QUIT to "NO" to disable. RUDE_TIMEOUT in seconds. +RUDE_QUIT="YES" +RUDE_TIMEOUT=30 + +# If the server still fails to shutdown, you can force it to quit by setting +# this to YES and a recover-run will execute on the next startup. +# Set FORCE_QUIT to "YES" to enable. FORCE_TIMEOUT in seconds. +FORCE_QUIT="NO" +FORCE_TIMEOUT=2 + +# Extra options to run postmaster with, e.g.: +# -N is the maximal number of client connections +# -B is the number of shared buffers and has to be at least 2x the value for -N +# Please read the man-page to postmaster for more options. Many of these +# options can be set directly in the configuration file. +#PGOPTS="-N 512 -B 1024" + +# Pass extra environment variables. If you have to export environment variables +# for the database process, this can be done here. +# Don't forget to escape quotes. +#PG_EXTRA_ENV="PGPASSFILE=\"/path/to/.pgpass\"" + +############################################################################## +# +# The following values should not be arbitrarily changed. +# +# `emerge --config dev-db/postgresql:@SLOT@' uses these values to +# determine where to create the data directory, where to place the +# configuration files, and any additional options to pass to initdb. +# +# The initscript also uses these variables to inform PostgreSQL where to find +# its data directory and configuration files. +# +############################################################################## + +# Location of configuration files +PGDATA="/etc/postgresql-@SLOT@/" + +# Where the data directory is located/to be created +DATA_DIR="/var/lib/postgresql/@SLOT@/data" + +# Additional options to pass to initdb. +# See `man initdb' for available options. +PG_INITDB_OPTS="--encoding=UTF8" diff --git a/dev-db/postgresql/files/postgresql.init-9.2 b/dev-db/postgresql/files/postgresql.init-9.2 new file mode 100755 index 00000000000..0b257049008 --- /dev/null +++ b/dev-db/postgresql/files/postgresql.init-9.2 @@ -0,0 +1,153 @@ +#!/sbin/openrc-run +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +extra_started_commands="reload promote" + +PG_CTL="/usr/@LIBDIR@/postgresql-@SLOT@/bin/pg_ctl" + +description="PostgreSQL @SLOT@ -- the world's most advanced open source database -- +${RC_SERVICE} is a wrapper around pg_ctl with additional administrative checks +and convenience" + +get_config() { + [ -f "${PGDATA%/}/postgresql.conf" ] || return 1 + + eval echo $(sed -e 's:#.*::' "${PGDATA%/}/postgresql.conf" \ + | awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }') +} + +depend() { + use net + provide postgresql + + if [ "$(get_config log_destination)" = "syslog" ]; then + use logger + fi +} + +configured_port=$(get_config port) +: ${configured_port:=${PGPORT}} + +checkconfig() { + # Check that DATA_DIR has been set + if [ -z "${DATA_DIR}" ] ; then + eerror "DATA_DIR not set" + eerror "HINT: Perhaps you need to update /etc/conf.d/postgresql-@SLOT@" + return 1 + fi + + # Check that DATA_DIR exists + if [ ! -d "${DATA_DIR}" ] ; then + eerror "Directory not found: ${DATA_DIR}" + eerror "HINT: Ensure that DATA_DIR points to the right path." + eerror "HINT: Or perhaps you need to create the database cluster:" + eerror " emerge --config dev-db/postgresql:@SLOT@" + return 1 + fi + + # Check for the existence of PostgreSQL's config files, and set the + # proper mode and ownership. + # Only three files should be checked as potentially other files + # may be in PGDATA that should not be touched. + local file + for file in postgresql pg_hba pg_ident ; do + file="${PGDATA%/}/${file}.conf" + if [ -f "${file}" ] ; then + checkpath -f -m 0600 -o postgres:postgres "${file}" + else + eerror "${file} not found" + eerror "HINT: mv ${DATA_DIR%/}/*.conf ${PGDATA}" + return 1 + fi + done + + # Set the proper permission for the socket path and create it if + # it doesn't exist. + checkpath -d -m 1775 -o root:postgres "${PG_SOCKET_DIRECTORY}" + if [ -e "${PG_SOCKET_DIRECTORY%/}/.s.PGSQL.${configured_port}" ] ; then + eerror "Socket conflict." + eerror "A server is already listening on:" + eerror " ${PG_SOCKET_DIRECTORY%/}/.s.PGSQL.${configured_port}" + eerror "HINT: Change PGPORT to listen on a different socket." + return 1 + fi +} + +start() { + checkconfig || return 1 + + ebegin "Starting PostgreSQL @SLOT@" + + rm -f "${DATA_DIR%/}/postmaster.pid" + + su - postgres -c \ + "PGPORT=${configured_port} ${PG_EXTRA_ENV} ${PG_CTL} start \ + -s -w -t ${START_TIMEOUT} -l ${DATA_DIR%/}/postmaster.log \ + -D ${PGDATA} \ + -o '--data-directory=${DATA_DIR} \ + --unix-socket-directory=${PG_SOCKET_DIRECTORY} \ + ${PGOPTS}'" + + local retval=$? + + if [ $retval -ne 0 ] ; then + eerror "Check the log for a possible explanation of the above error." + eerror "The log may be located at:" + eerror " ${DATA_DIR%/}/postmaster.log" + eerror "Or wherever you configured PostgreSQL @SLOT@ to log." + fi + + eend $retval +} + +stop() { + local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} )) + ebegin "Stopping PostgreSQL @SLOT@ (this can take up to ${seconds} seconds)" + + su - postgres -c \ + "${PG_CTL} stop -t ${NICE_TIMEOUT} -s -D ${DATA_DIR} -m smart" + local retval=$? + + if [ "${RUDE_QUIT}" != "NO" -a ${retval} -ne 0 ] ; then + einfo "Previous attempt failed. Trying RUDE_QUIT." + su - postgres -c \ + "${PG_CTL} stop -t ${RUDE_TIMEOUT} -s -D ${DATA_DIR} -m fast" + retval=$? + fi + + if [ "${FORCE_QUIT}" = "YES" -a ${retval} -ne 0 ] ; then + einfo "Previous step failed. Trying FORCE_QUIT." + ewarn "A recover-run might be executed on next startup." + su - postgres -c \ + "${PG_CTL} stop -t ${FORCE_TIMEOUT} -s -D ${DATA_DIR} -m immediate" + retval=$? + fi + + eend ${retval} +} + +status() { + ebegin "Checking PostgreSQL @SLOT@ status" + su - postgres -c "${PG_CTL} status -D ${DATA_DIR}" + eend $? +} + +description_reload="Simply sends the postgres process a SIGHUP signal, causing + it to reread its configuration files (postgresql.conf, pg_hba.conf, + etc.). This allows changing of configuration-file options that do not + require a complete restart to take effect." +reload() { + ebegin "Reloading PostgreSQL @SLOT@ configuration" + su - postgres -c "${PG_CTL} reload -s -D ${DATA_DIR}" + eend $? +} + +description_promote="If the server is in standby, it is commanded to exit + recovery and begin read-write operations." +promote() { + ebegin "Promoting PostgreSQL @SLOT@" + su - postgres -c "${PG_CTL} promote -s -D ${DATA_DIR}" + eend $? +} diff --git a/dev-db/postgresql/files/postgresql.init-9.3-r1 b/dev-db/postgresql/files/postgresql.init-9.3-r1 new file mode 100755 index 00000000000..b7a08990bf6 --- /dev/null +++ b/dev-db/postgresql/files/postgresql.init-9.3-r1 @@ -0,0 +1,158 @@ +#!/sbin/openrc-run +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +extra_started_commands="reload promote" + +PG_CTL="/usr/@LIBDIR@/postgresql-@SLOT@/bin/pg_ctl" + +description="PostgreSQL @SLOT@ -- the world's most advanced open source database -- +${RC_SERVICE} is a wrapper around pg_ctl with additional administrative checks +and convenience" + +get_config() { + [ -f "${PGDATA%/}/postgresql.conf" ] || return 1 + + eval echo $(sed -e 's:#.*::' "${PGDATA%/}/postgresql.conf" \ + | awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }') +} + +depend() { + use net + provide postgresql + + if [ "$(get_config log_destination)" = "syslog" ]; then + use logger + fi +} + +configured_port=$(get_config port) +: ${configured_port:=${PGPORT}} + +checkconfig() { + # Check that DATA_DIR has been set + if [ -z "${DATA_DIR}" ] ; then + eerror "DATA_DIR not set" + eerror "HINT: Perhaps you need to update /etc/conf.d/postgresql-@SLOT@" + return 1 + fi + + # Check that DATA_DIR exists + if [ ! -d "${DATA_DIR}" ] ; then + eerror "Directory not found: ${DATA_DIR}" + eerror "HINT: Ensure that DATA_DIR points to the right path." + eerror "HINT: Or perhaps you need to create the database cluster:" + eerror " emerge --config dev-db/postgresql:@SLOT@" + return 1 + fi + + # Check for the existence of PostgreSQL's config files, and set the + # proper mode and ownership. + # Only three files should be checked as potentially other files + # may be in PGDATA that should not be touched. + local file + for file in postgresql pg_hba pg_ident ; do + file="${PGDATA%/}/${file}.conf" + if [ -f "${file}" ] ; then + checkpath -f -m 0600 -o postgres:postgres "${file}" + else + eerror "${file} not found" + eerror "HINT: mv ${DATA_DIR%/}/*.conf ${PGDATA}" + return 1 + fi + done + + # Set the proper permission for the socket paths and create it if + # it doesn't exist. + set -f; IFS=',' + local s + for s in ${PG_SOCKET_DIRECTORIES}; do + checkpath -d -m 1775 -o root:postgres "${s}" + if [ -e "${s%/}/.s.PGSQL.${configured_port}" ] ; then + eerror "Socket conflict." + eerror "A server is already listening on:" + eerror " ${s%/}/.s.PGSQL.${configured_port}" + eerror "HINT: Change PGPORT to listen on a different socket." + return 1 + fi + done + set +f; unset IFS +} + +start() { + checkconfig || return 1 + + ebegin "Starting PostgreSQL @SLOT@" + + rm -f "${DATA_DIR%/}/postmaster.pid" + + su - postgres -c \ + "PGPORT=${configured_port} ${PG_EXTRA_ENV} ${PG_CTL} start \ + -s -w -t ${START_TIMEOUT} -l ${DATA_DIR%/}/postmaster.log \ + -D ${PGDATA} \ + -o '--data-directory=${DATA_DIR} \ + --unix-socket-directories=${PG_SOCKET_DIRECTORIES} \ + ${PGOPTS}'" + + local retval=$? + + if [ $retval -ne 0 ] ; then + eerror "Check the log for a possible explanation of the above error." + eerror "The log may be located at:" + eerror " ${DATA_DIR%/}/postmaster.log" + eerror "Or wherever you configured PostgreSQL @SLOT@ to log." + fi + + eend $retval +} + +stop() { + local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} )) + ebegin "Stopping PostgreSQL @SLOT@ (this can take up to ${seconds} seconds)" + + su - postgres -c \ + "${PG_CTL} stop -t ${NICE_TIMEOUT} -s -D ${DATA_DIR} -m smart" + local retval=$? + + if [ "${RUDE_QUIT}" != "NO" -a ${retval} -ne 0 ] ; then + einfo "Previous attempt failed. Trying RUDE_QUIT." + su - postgres -c \ + "${PG_CTL} stop -t ${RUDE_TIMEOUT} -s -D ${DATA_DIR} -m fast" + retval=$? + fi + + if [ "${FORCE_QUIT}" = "YES" -a ${retval} -ne 0 ] ; then + einfo "Previous step failed. Trying FORCE_QUIT." + ewarn "A recover-run might be executed on next startup." + su - postgres -c \ + "${PG_CTL} stop -t ${FORCE_TIMEOUT} -s -D ${DATA_DIR} -m immediate" + retval=$? + fi + + eend ${retval} +} + +status() { + ebegin "Checking PostgreSQL @SLOT@ status" + su - postgres -c "${PG_CTL} status -D ${DATA_DIR}" + eend $? +} + +description_reload="Simply sends the postgres process a SIGHUP signal, causing + it to reread its configuration files (postgresql.conf, pg_hba.conf, + etc.). This allows changing of configuration-file options that do not + require a complete restart to take effect." +reload() { + ebegin "Reloading PostgreSQL @SLOT@ configuration" + su - postgres -c "${PG_CTL} reload -s -D ${DATA_DIR}" + eend $? +} + +description_promote="If the server is in standby, it is commanded to exit + recovery and begin read-write operations." +promote() { + ebegin "Promoting PostgreSQL @SLOT@" + su - postgres -c "${PG_CTL} promote -s -D ${DATA_DIR}" + eend $? +} diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9.2.20-r1.ebuild similarity index 58% copy from dev-db/postgresql/postgresql-9999.ebuild copy to dev-db/postgresql/postgresql-9.2.20-r1.ebuild index 6a995c154ba..09d00f4a78a 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9.2.20-r1.ebuild @@ -3,17 +3,16 @@ EAPI="5" -PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) +PYTHON_COMPAT=( python{2_7,3_4} ) -inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ - python-single-r1 systemd user versionator +inherit eutils flag-o-matic linux-info multilib pam prefix python-single-r1 \ + systemd user versionator -KEYWORDS="" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris" -# Fix if needed -SLOT="9.7" +SLOT="$(get_version_component_range 1-2)" -EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" LICENSE="POSTGRESQL GPL-2" DESCRIPTION="PostgreSQL RDBMS" @@ -21,7 +20,7 @@ HOMEPAGE="http://www.postgresql.org/" LINGUAS="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN zh_TW" -IUSE="kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +readline selinux +server ssl static-libs tcl threads uuid xml zlib" for lingua in ${LINGUAS}; do @@ -39,7 +38,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -60,23 +59,11 @@ zlib? ( sys-libs/zlib ) DEPEND="${CDEPEND} !!<sys-apps/sandbox-2.0 ->=dev-lang/perl-5.8 -app-text/docbook-dsssl-stylesheets -app-text/docbook-sgml-dtd:4.2 -app-text/docbook-xml-dtd:4.2 -app-text/docbook-xsl-stylesheets -app-text/openjade -dev-libs/libxml2 -dev-libs/libxslt sys-devel/bison sys-devel/flex nls? ( sys-devel/gettext ) xml? ( virtual/pkgconfig ) " -src_unpack() { - base_src_unpack - git-2_src_unpack -} RDEPEND="${CDEPEND} !dev-db/postgresql-docs:${SLOT} @@ -85,17 +72,8 @@ RDEPEND="${CDEPEND} selinux? ( sec-policy/selinux-postgresql ) " -pkg_pretend() { - ewarn "You are using a live ebuild that uses the current source code as it is" - ewarn "available from PostgreSQL's Git repository at emerge time. Given such," - ewarn "the GNU Makefiles may be altered by upstream without notice and the" - ewarn "documentation for this live version is not readily available" - ewarn "online. Ergo, the ebuild maintainers will not support building a" - ewarn "client-only and/or document-free version." -} - pkg_setup() { - CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup + use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup enewgroup postgres 70 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres @@ -111,10 +89,11 @@ src_prepare() { sed "s|\(PGSOCKET_DIR\s\+\)\"/tmp\"|\1\"${EPREFIX}/run/postgresql\"|" \ -i src/include/pg_config_manual.h || die - # Rely on $PATH being in the proper order so that the correct - # install program is used for modules utilizing PGXS in both - # hardened and non-hardened environments. (Bug #528786) - sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die + use server || epatch "${FILESDIR}/${PN}-${SLOT}-no-server.patch" + + # Fix bug 486556 where the server would crash at start up because of + # an infinite loop caused by a self-referencing symlink. + epatch "${FILESDIR}/postgresql-9.2-9.4-tz-dir-overflow.patch" if use pam ; then sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \ @@ -148,6 +127,7 @@ src_configure() { $(use_enable !pg_legacytimestamp integer-datetimes) \ $(use_enable threads thread-safety) \ $(use_with kerberos gssapi) \ + $(use_with kerberos krb5) \ $(use_with ldap) \ $(use_with pam) \ $(use_with perl) \ @@ -163,78 +143,150 @@ src_configure() { } src_compile() { - emake world + emake + emake -C contrib } src_install() { - emake DESTDIR="${D}" install-world + emake DESTDIR="${D}" install + emake DESTDIR="${D}" install -C contrib dodoc README HISTORY doc/{TODO,bug.template} + # man pages are already built, but if we have the target make them, + # they'll be generated from source before being installed so we + # manually install man pages. + # We use ${SLOT} instead of doman for postgresql.eselect + insinto /usr/share/postgresql-${SLOT}/man/ + doins -r doc/src/sgml/man{1,3,7} + if ! use server; then + # Remove man pages for non-existent binaries + for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do + rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" + done + fi + docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7} + insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.service" | \ - systemd_newunit - ${PN}-${SLOT}.service + if use doc ; then + docinto html + dodoc doc/src/sgml/html/* - newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + docinto sgml + dodoc doc/src/sgml/*.{sgml,dsl} + fi - use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + if use server; then + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.confd-9.2" | newconfd - ${PN}-${SLOT} - if use prefix ; then - keepdir /run/postgresql - fperms 0775 /run/postgresql + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.init-9.2" | newinitd - ${PN}-${SLOT} + + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.service" | \ + systemd_newunit - ${PN}-${SLOT}.service + + newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + + use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + + if use prefix ; then + keepdir /run/postgresql + fperms 0775 /run/postgresql + fi fi } +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql96). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). This + # is only necessary for 9.7 and earlier. 10 and later were never + # handled in this manner. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" + fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then + rm "${l}" || ewarn "Couldn't remove ${l}" + fi + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done +} + pkg_postinst() { postgresql-config update elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then + if use server ; then + elog + elog "Gentoo specific documentation:" + elog "https://wiki.gentoo.org/wiki/PostgreSQL" + elog + elog "Official documentation:" + elog "http://www.postgresql.org/docs/${SLOT}/static/index.html" + elog + elog "The default location of the Unix-domain socket is:" + elog " ${EROOT%/}/run/postgresql/" elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" + elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" + elog "so that it contains your preferred locale in:" + elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" + elog + elog "Then, execute the following command to setup the initial database" elog "environment:" - elog " source /etc/profile" + elog " emerge --config =${CATEGORY}/${PF}" fi - - elog - elog "Gentoo specific documentation:" - elog "https://wiki.gentoo.org/wiki/PostgreSQL" - elog - elog "Official documentation:" - elog "${EROOT%/}/usr/share/doc/${PF}/html" - elog - elog "The default location of the Unix-domain socket is:" - elog " ${EROOT%/}/run/postgresql/" - elog - elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" - elog "so that it contains your preferred locale, and other options, in:" - elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" - elog - elog "Then, execute the following command to setup the initial database" - elog "environment:" - elog " emerge --config =${CATEGORY}/${PF}" } pkg_prerm() { - if [[ -z ${REPLACED_BY_VERSION} ]] ; then + if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?" ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL" @@ -249,6 +301,8 @@ pkg_postrm() { } pkg_config() { + use server || die "USE flag 'server' not enabled. Nothing to configure." + [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \ && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/" @@ -297,21 +351,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +382,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directory/d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded @@ -371,17 +418,17 @@ pkg_config() { } src_test() { - einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" - - if [[ ${UID} -ne 0 ]] ; then + if use server && [[ ${UID} -ne 0 ]] ; then emake check einfo "If you think other tests besides the regression tests are necessary, please" einfo "submit a bug including a patch for this ebuild to enable them." else + use server || \ + ewarn 'Tests cannot be run without the "server" use flag enabled.' [[ ${UID} -eq 0 ]] || \ - ewarn "Tests cannot be run as root. Enable 'userpriv' in FEATURES." + ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.' - ewarn "Skipping." + ewarn 'Skipping.' fi } diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9.3.16-r1.ebuild similarity index 59% copy from dev-db/postgresql/postgresql-9999.ebuild copy to dev-db/postgresql/postgresql-9.3.16-r1.ebuild index 6a995c154ba..0055c0e30d9 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9.3.16-r1.ebuild @@ -3,17 +3,16 @@ EAPI="5" -PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) +PYTHON_COMPAT=( python{2_7,3_4} ) -inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ - python-single-r1 systemd user versionator +inherit eutils flag-o-matic linux-info multilib pam prefix python-single-r1 \ + systemd user versionator -KEYWORDS="" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris" -# Fix if needed -SLOT="9.7" +SLOT="$(get_version_component_range 1-2)" -EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" LICENSE="POSTGRESQL GPL-2" DESCRIPTION="PostgreSQL RDBMS" @@ -21,7 +20,7 @@ HOMEPAGE="http://www.postgresql.org/" LINGUAS="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN zh_TW" -IUSE="kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +readline selinux +server ssl static-libs tcl threads uuid xml zlib" for lingua in ${LINGUAS}; do @@ -39,7 +38,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -60,23 +59,11 @@ zlib? ( sys-libs/zlib ) DEPEND="${CDEPEND} !!<sys-apps/sandbox-2.0 ->=dev-lang/perl-5.8 -app-text/docbook-dsssl-stylesheets -app-text/docbook-sgml-dtd:4.2 -app-text/docbook-xml-dtd:4.2 -app-text/docbook-xsl-stylesheets -app-text/openjade -dev-libs/libxml2 -dev-libs/libxslt sys-devel/bison sys-devel/flex nls? ( sys-devel/gettext ) xml? ( virtual/pkgconfig ) " -src_unpack() { - base_src_unpack - git-2_src_unpack -} RDEPEND="${CDEPEND} !dev-db/postgresql-docs:${SLOT} @@ -85,17 +72,8 @@ RDEPEND="${CDEPEND} selinux? ( sec-policy/selinux-postgresql ) " -pkg_pretend() { - ewarn "You are using a live ebuild that uses the current source code as it is" - ewarn "available from PostgreSQL's Git repository at emerge time. Given such," - ewarn "the GNU Makefiles may be altered by upstream without notice and the" - ewarn "documentation for this live version is not readily available" - ewarn "online. Ergo, the ebuild maintainers will not support building a" - ewarn "client-only and/or document-free version." -} - pkg_setup() { - CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup + use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup enewgroup postgres 70 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres @@ -116,6 +94,12 @@ src_prepare() { # hardened and non-hardened environments. (Bug #528786) sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die + use server || epatch "${FILESDIR}/${PN}-${SLOT}-no-server.patch" + + # Fix bug 486556 where the server would crash at start up because of + # an infinite loop caused by a self-referencing symlink. + epatch "${FILESDIR}/postgresql-9.2-9.4-tz-dir-overflow.patch" + if use pam ; then sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \ -i src/backend/libpq/auth.c || \ @@ -148,6 +132,7 @@ src_configure() { $(use_enable !pg_legacytimestamp integer-datetimes) \ $(use_enable threads thread-safety) \ $(use_with kerberos gssapi) \ + $(use_with kerberos krb5) \ $(use_with ldap) \ $(use_with pam) \ $(use_with perl) \ @@ -163,41 +148,119 @@ src_configure() { } src_compile() { - emake world + emake + emake -C contrib } src_install() { - emake DESTDIR="${D}" install-world + emake DESTDIR="${D}" install + emake DESTDIR="${D}" install -C contrib dodoc README HISTORY doc/{TODO,bug.template} + # man pages are already built, but if we have the target make them, + # they'll be generated from source before being installed so we + # manually install man pages. + # We use ${SLOT} instead of doman for postgresql.eselect + insinto /usr/share/postgresql-${SLOT}/man/ + doins -r doc/src/sgml/man{1,3,7} + if ! use server; then + # Remove man pages for non-existent binaries + for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do + rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" + done + fi + docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7} + insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.service" | \ - systemd_newunit - ${PN}-${SLOT}.service + if use doc ; then + docinto html + dodoc doc/src/sgml/html/* - newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + docinto sgml + dodoc doc/src/sgml/*.{sgml,dsl} + fi - use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + if use server; then + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT} - if use prefix ; then - keepdir /run/postgresql - fperms 0775 /run/postgresql + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT} + + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.service" | \ + systemd_newunit - ${PN}-${SLOT}.service + + newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + + use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + + if use prefix ; then + keepdir /run/postgresql + fperms 0775 /run/postgresql + fi + fi +} + +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql96). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). This + # is only necessary for 9.7 and earlier. 10 and later were never + # handled in this manner. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then + rm "${l}" || ewarn "Couldn't remove ${l}" + fi + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done } pkg_postinst() { @@ -206,35 +269,29 @@ pkg_postinst() { elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then + if use server ; then + elog + elog "Gentoo specific documentation:" + elog "https://wiki.gentoo.org/wiki/PostgreSQL" + elog + elog "Official documentation:" + elog "http://www.postgresql.org/docs/${SLOT}/static/index.html" + elog + elog "The default location of the Unix-domain socket is:" + elog " ${EROOT%/}/run/postgresql/" elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" + elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" + elog "so that it contains your preferred locale in:" + elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" + elog + elog "Then, execute the following command to setup the initial database" elog "environment:" - elog " source /etc/profile" + elog " emerge --config =${CATEGORY}/${PF}" fi - - elog - elog "Gentoo specific documentation:" - elog "https://wiki.gentoo.org/wiki/PostgreSQL" - elog - elog "Official documentation:" - elog "${EROOT%/}/usr/share/doc/${PF}/html" - elog - elog "The default location of the Unix-domain socket is:" - elog " ${EROOT%/}/run/postgresql/" - elog - elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" - elog "so that it contains your preferred locale, and other options, in:" - elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" - elog - elog "Then, execute the following command to setup the initial database" - elog "environment:" - elog " emerge --config =${CATEGORY}/${PF}" } pkg_prerm() { - if [[ -z ${REPLACED_BY_VERSION} ]] ; then + if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?" ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL" @@ -249,6 +306,8 @@ pkg_postrm() { } pkg_config() { + use server || die "USE flag 'server' not enabled. Nothing to configure." + [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \ && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/" @@ -297,21 +356,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +387,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded @@ -371,17 +423,17 @@ pkg_config() { } src_test() { - einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" - - if [[ ${UID} -ne 0 ]] ; then + if use server && [[ ${UID} -ne 0 ]] ; then emake check einfo "If you think other tests besides the regression tests are necessary, please" einfo "submit a bug including a patch for this ebuild to enable them." else + use server || \ + ewarn 'Tests cannot be run without the "server" use flag enabled.' [[ ${UID} -eq 0 ]] || \ - ewarn "Tests cannot be run as root. Enable 'userpriv' in FEATURES." + ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.' - ewarn "Skipping." + ewarn 'Skipping.' fi } diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9.4.11-r1.ebuild similarity index 55% copy from dev-db/postgresql/postgresql-9999.ebuild copy to dev-db/postgresql/postgresql-9.4.11-r1.ebuild index 6a995c154ba..538724b3677 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9.4.11-r1.ebuild @@ -3,17 +3,16 @@ EAPI="5" -PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) +PYTHON_COMPAT=( python{2_7,3_4} ) -inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ - python-single-r1 systemd user versionator +inherit eutils flag-o-matic linux-info multilib pam prefix python-single-r1 \ + systemd user versionator -KEYWORDS="" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris" -# Fix if needed -SLOT="9.7" +SLOT="$(get_version_component_range 1-2)" -EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" LICENSE="POSTGRESQL GPL-2" DESCRIPTION="PostgreSQL RDBMS" @@ -21,7 +20,7 @@ HOMEPAGE="http://www.postgresql.org/" LINGUAS="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN zh_TW" -IUSE="kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +readline selinux +server ssl static-libs tcl threads uuid xml zlib" for lingua in ${LINGUAS}; do @@ -39,7 +38,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -53,30 +52,40 @@ ssl? ( libressl? ( dev-libs/libressl:= ) ) tcl? ( >=dev-lang/tcl-8:0= ) -uuid? ( dev-libs/ossp-uuid ) xml? ( dev-libs/libxml2 dev-libs/libxslt ) zlib? ( sys-libs/zlib ) " +# uuid flags -- depend on sys-apps/util-linux for Linux libcs, or if no +# supported libc in use depend on dev-libs/ossp-uuid. For BSD systems, +# the libc includes UUID functions. +UTIL_LINUX_LIBC=( elibc_{glibc,uclibc,musl} ) +BSD_LIBC=( elibc_{Free,Net,Open}BSD ) + +nest_usedep() { + local front back + while [[ ${#} -gt 1 ]]; do + front+="${1}? ( " + back+=" )" + shift + done + echo "${front}${1}${back}" +} + +IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}" +CDEPEND+=" +uuid? ( + ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )} + $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid) +)" + DEPEND="${CDEPEND} !!<sys-apps/sandbox-2.0 ->=dev-lang/perl-5.8 -app-text/docbook-dsssl-stylesheets -app-text/docbook-sgml-dtd:4.2 -app-text/docbook-xml-dtd:4.2 -app-text/docbook-xsl-stylesheets -app-text/openjade -dev-libs/libxml2 -dev-libs/libxslt sys-devel/bison sys-devel/flex nls? ( sys-devel/gettext ) xml? ( virtual/pkgconfig ) " -src_unpack() { - base_src_unpack - git-2_src_unpack -} RDEPEND="${CDEPEND} !dev-db/postgresql-docs:${SLOT} @@ -85,17 +94,8 @@ RDEPEND="${CDEPEND} selinux? ( sec-policy/selinux-postgresql ) " -pkg_pretend() { - ewarn "You are using a live ebuild that uses the current source code as it is" - ewarn "available from PostgreSQL's Git repository at emerge time. Given such," - ewarn "the GNU Makefiles may be altered by upstream without notice and the" - ewarn "documentation for this live version is not readily available" - ewarn "online. Ergo, the ebuild maintainers will not support building a" - ewarn "client-only and/or document-free version." -} - pkg_setup() { - CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup + use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup enewgroup postgres 70 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres @@ -116,6 +116,12 @@ src_prepare() { # hardened and non-hardened environments. (Bug #528786) sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die + use server || epatch "${FILESDIR}/${PN}-9.4.10-no-server.patch" + + # Fix bug 486556 where the server would crash at start up because of + # an infinite loop caused by a self-referencing symlink. + epatch "${FILESDIR}/postgresql-9.2-9.4-tz-dir-overflow.patch" + if use pam ; then sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \ -i src/backend/libpq/auth.c || \ @@ -137,6 +143,17 @@ src_configure() { local PO="${EPREFIX%/}" + local i uuid_config="" + if use uuid; then + for i in ${UTIL_LINUX_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=e2fs" + done + for i in ${BSD_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=bsd" + done + [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp" + fi + econf \ --prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \ --datadir="${PO}/usr/share/postgresql-${SLOT}" \ @@ -155,7 +172,7 @@ src_configure() { $(use_with readline) \ $(use_with ssl openssl) \ $(use_with tcl) \ - $(use_with uuid ossp-uuid) \ + ${uuid_config} \ $(use_with xml libxml) \ $(use_with xml libxslt) \ $(use_with zlib) \ @@ -163,41 +180,119 @@ src_configure() { } src_compile() { - emake world + emake + emake -C contrib } src_install() { - emake DESTDIR="${D}" install-world + emake DESTDIR="${D}" install + emake DESTDIR="${D}" install -C contrib dodoc README HISTORY doc/{TODO,bug.template} + # man pages are already built, but if we have the target make them, + # they'll be generated from source before being installed so we + # manually install man pages. + # We use ${SLOT} instead of doman for postgresql.eselect + insinto /usr/share/postgresql-${SLOT}/man/ + doins -r doc/src/sgml/man{1,3,7} + if ! use server; then + # Remove man pages for non-existent binaries + for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do + rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" + done + fi + docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7} + insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.service" | \ - systemd_newunit - ${PN}-${SLOT}.service + if use doc ; then + docinto html + dodoc doc/src/sgml/html/* - newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + docinto sgml + dodoc doc/src/sgml/*.{sgml,dsl} + fi - use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + if use server; then + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT} - if use prefix ; then - keepdir /run/postgresql - fperms 0775 /run/postgresql + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT} + + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.service" | \ + systemd_newunit - ${PN}-${SLOT}.service + + newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + + use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + + if use prefix ; then + keepdir /run/postgresql + fperms 0775 /run/postgresql + fi + fi +} + +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql96). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). This + # is only necessary for 9.7 and earlier. 10 and later were never + # handled in this manner. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then + rm "${l}" || ewarn "Couldn't remove ${l}" + fi + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done } pkg_postinst() { @@ -206,35 +301,29 @@ pkg_postinst() { elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then + if use server ; then + elog + elog "Gentoo specific documentation:" + elog "https://wiki.gentoo.org/wiki/PostgreSQL" elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" + elog "Official documentation:" + elog "http://www.postgresql.org/docs/${SLOT}/static/index.html" + elog + elog "The default location of the Unix-domain socket is:" + elog " ${EROOT%/}/run/postgresql/" + elog + elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" + elog "so that it contains your preferred locale in:" + elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" + elog + elog "Then, execute the following command to setup the initial database" elog "environment:" - elog " source /etc/profile" + elog " emerge --config =${CATEGORY}/${PF}" fi - - elog - elog "Gentoo specific documentation:" - elog "https://wiki.gentoo.org/wiki/PostgreSQL" - elog - elog "Official documentation:" - elog "${EROOT%/}/usr/share/doc/${PF}/html" - elog - elog "The default location of the Unix-domain socket is:" - elog " ${EROOT%/}/run/postgresql/" - elog - elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" - elog "so that it contains your preferred locale, and other options, in:" - elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" - elog - elog "Then, execute the following command to setup the initial database" - elog "environment:" - elog " emerge --config =${CATEGORY}/${PF}" } pkg_prerm() { - if [[ -z ${REPLACED_BY_VERSION} ]] ; then + if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?" ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL" @@ -249,6 +338,8 @@ pkg_postrm() { } pkg_config() { + use server || die "USE flag 'server' not enabled. Nothing to configure." + [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \ && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/" @@ -297,21 +388,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +419,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded @@ -371,17 +455,17 @@ pkg_config() { } src_test() { - einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" - - if [[ ${UID} -ne 0 ]] ; then + if use server && [[ ${UID} -ne 0 ]] ; then emake check einfo "If you think other tests besides the regression tests are necessary, please" einfo "submit a bug including a patch for this ebuild to enable them." else + use server || \ + ewarn 'Tests cannot be run without the "server" use flag enabled.' [[ ${UID} -eq 0 ]] || \ - ewarn "Tests cannot be run as root. Enable 'userpriv' in FEATURES." + ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.' - ewarn "Skipping." + ewarn 'Skipping.' fi } diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9.5.6-r1.ebuild similarity index 55% copy from dev-db/postgresql/postgresql-9999.ebuild copy to dev-db/postgresql/postgresql-9.5.6-r1.ebuild index 6a995c154ba..fdfc66fd9bd 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9.5.6-r1.ebuild @@ -5,15 +5,14 @@ EAPI="5" PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) -inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ - python-single-r1 systemd user versionator +inherit eutils flag-o-matic linux-info multilib pam prefix python-single-r1 \ + systemd user versionator -KEYWORDS="" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris" -# Fix if needed -SLOT="9.7" +SLOT="$(get_version_component_range 1-2)" -EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" LICENSE="POSTGRESQL GPL-2" DESCRIPTION="PostgreSQL RDBMS" @@ -21,7 +20,7 @@ HOMEPAGE="http://www.postgresql.org/" LINGUAS="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN zh_TW" -IUSE="kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +readline selinux +server ssl static-libs tcl threads uuid xml zlib" for lingua in ${LINGUAS}; do @@ -39,7 +38,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -53,30 +52,40 @@ ssl? ( libressl? ( dev-libs/libressl:= ) ) tcl? ( >=dev-lang/tcl-8:0= ) -uuid? ( dev-libs/ossp-uuid ) xml? ( dev-libs/libxml2 dev-libs/libxslt ) zlib? ( sys-libs/zlib ) " +# uuid flags -- depend on sys-apps/util-linux for Linux libcs, or if no +# supported libc in use depend on dev-libs/ossp-uuid. For BSD systems, +# the libc includes UUID functions. +UTIL_LINUX_LIBC=( elibc_{glibc,uclibc,musl} ) +BSD_LIBC=( elibc_{Free,Net,Open}BSD ) + +nest_usedep() { + local front back + while [[ ${#} -gt 1 ]]; do + front+="${1}? ( " + back+=" )" + shift + done + echo "${front}${1}${back}" +} + +IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}" +CDEPEND+=" +uuid? ( + ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )} + $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid) +)" + DEPEND="${CDEPEND} !!<sys-apps/sandbox-2.0 ->=dev-lang/perl-5.8 -app-text/docbook-dsssl-stylesheets -app-text/docbook-sgml-dtd:4.2 -app-text/docbook-xml-dtd:4.2 -app-text/docbook-xsl-stylesheets -app-text/openjade -dev-libs/libxml2 -dev-libs/libxslt sys-devel/bison sys-devel/flex nls? ( sys-devel/gettext ) xml? ( virtual/pkgconfig ) " -src_unpack() { - base_src_unpack - git-2_src_unpack -} RDEPEND="${CDEPEND} !dev-db/postgresql-docs:${SLOT} @@ -85,17 +94,8 @@ RDEPEND="${CDEPEND} selinux? ( sec-policy/selinux-postgresql ) " -pkg_pretend() { - ewarn "You are using a live ebuild that uses the current source code as it is" - ewarn "available from PostgreSQL's Git repository at emerge time. Given such," - ewarn "the GNU Makefiles may be altered by upstream without notice and the" - ewarn "documentation for this live version is not readily available" - ewarn "online. Ergo, the ebuild maintainers will not support building a" - ewarn "client-only and/or document-free version." -} - pkg_setup() { - CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup + use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup enewgroup postgres 70 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres @@ -116,6 +116,12 @@ src_prepare() { # hardened and non-hardened environments. (Bug #528786) sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die + use server || epatch "${FILESDIR}/${PN}-9.5.5-no-server.patch" + + # Fix bug 486556 where the server would crash at start up because of + # an infinite loop caused by a self-referencing symlink. + epatch "${FILESDIR}/postgresql-9.2-9.4-tz-dir-overflow.patch" + if use pam ; then sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \ -i src/backend/libpq/auth.c || \ @@ -137,6 +143,17 @@ src_configure() { local PO="${EPREFIX%/}" + local i uuid_config="" + if use uuid; then + for i in ${UTIL_LINUX_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=e2fs" + done + for i in ${BSD_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=bsd" + done + [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp" + fi + econf \ --prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \ --datadir="${PO}/usr/share/postgresql-${SLOT}" \ @@ -145,6 +162,7 @@ src_configure() { --mandir="${PO}/usr/share/postgresql-${SLOT}/man" \ --sysconfdir="${PO}/etc/postgresql-${SLOT}" \ --with-system-tzdata="${PO}/usr/share/zoneinfo" \ + $(use_enable !alpha spinlocks) \ $(use_enable !pg_legacytimestamp integer-datetimes) \ $(use_enable threads thread-safety) \ $(use_with kerberos gssapi) \ @@ -155,7 +173,7 @@ src_configure() { $(use_with readline) \ $(use_with ssl openssl) \ $(use_with tcl) \ - $(use_with uuid ossp-uuid) \ + ${uuid_config} \ $(use_with xml libxml) \ $(use_with xml libxslt) \ $(use_with zlib) \ @@ -163,78 +181,155 @@ src_configure() { } src_compile() { - emake world + emake + emake -C contrib } src_install() { - emake DESTDIR="${D}" install-world + emake DESTDIR="${D}" install + emake DESTDIR="${D}" install -C contrib dodoc README HISTORY doc/{TODO,bug.template} + # man pages are already built, but if we have the target make them, + # they'll be generated from source before being installed so we + # manually install man pages. + # We use ${SLOT} instead of doman for postgresql.eselect + insinto /usr/share/postgresql-${SLOT}/man/ + doins -r doc/src/sgml/man{1,3,7} + if ! use server; then + # Remove man pages for non-existent binaries + for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do + rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" + done + fi + docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7} + insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done + + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done + + if use doc ; then + docinto html + dodoc doc/src/sgml/html/* - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + docinto sgml + dodoc doc/src/sgml/*.{sgml,dsl} + fi - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.service" | \ - systemd_newunit - ${PN}-${SLOT}.service + if use server; then + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT} - newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT} - use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.service" | \ + systemd_newunit - ${PN}-${SLOT}.service - if use prefix ; then - keepdir /run/postgresql - fperms 0775 /run/postgresql + newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + + use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + + if use prefix ; then + keepdir /run/postgresql + fperms 0775 /run/postgresql + fi + fi +} + +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql96). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). This + # is only necessary for 9.7 and earlier. 10 and later were never + # handled in this manner. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then + rm "${l}" || ewarn "Couldn't remove ${l}" + fi + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done } pkg_postinst() { postgresql-config update + if use alpha && use server ; then + ewarn "PostgreSQL 9.5+ no longer has native spinlock support on Alpha platforms." + ewarn "As a result, performance will be extremely degraded." + fi + elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then + if use server ; then elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" + elog "Gentoo specific documentation:" + elog "https://wiki.gentoo.org/wiki/PostgreSQL" + elog + elog "Official documentation:" + elog "http://www.postgresql.org/docs/${SLOT}/static/index.html" + elog + elog "The default location of the Unix-domain socket is:" + elog " ${EROOT%/}/run/postgresql/" + elog + elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" + elog "so that it contains your preferred locale in:" + elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" + elog + elog "Then, execute the following command to setup the initial database" elog "environment:" - elog " source /etc/profile" + elog " emerge --config =${CATEGORY}/${PF}" fi - - elog - elog "Gentoo specific documentation:" - elog "https://wiki.gentoo.org/wiki/PostgreSQL" - elog - elog "Official documentation:" - elog "${EROOT%/}/usr/share/doc/${PF}/html" - elog - elog "The default location of the Unix-domain socket is:" - elog " ${EROOT%/}/run/postgresql/" - elog - elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" - elog "so that it contains your preferred locale, and other options, in:" - elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" - elog - elog "Then, execute the following command to setup the initial database" - elog "environment:" - elog " emerge --config =${CATEGORY}/${PF}" } pkg_prerm() { - if [[ -z ${REPLACED_BY_VERSION} ]] ; then + if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?" ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL" @@ -249,6 +344,8 @@ pkg_postrm() { } pkg_config() { + use server || die "USE flag 'server' not enabled. Nothing to configure." + [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \ && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/" @@ -297,21 +394,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +425,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded @@ -371,17 +461,17 @@ pkg_config() { } src_test() { - einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" - - if [[ ${UID} -ne 0 ]] ; then + if use server && [[ ${UID} -ne 0 ]] ; then emake check einfo "If you think other tests besides the regression tests are necessary, please" einfo "submit a bug including a patch for this ebuild to enable them." else + use server || \ + ewarn 'Tests cannot be run without the "server" use flag enabled.' [[ ${UID} -eq 0 ]] || \ - ewarn "Tests cannot be run as root. Enable 'userpriv' in FEATURES." + ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.' - ewarn "Skipping." + ewarn 'Skipping.' fi } diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9.6.2-r1.ebuild similarity index 55% copy from dev-db/postgresql/postgresql-9999.ebuild copy to dev-db/postgresql/postgresql-9.6.2-r1.ebuild index 6a995c154ba..07527caf315 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9.6.2-r1.ebuild @@ -5,15 +5,17 @@ EAPI="5" PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) -inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ - python-single-r1 systemd user versionator +inherit eutils flag-o-matic linux-info multilib pam prefix python-single-r1 \ + systemd user versionator -KEYWORDS="" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris" -# Fix if needed -SLOT="9.7" +SLOT="$(get_version_component_range 1-2)" -EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" +MY_PV=${PV/_/} +S="${WORKDIR}/${PN}-${MY_PV}" + +SRC_URI="mirror://postgresql/source/v${MY_PV}/postgresql-${MY_PV}.tar.bz2" LICENSE="POSTGRESQL GPL-2" DESCRIPTION="PostgreSQL RDBMS" @@ -21,7 +23,7 @@ HOMEPAGE="http://www.postgresql.org/" LINGUAS="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN zh_TW" -IUSE="kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp python +readline selinux +server ssl static-libs tcl threads uuid xml zlib" for lingua in ${LINGUAS}; do @@ -39,7 +41,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -53,30 +55,40 @@ ssl? ( libressl? ( dev-libs/libressl:= ) ) tcl? ( >=dev-lang/tcl-8:0= ) -uuid? ( dev-libs/ossp-uuid ) xml? ( dev-libs/libxml2 dev-libs/libxslt ) zlib? ( sys-libs/zlib ) " +# uuid flags -- depend on sys-apps/util-linux for Linux libcs, or if no +# supported libc in use depend on dev-libs/ossp-uuid. For BSD systems, +# the libc includes UUID functions. +UTIL_LINUX_LIBC=( elibc_{glibc,uclibc,musl} ) +BSD_LIBC=( elibc_{Free,Net,Open}BSD ) + +nest_usedep() { + local front back + while [[ ${#} -gt 1 ]]; do + front+="${1}? ( " + back+=" )" + shift + done + echo "${front}${1}${back}" +} + +IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}" +CDEPEND+=" +uuid? ( + ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )} + $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid) +)" + DEPEND="${CDEPEND} !!<sys-apps/sandbox-2.0 ->=dev-lang/perl-5.8 -app-text/docbook-dsssl-stylesheets -app-text/docbook-sgml-dtd:4.2 -app-text/docbook-xml-dtd:4.2 -app-text/docbook-xsl-stylesheets -app-text/openjade -dev-libs/libxml2 -dev-libs/libxslt sys-devel/bison sys-devel/flex nls? ( sys-devel/gettext ) xml? ( virtual/pkgconfig ) " -src_unpack() { - base_src_unpack - git-2_src_unpack -} RDEPEND="${CDEPEND} !dev-db/postgresql-docs:${SLOT} @@ -85,17 +97,8 @@ RDEPEND="${CDEPEND} selinux? ( sec-policy/selinux-postgresql ) " -pkg_pretend() { - ewarn "You are using a live ebuild that uses the current source code as it is" - ewarn "available from PostgreSQL's Git repository at emerge time. Given such," - ewarn "the GNU Makefiles may be altered by upstream without notice and the" - ewarn "documentation for this live version is not readily available" - ewarn "online. Ergo, the ebuild maintainers will not support building a" - ewarn "client-only and/or document-free version." -} - pkg_setup() { - CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup + use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup enewgroup postgres 70 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres @@ -116,6 +119,12 @@ src_prepare() { # hardened and non-hardened environments. (Bug #528786) sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die + use server || epatch "${FILESDIR}/${PN}-${SLOT}.1-no-server.patch" + + # Fix bug 486556 where the server would crash at start up because of + # an infinite loop caused by a self-referencing symlink. + epatch "${FILESDIR}/postgresql-9.2-9.4-tz-dir-overflow.patch" + if use pam ; then sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \ -i src/backend/libpq/auth.c || \ @@ -137,6 +146,17 @@ src_configure() { local PO="${EPREFIX%/}" + local i uuid_config="" + if use uuid; then + for i in ${UTIL_LINUX_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=e2fs" + done + for i in ${BSD_LIBC[@]}; do + use ${i} && uuid_config="--with-uuid=bsd" + done + [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp" + fi + econf \ --prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \ --datadir="${PO}/usr/share/postgresql-${SLOT}" \ @@ -155,7 +175,7 @@ src_configure() { $(use_with readline) \ $(use_with ssl openssl) \ $(use_with tcl) \ - $(use_with uuid ossp-uuid) \ + ${uuid_config} \ $(use_with xml libxml) \ $(use_with xml libxslt) \ $(use_with zlib) \ @@ -163,41 +183,119 @@ src_configure() { } src_compile() { - emake world + emake + emake -C contrib } src_install() { - emake DESTDIR="${D}" install-world + emake DESTDIR="${D}" install + emake DESTDIR="${D}" install -C contrib dodoc README HISTORY doc/{TODO,bug.template} + # man pages are already built, but if we have the target make them, + # they'll be generated from source before being installed so we + # manually install man pages. + # We use ${SLOT} instead of doman for postgresql.eselect + insinto /usr/share/postgresql-${SLOT}/man/ + doins -r doc/src/sgml/man{1,3,7} + if ! use server; then + # Remove man pages for non-existent binaries + for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do + rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" + done + fi + docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7} + insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done + + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + if use doc ; then + docinto html + dodoc doc/src/sgml/html/* - sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.service" | \ - systemd_newunit - ${PN}-${SLOT}.service + docinto sgml + dodoc doc/src/sgml/*.{sgml,dsl} + fi - newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + if use server; then + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT} - use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT} - if use prefix ; then - keepdir /run/postgresql - fperms 0775 /run/postgresql + sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ + "${FILESDIR}/${PN}.service" | \ + systemd_newunit - ${PN}-${SLOT}.service + + newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir + + use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + + if use prefix ; then + keepdir /run/postgresql + fperms 0775 /run/postgresql + fi + fi +} + +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql96). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). This + # is only necessary for 9.7 and earlier. 10 and later were never + # handled in this manner. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then + rm "${l}" || ewarn "Couldn't remove ${l}" + fi + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done } pkg_postinst() { @@ -206,35 +304,29 @@ pkg_postinst() { elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then + if use server ; then + elog + elog "Gentoo specific documentation:" + elog "https://wiki.gentoo.org/wiki/PostgreSQL" elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" + elog "Official documentation:" + elog "http://www.postgresql.org/docs/${SLOT}/static/index.html" + elog + elog "The default location of the Unix-domain socket is:" + elog " ${EROOT%/}/run/postgresql/" + elog + elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" + elog "so that it contains your preferred locale in:" + elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" + elog + elog "Then, execute the following command to setup the initial database" elog "environment:" - elog " source /etc/profile" + elog " emerge --config =${CATEGORY}/${PF}" fi - - elog - elog "Gentoo specific documentation:" - elog "https://wiki.gentoo.org/wiki/PostgreSQL" - elog - elog "Official documentation:" - elog "${EROOT%/}/usr/share/doc/${PF}/html" - elog - elog "The default location of the Unix-domain socket is:" - elog " ${EROOT%/}/run/postgresql/" - elog - elog "Before initializing the database, you may want to edit PG_INITDB_OPTS" - elog "so that it contains your preferred locale, and other options, in:" - elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}" - elog - elog "Then, execute the following command to setup the initial database" - elog "environment:" - elog " emerge --config =${CATEGORY}/${PF}" } pkg_prerm() { - if [[ -z ${REPLACED_BY_VERSION} ]] ; then + if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?" ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL" @@ -249,6 +341,8 @@ pkg_postrm() { } pkg_config() { + use server || die "USE flag 'server' not enabled. Nothing to configure." + [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \ && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/" @@ -297,21 +391,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +422,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded @@ -371,17 +458,17 @@ pkg_config() { } src_test() { - einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" - - if [[ ${UID} -ne 0 ]] ; then + if use server && [[ ${UID} -ne 0 ]] ; then emake check einfo "If you think other tests besides the regression tests are necessary, please" einfo "submit a bug including a patch for this ebuild to enable them." else + use server || \ + ewarn 'Tests cannot be run without the "server" use flag enabled.' [[ ${UID} -eq 0 ]] || \ - ewarn "Tests cannot be run as root. Enable 'userpriv' in FEATURES." + ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.' - ewarn "Skipping." + ewarn 'Skipping.' fi } diff --git a/dev-db/postgresql/postgresql-9999.ebuild b/dev-db/postgresql/postgresql-9999.ebuild index 6a995c154ba..4ef8157f431 100644 --- a/dev-db/postgresql/postgresql-9999.ebuild +++ b/dev-db/postgresql/postgresql-9999.ebuild @@ -10,8 +10,8 @@ inherit eutils flag-o-matic git-2 linux-info multilib pam prefix \ KEYWORDS="" -# Fix if needed -SLOT="9.7" +# Bump when rc released. +SLOT="10" EGIT_REPO_URI="git://git.postgresql.org/git/postgresql.git" @@ -39,7 +39,7 @@ wanted_languages() { } CDEPEND=" ->=app-eselect/eselect-postgresql-1.2.0 +>=app-eselect/eselect-postgresql-2.0 sys-apps/less virtual/libintl kerberos? ( virtual/krb5 ) @@ -174,17 +174,13 @@ src_install() { insinto /etc/postgresql-${SLOT} newins src/bin/psql/psqlrc.sample psqlrc - dodir /etc/eselect/postgresql/slots/${SLOT} - echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \ - "${ED}/etc/eselect/postgresql/slots/${SLOT}/base" - use static-libs || find "${ED}" -name '*.a' -delete sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.confd" | newconfd - ${PN}-${SLOT} + "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT} sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ - "${FILESDIR}/${PN}.init" | newinitd - ${PN}-${SLOT} + "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT} sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \ "${FILESDIR}/${PN}.service" | \ @@ -194,26 +190,74 @@ src_install() { use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session + local f bn + for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \ + -mindepth 1 -maxdepth 1) + do + bn=$(basename "${f}") + # Temporarily tack on tmp to workaround a file collision + # issue. This is only necessary for 9.7 and earlier. 10 never + # had this issue. + dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \ + "/usr/bin/${bn}${SLOT/.}tmp" + done + + local linkname mansec + for mansec in {1,3,7} ; do + for f in "${ED}"/usr/share/postgresql-${SLOT}/man/man${mansec}/* ; do + bn=$(basename "${f}") + linkname=${bn/%.${mansec}/${SLOT/.}.${mansec}} + dosym ../../postgresql-${SLOT}/man/man${mansec}/$bn \ + /usr/share/man/man${mansec}/${linkname} + done + done + if use prefix ; then keepdir /run/postgresql fperms 0775 /run/postgresql fi } +pkg_preinst() { + # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g., + # /usr/bin/psql97). They may have been created by the + # postgresql.eselect module, but they're handled within this ebuild + # now. It's alright if we momentarily delete /usr/bin/psql as it + # will be recreated by the eselect module in pkg_ppostinst(). We + # only worry about the 9.7 slot as that's the last slot that had its + # slot-specific links generated by eselect. + # + # This can be removed when 10 is the lowest slot in the tree. + local canonicalise + if type -p realpath > /dev/null; then + canonicalise=realpath + elif type -p readlink > /dev/null; then + canonicalise='readlink -f' + else + # can't die, subshell + die "No readlink nor realpath found, cannot canonicalise" + fi + + local l + # First remove any symlinks in /usr/bin that may have been created + # by the old eselect + for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do + [[ $(${canonicalise} "${l}") == *postgresql-9.7* ]] && rm "${l}" + done + + # Then move the symlinks created by the ebuild to their proper place. + for l in "${ED}"/usr/bin/*tmp ; do + mv "${l}" "${l%tmp}" \ + || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})" + done +} + pkg_postinst() { postgresql-config update elog "If you need a global psqlrc-file, you can place it in:" elog " ${EROOT%/}/etc/postgresql-${SLOT}/" - if [[ -z ${REPLACING_VERSIONS} ]] ; then - elog - elog "It looks like this is your first time installing PostgreSQL. Run the" - elog "following command in all active shells to pick up changes to the default" - elog "environment:" - elog " source /etc/profile" - fi - elog elog "Gentoo specific documentation:" elog "https://wiki.gentoo.org/wiki/PostgreSQL" @@ -297,21 +341,10 @@ pkg_config() { einfo "The database cluster will be created in:" einfo " ${DATA_DIR}" einfo - if [ -z "$PG_AUTOCONFIG" ] ; then - while [ "$correct" != "true" ] ; do - einfo "Are you ready to continue? (y/n)" - read answer - if [[ $answer =~ ^[Yy]([Ee][Ss])?$ ]] ; then - correct="true" - elif [[ $answer =~ ^[Nn]([Oo])?$ ]] ; then - die "Aborting initialization." - else - echo "Answer not recognized" - fi - done - else - einfo "PG_AUTOCONFIG set, not prompting" - fi + + ebegin "Continuing initialization in 5 seconds (Control-C to cancel)" + sleep 5 + eend 0 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then eerror "The given directory, '${DATA_DIR}', is not empty." @@ -339,6 +372,10 @@ pkg_config() { ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}" fi + # unix_socket_directory has no effect in postgresql.conf as it's + # overridden in the initscript + sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf + cat <<- EOF >> "${PGDATA%/}"/postgresql.conf # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522 # On the off-chance that you might need to work with UTF-8 encoded