commit: 50ce35639679a07286dff5a409df6d44a6d9166c
Author: Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Thu May 16 01:38:31 2024 +0000
Commit: Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Thu May 16 01:38:31 2024 +0000
URL:
https://gitweb.gentoo.org/proj/gentoo-functions.git/commit/?id=50ce3563
Reorganise the order in which functions are declared
Sort by alphabetical order, grouped by public then private scope.
Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>
functions.sh | 598 +++++++++++++++++++++++++++++------------------------------
1 file changed, 298 insertions(+), 300 deletions(-)
diff --git a/functions.sh b/functions.sh
index 7bd4b11..8561eb3 100644
--- a/functions.sh
+++ b/functions.sh
@@ -10,32 +10,69 @@
# and to reduce the probability of name space conflicts.
#
-# Called by ebegin, eerrorn, einfon, and ewarnn.
+# A safe wrapper for the cd builtin. To run cd "$dir" is problematic because:
#
-_eprint()
+# 1) it may consider its operand as an option
+# 2) it will search CDPATH for an operand not beginning with ./, ../ or /
+# 3) it will switch to OLDPWD if the operand is -
+# 4) cdable_vars causes bash to treat the operand as a potential variable
name
+#
+chdir()
{
- local color
+ if [ "$BASH" ]; then
+ # shellcheck disable=3044
+ shopt -u cdable_vars
+ fi
+ if [ "$1" = - ]; then
+ set -- ./-
+ fi
+ # shellcheck disable=1007,2164
+ CDPATH= cd -- "$@"
+}
- color=$1
- shift
+#
+# show a message indicating the start of a process
+#
+ebegin()
+{
+ local msg
- if [ -t 1 ]; then
- printf ' %s*%s %s%s' "${color}" "${NORMAL}" "${genfun_indent}"
"$*"
- else
- printf ' * %s%s' "${genfun_indent}" "$*"
+ if ! yesno "${EINFO_QUIET}"; then
+ msg=$*
+ while _ends_with_newline "${msg}"; do
+ msg=${msg%"${genfun_newline}"}
+ done
+ _eprint "${GOOD}" "${msg} ...${genfun_newline}"
fi
}
#
-# hard set the indent used for e-commands.
-# num defaults to 0
+# indicate the completion of process
+# if error, show errstr via eerror
#
-_esetdent()
+eend()
{
- if ! is_int "$1" || [ "$1" -lt 0 ]; then
- set -- 0
+ GENFUN_CALLER=${GENFUN_CALLER:-eend} _eend eerror "$@"
+}
+
+#
+# show an error message (with a newline) and log it
+#
+eerror()
+{
+ eerrorn "${*}${genfun_newline}"
+}
+
+#
+# show an error message (without a newline) and log it
+#
+eerrorn()
+{
+ if ! yesno "${EERROR_QUIET}"; then
+ _eprint "${BAD}" "$@" >&2
+ esyslog "daemon.err" "${0##*/}" "$@"
fi
- genfun_indent=$(printf "%${1}s" '')
+ return 1
}
#
@@ -50,40 +87,32 @@ eindent()
}
#
-# decrease the indent used for e-commands.
+# show an informative message (with a newline)
#
-eoutdent()
+einfo()
{
- if ! is_int "$1" || [ "$1" -le 0 ]; then
- set -- 2
+ einfon "${*}${genfun_newline}"
+}
+
+#
+# show an informative message (without a newline)
+#
+einfon()
+{
+ if ! yesno "${EINFO_QUIET}"; then
+ _eprint "${GOOD}" "$@"
fi
- _esetdent "$(( ${#genfun_indent} - $1 ))"
}
#
-# this function was lifted from OpenRC. It returns 0 if the argument or
-# the value of the argument is "yes", "true", "on", or "1" or 1
-# otherwise.
+# decrease the indent used for e-commands.
#
-yesno()
+eoutdent()
{
- for _ in 1 2; do
- case $1 in
- [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0|'')
- return 1
- ;;
- [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
- return 0
- esac
- if [ "$_" -ne 1 ] || ! is_identifier "$1"; then
- ! break
- else
- # The value appears to be a legal variable name. Treat
- # it as a name reference and try again, once only.
- eval "set -- \"\$$1\""
- fi
- done || vewarn "Invalid argument given to yesno (expected a
boolean-like or a legal name)"
- return 1
+ if ! is_int "$1" || [ "$1" -le 0 ]; then
+ set -- 2
+ fi
+ _esetdent "$(( ${#genfun_indent} - $1 ))"
}
#
@@ -110,21 +139,11 @@ esyslog()
}
#
-# show an informative message (without a newline)
-#
-einfon()
-{
- if ! yesno "${EINFO_QUIET}"; then
- _eprint "${GOOD}" "$@"
- fi
-}
-
-#
-# show an informative message (with a newline)
+# show a warning message (with a newline) and log it
#
-einfo()
+ewarn()
{
- einfon "${*}${genfun_newline}"
+ ewarnn "${*}${genfun_newline}"
}
#
@@ -139,49 +158,217 @@ ewarnn()
}
#
-# show a warning message (with a newline) and log it
+# indicate the completion of process
+# if error, show errstr via ewarn
#
-ewarn()
+ewend()
{
- ewarnn "${*}${genfun_newline}"
+ GENFUN_CALLER=${GENFUN_CALLER:-ewend} _eend ewarn "$@"
}
#
-# show an error message (without a newline) and log it
+# return 0 if gentoo=param was passed to the kernel
#
-eerrorn()
-{
- if ! yesno "${EERROR_QUIET}"; then
- _eprint "${BAD}" "$@" >&2
- esyslog "daemon.err" "${0##*/}" "$@"
- fi
+# EXAMPLE: if get_bootparam "nodevfs" ; then ....
+#
+get_bootparam()
+(
+ # Gentoo cmdline parameters are comma-delimited, so a search
+ # string containing a comma must not be allowed to match.
+ # Similarly, the empty string must not be allowed to match.
+ case $1 in ''|*,*) return 1 ;; esac
+
+ # Reset the value of IFS because there is no telling what it may be.
+ IFS=$(printf ' \n\t')
+
+ if [ "${TEST_GENFUNCS}" = 1 ]; then
+ read -r cmdline
+ else
+ read -r cmdline < /proc/cmdline
+ fi || return
+
+ # Disable pathname expansion. The definition of this function
+ # is a compound command that incurs a subshell. Therefore, the
+ # prior state of the option does not need to be recalled.
+ set -f
+ for opt in ${cmdline}; do
+ gentoo_opt=${opt#gentoo=}
+ if [ "${opt}" != "${gentoo_opt}" ]; then
+ case ,${gentoo_opt}, in
+ *,"$1",*) return 0
+ esac
+ fi
+ done
return 1
-}
+)
#
-# show an error message (with a newline) and log it
+# Determine whether the first operand is a valid identifier (variable name).
#
-eerror()
+is_identifier()
+(
+ LC_ALL=C
+ case $1 in
+ ''|_|[[:digit:]]*|*[!_[:alnum:]]*) false
+ esac
+)
+
+#
+# Determine whether the first operand is in the form of an integer. A leading
+# <hypen-minus> shall be permitted. Thereafter, leading zeroes shall not be
+# permitted because the string might later be considered to be octal in an
+# arithmetic context, causing the shell to exit if the number be invalid.
+#
+is_int()
{
- eerrorn "${*}${genfun_newline}"
+ set -- "${1#-}"
+ case $1 in
+ ''|*[!0123456789]*)
+ false
+ ;;
+ 0)
+ true
+ ;;
+ *)
+ test "$1" = "${1#0}"
+ esac
}
#
-# show a message indicating the start of a process
+# return 0 if any of the files/dirs are newer than
+# the reference file
#
-ebegin()
+# EXAMPLE: if is_older_than a.out *.o ; then ...
+is_older_than()
{
- local msg
+ local ref has_gfind
- if ! yesno "${EINFO_QUIET}"; then
- msg=$*
- while _ends_with_newline "${msg}"; do
- msg=${msg%"${genfun_newline}"}
- done
- _eprint "${GOOD}" "${msg} ...${genfun_newline}"
+ if [ "$#" -lt 2 ]; then
+ ewarn "Too few arguments for is_older_than (got $#, expected at
least 2)"
+ return 1
+ elif [ -e "$1" ]; then
+ ref=$1
+ else
+ ref=
+ fi
+ shift
+
+ # Consult the hash table in the present shell, prior to forking.
+ hash gfind 2>/dev/null; has_gfind=$(( $? == 0 ))
+
+ for path; do
+ if [ -e "${path}" ]; then
+ printf '%s\0' "${path}"
+ fi
+ done |
+ {
+ set -- -L -files0-from - ${ref:+-newermm} ${ref:+"${ref}"}
-printf '\n' -quit
+ if [ "${has_gfind}" -eq 1 ]; then
+ gfind "$@"
+ else
+ find "$@"
+ fi
+ } |
+ read -r _
+}
+
+vebegin()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ ebegin "$@"
+ fi
+}
+
+veend()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ GENFUN_CALLER=veend eend "$@"
+ elif [ "$#" -gt 0 ] && { ! is_int "$1" || [ "$1" -lt 0 ]; }; then
+ ewarn "Invalid argument given to veend (the exit status code
must be an integer >= 0)"
+ else
+ return "$1"
+ fi
+}
+
+veerror()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ eerror "$@"
fi
}
+veindent()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ eindent "$@"
+ fi
+}
+
+veinfo()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ einfo "$@"
+ fi
+}
+
+veinfon()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ einfon "$@"
+ fi
+}
+
+veoutdent()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ eoutdent "$@"
+ fi
+}
+
+vewarn()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ ewarn "$@"
+ fi
+}
+
+vewend()
+{
+ if yesno "${EINFO_VERBOSE}"; then
+ GENFUN_CALLER=vewend ewend "$@"
+ elif [ "$#" -gt 0 ] && { ! is_int "$1" || [ "$1" -lt 0 ]; }; then
+ ewarn "Invalid argument given to vewend (the exit status code
must be an integer >= 0)"
+ else
+ return "$1"
+ fi
+}
+
+#
+# this function was lifted from OpenRC. It returns 0 if the argument or
+# the value of the argument is "yes", "true", "on", or "1" or 1
+# otherwise.
+#
+yesno()
+{
+ for _ in 1 2; do
+ case $1 in
+ [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0|'')
+ return 1
+ ;;
+ [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
+ return 0
+ esac
+ if [ "$_" -ne 1 ] || ! is_identifier "$1"; then
+ ! break
+ else
+ # The value appears to be a legal variable name. Treat
+ # it as a name reference and try again, once only.
+ eval "set -- \"\$$1\""
+ fi
+ done || vewarn "Invalid argument given to yesno (expected a
boolean-like or a legal name)"
+ return 1
+}
+
#
# indicate the completion of process, called from eend/ewend
# if error, show errstr via efunc
@@ -240,231 +427,41 @@ _eend()
return "${retval}"
}
-#
-# indicate the completion of process
-# if error, show errstr via eerror
-#
-eend()
+_ends_with_newline()
{
- GENFUN_CALLER=${GENFUN_CALLER:-eend} _eend eerror "$@"
+ test "${genfun_newline}" \
+ && ! case $1 in *"${genfun_newline}") false ;; esac
}
#
-# indicate the completion of process
-# if error, show errstr via ewarn
+# Called by ebegin, eerrorn, einfon, and ewarnn.
#
-ewend()
-{
- GENFUN_CALLER=${GENFUN_CALLER:-ewend} _eend ewarn "$@"
-}
-
-# v-e-commands honor EINFO_VERBOSE which defaults to no.
-veinfo()
-{
- if yesno "${EINFO_VERBOSE}"; then
- einfo "$@"
- fi
-}
-
-veinfon()
-{
- if yesno "${EINFO_VERBOSE}"; then
- einfon "$@"
- fi
-}
-
-vewarn()
-{
- if yesno "${EINFO_VERBOSE}"; then
- ewarn "$@"
- fi
-}
-
-veerror()
-{
- if yesno "${EINFO_VERBOSE}"; then
- eerror "$@"
- fi
-}
-
-vebegin()
-{
- if yesno "${EINFO_VERBOSE}"; then
- ebegin "$@"
- fi
-}
-
-veend()
-{
- if yesno "${EINFO_VERBOSE}"; then
- GENFUN_CALLER=veend eend "$@"
- elif [ "$#" -gt 0 ] && { ! is_int "$1" || [ "$1" -lt 0 ]; }; then
- ewarn "Invalid argument given to veend (the exit status code
must be an integer >= 0)"
- else
- return "$1"
- fi
-}
-
-vewend()
-{
- if yesno "${EINFO_VERBOSE}"; then
- GENFUN_CALLER=vewend ewend "$@"
- elif [ "$#" -gt 0 ] && { ! is_int "$1" || [ "$1" -lt 0 ]; }; then
- ewarn "Invalid argument given to vewend (the exit status code
must be an integer >= 0)"
- else
- return "$1"
- fi
-}
-
-veindent()
-{
- if yesno "${EINFO_VERBOSE}"; then
- eindent "$@"
- fi
-}
-
-veoutdent()
+_eprint()
{
- if yesno "${EINFO_VERBOSE}"; then
- eoutdent "$@"
- fi
-}
-
-#
-# return 0 if gentoo=param was passed to the kernel
-#
-# EXAMPLE: if get_bootparam "nodevfs" ; then ....
-#
-get_bootparam()
-(
- # Gentoo cmdline parameters are comma-delimited, so a search
- # string containing a comma must not be allowed to match.
- # Similarly, the empty string must not be allowed to match.
- case $1 in ''|*,*) return 1 ;; esac
-
- # Reset the value of IFS because there is no telling what it may be.
- IFS=$(printf ' \n\t')
-
- if [ "${TEST_GENFUNCS}" = 1 ]; then
- read -r cmdline
- else
- read -r cmdline < /proc/cmdline
- fi || return
-
- # Disable pathname expansion. The definition of this function
- # is a compound command that incurs a subshell. Therefore, the
- # prior state of the option does not need to be recalled.
- set -f
- for opt in ${cmdline}; do
- gentoo_opt=${opt#gentoo=}
- if [ "${opt}" != "${gentoo_opt}" ]; then
- case ,${gentoo_opt}, in
- *,"$1",*) return 0
- esac
- fi
- done
- return 1
-)
+ local color
-#
-# return 0 if any of the files/dirs are newer than
-# the reference file
-#
-# EXAMPLE: if is_older_than a.out *.o ; then ...
-is_older_than()
-{
- local ref has_gfind
+ color=$1
+ shift
- if [ "$#" -lt 2 ]; then
- ewarn "Too few arguments for is_older_than (got $#, expected at
least 2)"
- return 1
- elif [ -e "$1" ]; then
- ref=$1
+ if [ -t 1 ]; then
+ printf ' %s*%s %s%s' "${color}" "${NORMAL}" "${genfun_indent}"
"$*"
else
- ref=
+ printf ' * %s%s' "${genfun_indent}" "$*"
fi
- shift
-
- # Consult the hash table in the present shell, prior to forking.
- hash gfind 2>/dev/null; has_gfind=$(( $? == 0 ))
-
- for path; do
- if [ -e "${path}" ]; then
- printf '%s\0' "${path}"
- fi
- done |
- {
- set -- -L -files0-from - ${ref:+-newermm} ${ref:+"${ref}"}
-printf '\n' -quit
- if [ "${has_gfind}" -eq 1 ]; then
- gfind "$@"
- else
- find "$@"
- fi
- } |
- read -r _
-}
-
-#
-# Determine whether the first operand is in the form of an integer. A leading
-# <hypen-minus> shall be permitted. Thereafter, leading zeroes shall not be
-# permitted because the string might later be considered to be octal in an
-# arithmetic context, causing the shell to exit if the number be invalid.
-#
-is_int()
-{
- set -- "${1#-}"
- case $1 in
- ''|*[!0123456789]*)
- false
- ;;
- 0)
- true
- ;;
- *)
- test "$1" = "${1#0}"
- esac
}
#
-# A safe wrapper for the cd builtin. To run cd "$dir" is problematic because:
-#
-# 1) it may consider its operand as an option
-# 2) it will search CDPATH for an operand not beginning with ./, ../ or /
-# 3) it will switch to OLDPWD if the operand is -
-# 4) cdable_vars causes bash to treat the operand as a potential variable
name
+# hard set the indent used for e-commands.
+# num defaults to 0
#
-chdir()
+_esetdent()
{
- if [ "$BASH" ]; then
- # shellcheck disable=3044
- shopt -u cdable_vars
- fi
- if [ "$1" = - ]; then
- set -- ./-
+ if ! is_int "$1" || [ "$1" -lt 0 ]; then
+ set -- 0
fi
- # shellcheck disable=1007,2164
- CDPATH= cd -- "$@"
-}
-
-#
-# Determine whether the first operand contains any visible characters.
-#
-_is_visible()
-{
- ! case $1 in *[[:graph:]]*) false ;; esac
+ genfun_indent=$(printf "%${1}s" '')
}
-#
-# Determine whether the first operand is a valid identifier (variable name).
-#
-is_identifier()
-(
- LC_ALL=C
- case $1 in
- ''|_|[[:digit:]]*|*[!_[:alnum:]]*) false
- esac
-)
-
_has_dumb_terminal()
{
! case ${TERM} in *dumb*) false ;; esac
@@ -485,12 +482,26 @@ _has_monochrome_terminal()
fi
}
-_ends_with_newline()
+#
+# Determine whether the first operand contains any visible characters.
+#
+_is_visible()
{
- test "${genfun_newline}" \
- && ! case $1 in *"${genfun_newline}") false ;; esac
+ ! case $1 in *[[:graph:]]*) false ;; esac
}
+_update_columns()
+{
+ local ifs
+
+ # The following use of stty(1) is portable as of POSIX Issue 8.
+ ifs=$IFS
+ IFS=' '
+ # shellcheck disable=2046
+ set -- $(stty size 2>/dev/null)
+ IFS=$ifs
+ [ "$#" -eq 2 ] && is_int "$2" && [ "$2" -gt 0 ] && genfun_cols=$2
+}
_update_tty_level()
{
@@ -509,19 +520,6 @@ _update_tty_level()
fi
}
-_update_columns()
-{
- local ifs
-
- # The following use of stty(1) is portable as of POSIX Issue 8.
- ifs=$IFS
- IFS=' '
- # shellcheck disable=2046
- set -- $(stty size 2>/dev/null)
- IFS=$ifs
- [ "$#" -eq 2 ] && is_int "$2" && [ "$2" -gt 0 ] && genfun_cols=$2
-}
-
# This is the main script, please add all functions above this point!
# shellcheck disable=2034
RC_GOT_FUNCTIONS="yes"