Hi list,

the current interface to use flags, useq, usev, use_with, use_enable, as
defined in /usr/lib/portage/bin/ebuild.sh lacks generality. The common thing
is testing a use flag and possibly echoing a string, but there is no function
that implements this common behaviour.

I propose that we add such a function. Proposed name for the function is 
"ifuse".

I also propose to add the utility function "ifv" which is useful for writing
concise and clean code.

These additions would allow you to easily define your own function for
processing use flags in ebuilds and eclasses. One such example is

use_mime() {
    local WORD=$(ifv "$2" "$2" "$1")

    ifuse "$1" "${WORD};"
}

for generating a string of ';'-separated mime-types based on use flags.

The explanation of this function is:

#set WORD to argument 2 or if that is empty to argument 1
#output "${WORD};" if use flag $1 is set (or if it starts with ! and is unset)
#otherwise don't output anything

The existing interface is also simple to reimplement:

use() {
    ifuse "${1}"
}

useq() {
    ifuse "${1}"
}

usev() {
    ifuse "${1}" "${1}"
}

use_with() {
    local SUFFIX=$(ifv "$3" "=$3")
    local WORD=$(ifv "$2" "$2" "$1")

    ifuse "$1" "--with-${WORD}${SUFFIX}" "--without-${WORD}"
}

use_enable() {
    local SUFFIX=$(ifv "$3" "=$3")
    local WORD=$(ifv "$2" "$2" "$1")

    ifuse "$1" "--enable-${WORD}${SUFFIX}" "--disable-${WORD}"
}

ifuse's code is much like useq's code now, but more versatile. You can find it
attached along with ifv.

Please comment,

Marijn

-- 
Marijn Schouten (hkBst), Gentoo Lisp project
<http://www.gentoo.org/proj/en/lisp/>, #gentoo-lisp on FreeNode
# test a use flag and return the result, possibly echo a non-empty string
ifuse() {
    local flag=$1
    local string_success=$2
    local string_failure=$3
    local success=0

    # invert the return value for "!blah" and strip the '!'
    [[ ${flag} = !* ]] && { success=1 ; flag=${flag:1} }

    # Make sure we have this USE flag in IUSE
    if ! hasq "${flag}" ${IUSE} ${E_IUSE} && ! hasq "${flag}" 
${PORTAGE_ARCHLIST} selinux; then
        eqawarn "QA Notice: USE Flag '${flag}' not in IUSE for 
${CATEGORY}/${PF}"
    fi

    hasq "${flag}" ${USE} || ((success=1-success))

    string=$( (( ${success} == 0 )) && echo ${string_success} || echo 
${string_failure} )
    [[ -n ${string} ]] && echo ${string}
    return ${success}
}

ifv() {
    [[ -n $1 ]] && echo $2 || echo $3
}

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to