#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

# The following logging mechanisms are to be used in bash functions of recipes.
# They are intended to map one to one in intention and output format with the
# python recipe logging functions of a similar naming convention: bb.plain(),
# bb.note(), etc.

LOGFIFO = "${T}/fifo.${@os.getpid()}"

# Print the output exactly as it is passed in. Typically used for output of
# tasks that should be seen on the console. Use sparingly.
# Output: logs console
bbplain() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbplain $*" > ${LOGFIFO}
	else
		echo "$*"
	fi
}

# Notify the user of a noteworthy condition. 
# Output: logs
bbnote() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbnote $*" > ${LOGFIFO}
	else
		echo "NOTE: $*"
	fi
}

# Print a warning to the log. Warnings are non-fatal, and do not
# indicate a build failure.
# Output: logs console
bbwarn() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbwarn $*" > ${LOGFIFO}
	else
		echo "WARNING: $*"
	fi
}

# Print an error to the log. Errors are non-fatal in that the build can
# continue, but they do indicate a build failure.
# Output: logs console
bberror() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bberror $*" > ${LOGFIFO}
	else
		echo "ERROR: $*"
	fi
}

# Print a fatal error to the log. Fatal errors indicate build failure
# and halt the build, exiting with an error code.
# Output: logs console
bbfatal() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbfatal $*" > ${LOGFIFO}
	else
		echo "ERROR: $*"
	fi
	exit 1
}

# Like bbfatal, except prevents the suppression of the error log by
# bitbake's UI.
# Output: logs console
bbfatal_log() {
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbfatal_log $*" > ${LOGFIFO}
	else
		echo "ERROR: $*"
	fi
	exit 1
}

# Print debug messages. These are appropriate for progress checkpoint
# messages to the logs. Depending on the debug log level, they may also
# go to the console.
# Output: logs console
# Usage: bbdebug 1 "first level debug message"
#        bbdebug 2 "second level debug message"
bbdebug() {
	USAGE='Usage: bbdebug [123] "message"'
	if [ $# -lt 2 ]; then
		bbfatal "$USAGE"
	fi
	
	# Strip off the debug level and ensure it is an integer
	DBGLVL=$1; shift
	NONDIGITS=$(echo "$DBGLVL" | tr -d "[:digit:]")
	if [ "$NONDIGITS" ]; then
		bbfatal "$USAGE"
	fi

	# All debug output is printed to the logs
	if [ -p ${LOGFIFO} ] ; then
		printf "%b\0" "bbdebug $DBGLVL $*" > ${LOGFIFO}
	else
		echo "DEBUG: $*"
	fi
}

