summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'functions/portage.sh')
-rw-r--r--functions/portage.sh136
1 files changed, 136 insertions, 0 deletions
diff --git a/functions/portage.sh b/functions/portage.sh
new file mode 100644
index 0000000..3a7d9f9
--- /dev/null
+++ b/functions/portage.sh
@@ -0,0 +1,136 @@
+# Copyright 2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+# shellcheck shell=sh disable=3043
+
+# This file contains alternative implementations for some of the functions and
+# utilities provided by portage and its supporting eclasses. Please refer to
+# ../functions.sh for coding conventions.
+
+# The following variables affect initialisation and/or function behaviour.
+
+# IFS : multiple message operands are joined by its first character
+# RC_GOT_FUNCTIONS : whether the rc module may be used for printing messages
+
+#------------------------------------------------------------------------------#
+
+#
+# Prints a diagnostic message prefixed with the basename of the running script
+# before exiting. It shall preserve the value of $? as it was at the time of
+# invocation unless its value was 0, in which case the exit status shall be 1.
+#
+die()
+{
+ case $? in
+ 0)
+ genfun_status=1
+ ;;
+ *)
+ genfun_status=$?
+ esac
+ warn "$@"
+ exit "${genfun_status}"
+}
+
+#
+# Takes the positional parameters as the definition of a simple command then
+# prints the command as an informational message with einfo before executing it.
+# Should the command fail, a diagnostic message shall be printed and the shell
+# be made to exit by calling the die function.
+#
+edo()
+{
+ genfun_cmd=$(quote_args "$@")
+ if [ "${RC_GOT_FUNCTIONS}" ]; then
+ einfo "Executing: ${genfun_cmd}"
+ else
+ printf 'Executing: %s\n' "${genfun_cmd}"
+ fi
+ "$@" || die "Failed to execute command: ${genfun_cmd}"
+}
+
+#
+# This is based on the eqatag function defined by isolated-functions.sh in
+# portage. If the first parameter is the -v option, it shall be disregarded.
+# Discounting said option, at least one parameter is required, which shall be
+# taken as a tag name. Thereafter, zero or more parameters shall be accepted in
+# the form of "key=val", followed by zero or more parameters beginning with a
+# <slash>. An object shall be composed in which the tag is the value of a "tag"
+# key, the key/value pairs the value of a "data" key, and the <slash>-prefixed
+# parameters the value of a "files" key. The resulting object shall be rendered
+# as JSON by jq(1) before being logged by the logger(1) utility.
+#
+eqatag()
+{
+ local arg i json positional tag
+
+ case ${genfun_has_jq} in
+ 0)
+ return 1
+ ;;
+ '')
+ if ! hash jq 2>/dev/null; [ "$(( genfun_has_jq = $? ))" -eq 0 ]; then
+ warn "eqatag: this function requires that jq be installed"
+ return 1
+ fi
+ esac
+ # Acknowledge the -v option for isolated-functions API compatibility.
+ if [ "$1" = "-v" ]; then
+ shift
+ fi
+ if [ "$#" -eq 0 ]; then
+ warn "eqatag: no tag specified"
+ return 1
+ fi
+ positional=0
+ tag=$1
+ shift
+ i=0
+ for arg; do
+ if [ "$(( i += 1 ))" -eq 1 ]; then
+ set --
+ fi
+ case ${arg} in
+ [!=/]*=?*)
+ if [ "${positional}" -eq 1 ]; then
+ _warn_for_args eqatag "${arg}"
+ return 1
+ fi
+ set -- "$@" --arg "${arg%%=*}" "${arg#*=}"
+ ;;
+ /*)
+ if [ "${positional}" -eq 0 ]; then
+ set -- "$@" --args --
+ positional=1
+ fi
+ set -- "$@" "${arg}"
+ ;;
+ *)
+ _warn_for_args eqatag "${arg}"
+ return 1
+ esac
+ done
+ json=$(
+ jq -cn '{
+ eqatag: {
+ tag: $ARGS.named["=tag"],
+ data: $ARGS.named | with_entries(select(.key | startswith("=") | not)),
+ files: $ARGS.positional
+ }
+ }' --arg "=tag" "${tag}" "$@"
+ ) \
+ && logger -p user.debug -t "${0##*/}" -- "${json}"
+}
+
+#
+# Prints a QA warning message, provided that EINFO_QUIET is false. If printed,
+# the message shall also be conveyed to the esyslog function. For now, this is
+# implemented merely as an ewarn wrapper.
+#
+eqawarn()
+{
+ if [ "${RC_GOT_FUNCTIONS}" ]; then
+ ewarn "$@"
+ else
+ warn "$@"
+ fi
+}