On 2016-01-24 18:44, Michael Orlitzky wrote:
> On 01/24/2016 06:29 PM, Aaron W. Swenson wrote:
> > Okay, provided that the new USE_EXPAND is okay for POSTGRES_TARGETS,
> > attached are the eclasses that I'll commit to the tree.
> > 
> 
> > case ${EAPI:-0} in
> >   0|1|2|3|4) die "postgres-multi.eclass requires EAPI 5 or higher" ;;
> >   *) ;;
> > esac
> 
> Does this really work with EAPI=6? I didn't try, but it looks like it
> would need an eapply_user somewhere in src_prepare. And, pedantry
> warning, there's no such thing as "EAPI 5 or higher." The lawyers will
> tell you to do something like this instead (stolen from git-r3):
> 
>   case "${EAPI:-0}" in
>         5|6)
>                 ;;
>         *)
>                 die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
>                 ;;
>   esac
> 
> That will require an edit for every new EAPI, but prevents weird crashes
> from things like a missing eapply_user.
> 
> 

Thank you.

I've added the eapply_user to postgres-multi and modified the case
condition to match the hot goods you're selling on the sly.
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

inherit multibuild postgres
EXPORT_FUNCTIONS pkg_setup src_prepare src_compile src_install src_test


# @ECLASS: postgres-multi
# @MAINTAINER:
# PostgreSQL <pgsql-b...@gentoo.org>
# @AUTHOR: Aaron W. Swenson <titanof...@gentoo.org>
# @BLURB: An eclass to build PostgreSQL-related packages against multiple slots
# @DESCRIPTION:
# postgres-multi enables ebuilds, particularly PostgreSQL extensions, to
# build against any and all compatible PostgreSQL slots that are also
# enabled by the user. Additionally makes a developer's life easier with
# exported default functions to do the right thing.


case ${EAPI:-0} in
  0|1|2|3|4) die "postgres-multi.eclass requires EAPI 5 or higher" ;;
  *) ;;
esac


# @ECLASS-VARIABLE: POSTGRES_COMPAT
# @REQUIRED
# @DESCRIPTION:
# A Bash array containing a list of compatible PostgreSQL slots as
# defined by the developer. Must be declared before inheriting this eclass.
if ! declare -p POSTGRES_COMPAT &>/dev/null; then
        die 'Required variable POSTGRES_COMPAT not declared.'
fi

# @ECLASS-VARIABLE: _POSTGRES_UNION_SLOTS
# @INTERNAL
# @DESCRIPTION:
# A Bash array containing the union set of user-enabled slots that are
# also in POSTGRES_COMPAT.
export _POSTGRES_UNION_SLOTS=( )

# @FUNCTION _postgres-multi_multibuild_wrapper
# @INTERNAL
# @USAGE: _postgres-multi_multibuild_wrapper <command> [<arg> ...]
# @DESCRIPTION:
# For the given variant, set the values of the PG_SLOT and PG_CONFIG
# environment variables accordingly and replace any appearance of
# @PG_SLOT@ in the command and arguments with value of ${PG_SLOT}.
_postgres-multi_multibuild_wrapper() {
        debug-print-function ${FUNCNAME} "${@}"
        export PG_SLOT=${MULTIBUILD_VARIANT}
        export PG_CONFIG=$(which pg_config${MULTIBUILD_VARIANT//./})
        $(echo "${@}" | sed "s/@PG_SLOT@/${PG_SLOT}/g")
}

# @FUNCTION: postgres-multi_foreach
# @USAGE: postgres-multi_foreach <command> <arg> [<arg> ...]
# @DESCRIPTION:
# Run the given command in the package's source directory for each
# PostgreSQL slot in the union set of the developer defined
# POSTGRES_COMPAT and user-enabled slots. The PG_CONFIG environment
# variable is updated on each iteration to point to the matching
# pg_config command for the current slot. Any appearance of @PG_SLOT@ in
# the command or arguments will be substituted with the slot (e.g., 9.5)
# of the current iteration.
postgres-multi_foreach() {
        local MULTIBUILD_VARIANTS=("${_POSTGRES_UNION_SLOTS[@]}")

        multibuild_foreach_variant \
                _postgres-multi_multibuild_wrapper run_in_build_dir ${@}
}

# @FUNCTION: postgres-multi_forbest
# @USAGE: postgres-multi_forbest <command> <arg> [<arg> ...]
# @DESCRIPTION:
# Run the given command in the package's source directory for the best,
# compatible PostgreSQL slot. The PG_CONFIG environment variable is set
# to the matching pg_config command. Any appearance of @PG_SLOT@ in the
# command or arguments will be substituted with the matching slot (e.g., 9.5).
postgres-multi_forbest() {
        # POSTGRES_COMPAT is reverse sorted once in postgres.eclass so
        # element 0 has the highest slot version.
        local MULTIBUILD_VARIANTS=("${_POSTGRES_UNION_SLOTS[0]}")

        multibuild_foreach_variant \
                _postgres-multi_multibuild_wrapper run_in_build_dir ${@}
}

# @FUNCTION: postgres-multi_pkg_setup
# @USAGE: postgres-multi_pkg_setup
# @DESCRIPTION:
# Initialize internal environment variable(s). This is required if
# pkg_setup() is declared in the ebuild.
postgres-multi_pkg_setup() {
        local user_slot

        for user_slot in "${POSTGRES_COMPAT[@]}"; do
                use "postgres_targets_postgres${user_slot/\./_}" && \
                        _POSTGRES_UNION_SLOTS+=( "${user_slot}" )
        done

        if [[ "${#_POSTGRES_UNION_SLOTS[@]}" -eq "0" ]]; then
                die "One of the postgres_targets_postgresSL_OT use flags must 
be enabled"
        fi

        elog "Multibuild variants: ${_POSTGRES_UNION_SLOTS[@]}"
}

postgres-multi_src_prepare() {
        if [[ "${#_POSTGRES_UNION_SLOTS[@]}" -eq "0" ]]; then
                eerror "Internal array _POSTGRES_UNION_SLOTS is empty."
                die "Did you forget to call postgres-multi_pkg_setup?"
        fi

        eapply_user

        local MULTIBUILD_VARIANT
        local MULTIBUILD_VARIANTS=("${_POSTGRES_UNION_SLOTS[@]}")
        multibuild_copy_sources
}

postgres-multi_src_compile() {
        postgres-multi_foreach emake
}

postgres-multi_src_install() {
        postgres-multi_foreach emake install DESTDIR="${D}"
}

postgres-multi_src_test() {
        postgres-multi_foreach emake installcheck
}
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

inherit user

# @ECLASS: postgres
# @MAINTAINER:
# PostgreSQL <pgsql-b...@gentoo.org>
# @AUTHOR: Aaron W. Swenson <titanof...@gentoo.org>
# @BLURB: An eclass for PostgreSQL-related packages
# @DESCRIPTION:
# This eclass provides common utility functions that many
# PostgreSQL-related packages perform, such as checking that the
# currently selected PostgreSQL slot is within a range, adding a system
# user to the postgres system group, and generating dependencies.


case ${EAPI:-0} in
        5|6) ;;
        *) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
esac


# @ECLASS-VARIABLE: POSTGRES_COMPAT
# @DESCRIPTION:
# A Bash array containing a list of compatible PostgreSQL slots as
# defined by the developer. If declared, must be declared before
# inheriting this eclass. Example: POSTGRES_COMPAT=( 9.4 9.{5,6} )

# @ECLASS-VARIABLE: POSTGRES_USEDEP
# @DESCRIPTION:
# Add the, without brackets, 2-Style and/or 4-Style use dependencies to
# be used for POSTGRES_DEP. If declared, must be declared before
# inheriting this eclass.

# @ECLASS-VARIABLE: POSTGRES_DEP
# @DESCRIPTION:
# An automatically generated dependency string suitable for use in
# DEPEND and RDEPEND declarations.

# @ECLASS-VARIABLE: POSTGRES_REQ_USE
# @DESCRIPTION:
# An automatically generated REQUIRED_USE-compatible string built upon
# POSTGRES_COMPAT. REQUIRED_USE="... ${POSTGRES_REQ_USE}" is only
# required if the package must build against one of the PostgreSQL slots
# declared in POSTGRES_COMPAT.

if declare -p POSTGRES_COMPAT &> /dev/null ; then
        # Reverse sort the given POSTGRES_COMPAT so that the most recent
        # slot is preferred over an older slot.
        # -- do we care if dependencies are deterministic by USE flags?
        readarray -t POSTGRES_COMPAT < <(printf '%s\n' "${POSTGRES_COMPAT[@]}" 
| sort -nr)

        POSTGRES_DEP=""
        POSTGRES_REQ_USE=" || ("
        for slot in "${POSTGRES_COMPAT[@]}" ; do
                POSTGRES_DEP+=" postgres_targets_postgres${slot/\./_}? ( 
dev-db/postgresql:${slot}="
                declare -p POSTGRES_USEDEP &>/dev/null && \
                        POSTGRES_DEP+="[${POSTGRES_USEDEP}]"
                POSTGRES_DEP+=" )"

                IUSE+=" postgres_targets_postgres${slot/\./_}"
                POSTGRES_REQ_USE+=" postgres_targets_postgres${slot/\./_}"
        done
        POSTGRES_REQ_USE+=" )"
else
        POSTGRES_DEP="dev-db/postgresql:="
        declare -p POSTGRES_USEDEP &>/dev/null && \
                POSTGRES_DEP+="[${POSTGRES_USEDEP}]"
fi


# @FUNCTION: postgres_check_slot
# @DESCRIPTION:
# Verify that the currently selected PostgreSQL slot is set to one of
# the slots defined in POSTGRES_COMPAT. Automatically dies unless a
# POSTGRES_COMPAT slot is selected. Should be called in pkg_pretend().
postgres_check_slot() {
        if ! declare -p POSTGRES_COMPAT &>/dev/null; then
                die 'POSTGRES_COMPAT not declared.'
        fi

        # Don't die because we can't run postgresql-config during pretend.
        [[ "$EBUILD_PHASE" = "pretend" && -z "$(which postgresql-config 2> 
/dev/null)" ]] \
                && return 0

        if has $(postgresql-config show 2> /dev/null) "${POSTGRES_COMPAT[@]}"; 
then
                return 0
        else
                eerror "PostgreSQL slot must be set to one of: "
                eerror "    ${POSTGRES_COMPAT[@]}"
                die "Incompatible PostgreSQL slot eselected"
        fi
}

# @FUNCTION: postgres_new_user
# @DESCRIPTION:
# Creates the "postgres" system group and user -- which is separate from
# the database user -- in addition to the developer defined user. Takes
# the same arguments as "enewuser".
postgres_new_user() {
        enewgroup postgres 70
        enewuser postgres 70 /bin/bash /var/lib/postgresql postgres

        if [[ $# -gt 0 ]] ; then
                if [[ "$1" = "postgres" ]] ; then
                        ewarn "Username 'postgres' implied, skipping"
                else
                        local groups=$5
                        [[ -n "${groups}" ]] && groups+=",postgres" || 
groups="postgres"
                        enewuser "$1" "$2" "$3" "$4" "${groups}"
                fi
        fi
}

Attachment: signature.asc
Description: Digital signature

Reply via email to