>>>>> On Sat, 03 Dec 2022, Michał Górny wrote:

> --- /dev/null
> +++ b/eclass/app-alternatives.eclass
> @@ -0,0 +1,84 @@
> +# Copyright 2022 Gentoo Authors
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: app-alternatives.eclass
> +# @MAINTAINER:
> +# Michał Górny <mgo...@gentoo.org>
> +# @AUTHOR:
> +# Michał Górny <mgo...@gentoo.org>
> +# @SUPPORTED_EAPIS: 8
> +# @BLURB: Common logic for app-alternatives/*
> +# @DESCRIPTION:
> +# This eclass provides common logic shared by app-alternatives/*
> +# ebuilds.  A global ALTERNATIVES variable needs to be declared
> +# that lists available options and their respective dependencies.
> +# HOMEPAGE, S, LICENSE, SLOT, IUSE, REQUIRED_USE and RDEPEND are set.
> +# A get_alternative() function is provided that prints the determines

Grammar?

> +# the selected alternative and prints its respective flag name.
> +
> +case ${EAPI} in
> +     8) ;;
> +     *) die "${ECLASS}: EAPI ${EAPI} unsupported."

${EAPI:-0} here?

> +esac
> +
> +if [[ ! ${_APP_ALTERNATIVES_ECLASS} ]]; then
> +_APP_ALTERNATIVES_ECLASS=1
> +
> +# @ECLASS_VARIABLE: ALTERNATIVES
> +# @PRE_INHERIT
> +# @REQUIRED
> +# @DESCRIPTION:
> +# Array of "flag:dependency" pairs specifying the available
> +# alternatives.  The default provider must be listed first.
> +
> +# @FUNCTION: _app-alternatives_set_globals
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Set ebuild metadata variables.
> +_app-alternatives_set_globals() {
> +     debug-print-function ${FUNCNAME} "${@}"
> +
> +     if [[ $(declare -p ALTERNATIVES) != "declare -a"* ]]; then

The more modern (and presumably, more reliable) check would be:

        if [[ ${ALTERNATIVES@a} != *a* ]]; then

Since the eclass supports EAPI 8 only, bash-5.0 is guaranteed, so the
feature will be available.

> +             die 'ALTERNATIVES must be an array.'
> +     elif [[ ${#ALTERNATIVES[@]} -eq 0 ]]; then
> +             die 'ALTERNATIVES must not be empty.'
> +     fi
> +
> +     HOMEPAGE="https://wiki.gentoo.org/wiki/Project:Base/Alternatives";
> +     S=${WORKDIR}
> +
> +     LICENSE="CC0-1.0"
> +     SLOT="0"
> +
> +     # yep, that's a cheap hack adding '+' to the first flag
> +     IUSE="+${ALTERNATIVES[*]%%:*}"
> +     REQUIRED_USE="^^ ( ${ALTERNATIVES[*]%%:*} )"
> +     RDEPEND=""
> +
> +     local flag dep
> +     for flag in "${ALTERNATIVES[@]}"; do
> +             [[ ${flag} != *:* ]] && die "Invalid ALTERNATIVES item: ${flag}"
> +             dep=${flag#*:}
> +             flag=${flag%%:*}
> +             RDEPEND+="
> +                     ${flag}? ( ${dep} )
> +             "

Why two newlines? A single space should be enough.

> +     done
> +}
> +_app-alternatives_set_globals
> +
> +# @FUNCTION: get_alternative
> +# @DESCRIPTION:
> +# Get the flag name for the selected alterantive (i.e. the USE flag set).

Typo.

> +get_alternative() {
> +     debug-print-function ${FUNCNAME} "${@}"
> +
> +     local flag
> +     for flag in "${ALTERNATIVES[@]%%:*}"; do
> +             usev "${flag}" && return
> +     done
> +
> +     die "No selected alternative found (REQUIRED_USE ignored?!)"
> +}
> +
> +fi

Reply via email to