From 77eb5ed28693497619a5fc67a1b14a9fddd748db Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 1 Feb 2024 19:41:56 +0100 Subject: [PATCH] Add build-aux Based on obs-plugintemplate@68e9fcd --- build-aux/.functions/log_debug | 3 + build-aux/.functions/log_error | 3 + build-aux/.functions/log_group | 16 +++ build-aux/.functions/log_info | 7 ++ build-aux/.functions/log_output | 7 ++ build-aux/.functions/log_status | 7 ++ build-aux/.functions/log_warning | 7 ++ build-aux/.functions/set_loglevel | 17 +++ build-aux/.run-format.zsh | 188 ++++++++++++++++++++++++++++++ build-aux/run-clang-format | 1 + build-aux/run-cmake-format | 1 + build-aux/run-swift-format | 1 + 12 files changed, 258 insertions(+) create mode 100644 build-aux/.functions/log_debug create mode 100644 build-aux/.functions/log_error create mode 100644 build-aux/.functions/log_group create mode 100644 build-aux/.functions/log_info create mode 100644 build-aux/.functions/log_output create mode 100644 build-aux/.functions/log_status create mode 100644 build-aux/.functions/log_warning create mode 100644 build-aux/.functions/set_loglevel create mode 100755 build-aux/.run-format.zsh create mode 120000 build-aux/run-clang-format create mode 120000 build-aux/run-cmake-format create mode 120000 build-aux/run-swift-format diff --git a/build-aux/.functions/log_debug b/build-aux/.functions/log_debug new file mode 100644 index 00000000..6a477a18 --- /dev/null +++ b/build-aux/.functions/log_debug @@ -0,0 +1,3 @@ +if (( ! ${+_loglevel} )) typeset -g _loglevel=1 + +if (( _loglevel > 2 )) print -PR -e -- "${CI:+::debug::}%F{220}DEBUG: ${@}%f" diff --git a/build-aux/.functions/log_error b/build-aux/.functions/log_error new file mode 100644 index 00000000..f1c7b436 --- /dev/null +++ b/build-aux/.functions/log_error @@ -0,0 +1,3 @@ +local icon=' ✖︎ ' + +print -u2 -PR "${CI:+::error::}%F{1} ${icon} %f ${@}" diff --git a/build-aux/.functions/log_group b/build-aux/.functions/log_group new file mode 100644 index 00000000..7b6aca97 --- /dev/null +++ b/build-aux/.functions/log_group @@ -0,0 +1,16 @@ +autoload -Uz log_info + +if (( ! ${+_log_group} )) typeset -g _log_group=0 + +if (( ${+CI} )) { + if (( _log_group )) { + print "::endgroup::" + typeset -g _log_group=0 + } + if (( # )) { + print "::group::${@}" + typeset -g _log_group=1 + } +} else { + if (( # )) log_info ${@} +} diff --git a/build-aux/.functions/log_info b/build-aux/.functions/log_info new file mode 100644 index 00000000..d437c292 --- /dev/null +++ b/build-aux/.functions/log_info @@ -0,0 +1,7 @@ +if (( ! ${+_loglevel} )) typeset -g _loglevel=1 + +if (( _loglevel > 0 )) { + local icon=' =>' + + print -PR "%F{4} ${(r:5:)icon}%f %B${@}%b" +} diff --git a/build-aux/.functions/log_output b/build-aux/.functions/log_output new file mode 100644 index 00000000..4d9b52f3 --- /dev/null +++ b/build-aux/.functions/log_output @@ -0,0 +1,7 @@ +if (( ! ${+_loglevel} )) typeset -g _loglevel=1 + +if (( _loglevel > 0 )) { + local icon='' + + print -PR " ${(r:5:)icon} ${@}" +} diff --git a/build-aux/.functions/log_status b/build-aux/.functions/log_status new file mode 100644 index 00000000..950e6818 --- /dev/null +++ b/build-aux/.functions/log_status @@ -0,0 +1,7 @@ +if (( ! ${+_loglevel} )) typeset -g _loglevel=1 + +if (( _loglevel > 0 )) { + local icon=' >' + + print -PR "%F{2} ${(r:5:)icon}%f ${@}" +} diff --git a/build-aux/.functions/log_warning b/build-aux/.functions/log_warning new file mode 100644 index 00000000..ceff982a --- /dev/null +++ b/build-aux/.functions/log_warning @@ -0,0 +1,7 @@ +if (( ! ${+_loglevel} )) typeset -g _loglevel=1 + +if (( _loglevel > 0 )) { + local icon=' =>' + + print -PR "${CI:+::warning::}%F{3} ${(r:5:)icon} ${@}%f" +} diff --git a/build-aux/.functions/set_loglevel b/build-aux/.functions/set_loglevel new file mode 100644 index 00000000..e32f4bb3 --- /dev/null +++ b/build-aux/.functions/set_loglevel @@ -0,0 +1,17 @@ +autoload -Uz log_debug log_error + +local -r _usage="Usage: %B${0}%b + +Set log level, following levels are supported: 0 (quiet), 1 (normal), 2 (verbose), 3 (debug)" + +if (( ! # )); then + log_error 'Called without arguments.' + log_output ${_usage} + return 2 +elif (( ${1} >= 4 )); then + log_error 'Called with loglevel > 3.' + log_output ${_usage} +fi + +typeset -g -i -r _loglevel=${1} +log_debug "Log level set to '${1}'" diff --git a/build-aux/.run-format.zsh b/build-aux/.run-format.zsh new file mode 100755 index 00000000..a99ea911 --- /dev/null +++ b/build-aux/.run-format.zsh @@ -0,0 +1,188 @@ +#!/usr/bin/env zsh + +builtin emulate -L zsh +setopt EXTENDED_GLOB +setopt PUSHD_SILENT +setopt ERR_EXIT +setopt ERR_RETURN +setopt NO_UNSET +setopt PIPE_FAIL +setopt NO_AUTO_PUSHD +setopt NO_PUSHD_IGNORE_DUPS +setopt FUNCTION_ARGZERO + +## Enable for script debugging +# setopt WARN_CREATE_GLOBAL +# setopt WARN_NESTED_VAR +# setopt XTRACE + +autoload -Uz is-at-least && if ! is-at-least 5.2; then + print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.2%b is the minimum supported version. Upgrade zsh to fix this issue." + exit 1 +fi + +invoke_formatter() { + if (( # < 1 )) { + log_error "Usage invoke_formatter [formatter_name]" + exit 2 + } + + case ${1} { + clang) + if (( ${+commands[clang-format-16]} )) { + local formatter=clang-format-16 + } elif (( ${+commands[clang-format]} )) { + local formatter=clang-format + local -a formatter_version=($(clang-format --version)) + + if ! is-at-least 16.0.5 ${formatter_version[-1]}; then + log_error "clang-format is not version 16.0.5 or above (found ${formatter_version[-1]}." + exit 2 + fi + + if ! is-at-least ${formatter_version[-1]} 16.0.5; then + log_error "clang-format is more recent than version 16.0.5 (found ${formatter_version[-1]})." + exit 2 + fi + } else { + log_error "No viable clang-format version found (required 16.0.5)" + exit 2 + } + + local -a source_files=(src/**/*.(c|cpp|h|hpp|m|mm)(.N)) + + local -a format_args=(-style=file -fallback-style=none) + if (( _loglevel > 2 )) format_args+=(--verbose) + ;; + cmake) + local formatter=cmake-format + if (( ${+commands[cmake-format]} )) { + local cmake_format_version=$(cmake-format --version) + + if ! is-at-least 0.6.13 ${cmake_format_version}; then + log_error "cmake-format is not version 0.6.13 or above (found ${cmake_format_version})." + exit 2 + fi + } else { + log_error "No viable cmake-format version found (required 0.6.13)" + exit 2 + } + + local -a source_files=(**/(CMakeLists.txt|*.cmake)(.N)) + source_files=(${source_files:#(build_*)/*}) + + local -a format_args=() + if (( _loglevel > 2 )) format_args+=(--log-level debug) + ;; + swift) + local formatter=swift-format + if (( ${+commands[swift-format]} )) { + local swift_format_version=$(swift-format --version) + + if ! is-at-least 508.0.0 ${swift_format_version}; then + log_error "swift-format is not version 508.0.0 or above (found ${swift_format_version})." + exit 2 + fi + } else { + log_error "No viable swift-format version found (required 508.0.0)" + exit 2 + } + + local -a source_files=(**/*.swift(.N)) + + local -a format_args=() + ;; + *) log_error "Invalid formatter specified: ${1}. Valid options are clang-format, cmake-format, and swift-format."; exit 2 ;; + } + + local file + local -i num_failures=0 + if (( check_only )) { + for file (${source_files}) { + if (( _loglevel > 1 )) log_info "Checking format of ${file}..." + + if ! "${formatter}" ${format_args} "${file}" | diff -q "${file}" - &> /dev/null; then + log_error "${file} requires formatting changes." + + if (( fail_on_error == 2 )) return 2; + num_failures=$(( num_failures + 1 )) + else + if (( _loglevel > 1 )) log_status "${file} requires no formatting changes." + fi + } + if (( fail_on_error && num_failures )) return 2; + } elif (( ${#source_files} )) { + format_args+=(-i) + "${formatter}" ${format_args} ${source_files} + } +} + +run_format() { + if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h} + if (( ! ${+FORMATTER_NAME} )) typeset -g FORMATTER_NAME=${${(s:-:)ZSH_ARGZERO:t:r}[2]} + + typeset -g host_os=${${(L)$(uname -s)}//darwin/macos} + local -i fail_on_error=0 + local -i check_only=0 + local -i verbosity=1 + local -r _version='1.0.0' + + fpath=("${SCRIPT_HOME}/.functions" ${fpath}) + autoload -Uz log_info log_error log_output set_loglevel log_status log_warning + + local -r _usage=" +Usage: %B${functrace[1]%:*}%b