diff options
Diffstat (limited to 'eclass/eapi9-pipestatus.eclass')
-rw-r--r-- | eclass/eapi9-pipestatus.eclass | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/eclass/eapi9-pipestatus.eclass b/eclass/eapi9-pipestatus.eclass new file mode 100644 index 000000000000..f92afe42ef14 --- /dev/null +++ b/eclass/eapi9-pipestatus.eclass @@ -0,0 +1,60 @@ +# Copyright 2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: eapi9-pipestatus.eclass +# @MAINTAINER: +# Ulrich Müller <ulm@gentoo.org> +# @AUTHOR: +# Ulrich Müller <ulm@gentoo.org> +# @SUPPORTED_EAPIS: 7 8 +# @BLURB: check the PIPESTATUS array +# @DESCRIPTION: +# A stand-alone implementation of a possible future pipestatus command +# (which would be aimed for EAPI 9). It is meant as a replacement for +# "assert". In its simplest form it can be called like this: +# +# @CODE +# foo | bar +# pipestatus || die +# @CODE +# +# With the -v option, the command will also echo the pipe status array, +# so it can be assigned to a variable like in the following example: +# +# @CODE +# local status +# foo | bar +# status=$(pipestatus -v) || die "foo | bar failed, status ${status}" +# @CODE +# +# Caveat: "pipestatus" must be the next command following the pipeline. +# In particular, the "local" declaration must be before the pipeline, +# otherwise it would reset the status. + +case ${EAPI} in + 7|8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; +esac + +# @FUNCTION: pipestatus +# @USAGE: [-v] +# @RETURN: last non-zero element of PIPESTATUS, or zero if all are zero +# @DESCRIPTION: +# Check the PIPESTATUS array, i.e. the exit status of the command(s) +# in the most recently executed foreground pipeline. If called with +# option -v, also output the PIPESTATUS array. +pipestatus() { + local status=( "${PIPESTATUS[@]}" ) + local s ret=0 verbose="" + + [[ ${1} == -v ]] && { verbose=1; shift; } + [[ $# -ne 0 ]] && die "usage: ${FUNCNAME} [-v]" + + for s in "${status[@]}"; do + [[ ${s} -ne 0 ]] && ret=${s} + done + + [[ ${verbose} ]] && echo "${status[@]}" + + return "${ret}" +} |