mirror of
				https://github.com/flatcar/scripts.git
				synced 2025-11-04 02:01:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
if [[ -z ${__DEBUG_SH_INCLUDED__:-} ]]; then
 | 
						|
__DEBUG_SH_INCLUDED__=x
 | 
						|
 | 
						|
source "$(dirname "${BASH_SOURCE[0]}")/util.sh"
 | 
						|
 | 
						|
# Adds package names for which debugging output may be enabled.
 | 
						|
function pkg_debug_add() {
 | 
						|
    if [[ ${#} -eq 0 ]]; then
 | 
						|
        return
 | 
						|
    fi
 | 
						|
    if ! declare -p __D_DEBUG_PACKAGES >/dev/null 2>&1; then
 | 
						|
        declare -gA __D_DEBUG_PACKAGES=()
 | 
						|
    fi
 | 
						|
    local pkg
 | 
						|
    for pkg; do
 | 
						|
        __D_DEBUG_PACKAGES["${pkg}"]=x
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
# Resets debugging state to zero (no packages to debug, debug output
 | 
						|
# disabled).
 | 
						|
function pkg_debug_reset() {
 | 
						|
    unset __D_DEBUG_PACKAGES __D_DEBUG
 | 
						|
}
 | 
						|
 | 
						|
# Enables debugging output when specific packages are processed.
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# @ - package names to enable debugging for
 | 
						|
function pkg_debug_enable() {
 | 
						|
    local -A pkg_set=()
 | 
						|
    local -a vals=()
 | 
						|
    local pkg
 | 
						|
 | 
						|
    if ! declare -p __D_DEBUG_PACKAGES >/dev/null 2>&1; then
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
 | 
						|
    for pkg; do
 | 
						|
        if [[ -n ${pkg_set["${pkg}"]:-} ]]; then
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
        pkg_set["${pkg}"]=x
 | 
						|
        if [[ -n ${__D_DEBUG_PACKAGES["${pkg}"]:-} ]]; then
 | 
						|
            vals+=( "${pkg}" )
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    if [[ ${#vals[@]} -gt 0 ]]; then
 | 
						|
        declare -g __D_DEBUG
 | 
						|
        join_by __D_DEBUG ',' "${vals[@]}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Get a list of package names for which debugging output may be
 | 
						|
# enabled.
 | 
						|
function pkg_debug_packages() {
 | 
						|
    local -n pkg_names_ref=${1}; shift
 | 
						|
 | 
						|
    if ! declare -p __D_DEBUG_PACKAGES >/dev/null 2>&1; then
 | 
						|
        pkg_names_ref=()
 | 
						|
    else
 | 
						|
        pkg_names_ref=( "${!__D_DEBUG_PACKAGES[@]}" )
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Checks if debugging output is enabled. Returns true if yes,
 | 
						|
# otherwise false.
 | 
						|
function pkg_debug_enabled() {
 | 
						|
    local -i ret=0
 | 
						|
    [[ -n ${__D_DEBUG:-} ]] || ret=1
 | 
						|
    return ${ret}
 | 
						|
}
 | 
						|
 | 
						|
# Disables debugging output.
 | 
						|
function pkg_debug_disable() {
 | 
						|
    unset __D_DEBUG
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed parameters if debugging is enabled.
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# @ - parameters to print
 | 
						|
function pkg_debug() {
 | 
						|
    if [[ -n ${__D_DEBUG:-} ]]; then
 | 
						|
        pkg_debug_print_c "${__D_DEBUG}" "${@}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed lines if debugging is enabled.
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# @ - lines to print
 | 
						|
function pkg_debug_lines() {
 | 
						|
    if [[ -n ${__D_DEBUG:-} ]]; then
 | 
						|
        pkg_debug_print_lines_c "${__D_DEBUG}" "${@}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed parameters unconditionally with debug
 | 
						|
# formatting. Useful for more complicated debugging logic using
 | 
						|
# pkg_debug_enabled.
 | 
						|
#
 | 
						|
# if pkg_debug_enabled; then
 | 
						|
#     pkg_debug_print 'debug message'
 | 
						|
# fi
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# @ - parameters to print
 | 
						|
function pkg_debug_print() {
 | 
						|
    if [[ -z ${__D_DEBUG:+notempty} ]]; then
 | 
						|
        info "bad use of pkg_debug_print, __D_DEBUG is unset"
 | 
						|
        debug_stacktrace
 | 
						|
        fail '<print failwhale here>'
 | 
						|
    fi
 | 
						|
    pkg_debug_print_c "${__D_DEBUG}" "${@}"
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed lines unconditionally with debug formatting. Useful
 | 
						|
# for more complicated debugging logic using pkg_debug_enabled.
 | 
						|
#
 | 
						|
# if pkg_debug_enabled; then
 | 
						|
#     pkg_debug_print_lines 'debug' 'message'
 | 
						|
# fi
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# @ - lines to print
 | 
						|
function pkg_debug_print_lines() {
 | 
						|
    if [[ -z ${__D_DEBUG:+notempty} ]]; then
 | 
						|
        info "bad use of pkg_debug_print_lines, __D_DEBUG is unset"
 | 
						|
        debug_stacktrace
 | 
						|
        fail '<print failwhale here>'
 | 
						|
    fi
 | 
						|
    pkg_debug_print_lines_c "${__D_DEBUG}" "${@}"
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed parameters unconditionally with custom debug
 | 
						|
# formatting. Useful for either more complicated debugging logic using
 | 
						|
# pkg_debug_packages or for non-package-specific debugging situations.
 | 
						|
#
 | 
						|
# local -a dpkgs=()
 | 
						|
# pkg_debug_packages dpkgs
 | 
						|
# local pkg
 | 
						|
# for pkg in "${dpkgs[@]}"; do pkg_debug_print_c "${pkg}" 'debug message'
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# 1 - comma-separated package names
 | 
						|
# @ - parameters to print
 | 
						|
function pkg_debug_print_c() {
 | 
						|
    local d_debug=${1}
 | 
						|
    info "DEBUG(${d_debug}): ${*}"
 | 
						|
}
 | 
						|
 | 
						|
# Prints passed lines unconditionally with custom debug formatting.
 | 
						|
# Useful for either more complicated debugging logic using
 | 
						|
# pkg_debug_packages or for non-package-specific debugging situations.
 | 
						|
#
 | 
						|
# local -a dpkgs=() lines=( 'debug' 'message; )
 | 
						|
# pkg_debug_packages dpkgs
 | 
						|
# local pkg
 | 
						|
# for pkg in "${dpkgs[@]}"; do pkg_debug_print_lines_c "${pkg}" "${lines[@]}"
 | 
						|
#
 | 
						|
# Params:
 | 
						|
#
 | 
						|
# 1 - comma-separated package names
 | 
						|
# @ - lines to print
 | 
						|
function pkg_debug_print_lines_c() {
 | 
						|
    local d_debug=${1}
 | 
						|
    info_lines "${@/#/"DEBUG(${d_debug}): "}"
 | 
						|
}
 | 
						|
 | 
						|
# Prints current stacktrace.
 | 
						|
function debug_stacktrace() {
 | 
						|
    local -i idx=0 last_idx=${#FUNCNAME[@]}
 | 
						|
 | 
						|
    ((last_idx--))
 | 
						|
    while [[ idx -lt last_idx ]]; do
 | 
						|
        info "at ${FUNCNAME[idx]}, invoked by ${FUNCNAME[$((idx + 1))]} in ${BASH_SOURCE[idx + 1]}:${BASH_LINENO[idx]}"
 | 
						|
        ((++idx))
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
fi
 |