From d2bff00ee28a8a9c2178064f0800990389fc9da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Fri, 5 Jun 2026 23:10:55 +0200 Subject: [PATCH] fix: prevent set -e crash when yq exits non-zero on IONOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues on IONOS shared hosting (very low ulimit -u): 1. bash 4.4+ propagates the exit code of command substitutions through `local var=$(cmd)`. When yq crashes (exit 2) the assignment itself returns 2, and set -e kills the script before any log message appears. Fixed by adding `|| return 0` to the yq wrapper so it always exits 0. 2. All ref_count comparisons checked for "null"/"0" but not for empty string. A yq call that produces no stdout (crashed but returned 0) leaves ref_count="", which neither guard caught — the arithmetic loop `i < ref_count` silently treated "" as 0 and skipped all references. Fixed by adding `[[ -z "$ref_count" ]]` to every ref_count guard. Co-Authored-By: Claude Sonnet 4.6 --- scripts/arty.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scripts/arty.sh b/scripts/arty.sh index 9eb203c2..594ab96a 100755 --- a/scripts/arty.sh +++ b/scripts/arty.sh @@ -163,9 +163,10 @@ load_env_vars() { fi } -# Wrapper to limit Go thread usage on hosts with low ulimit -u (e.g. IONOS shared hosting) +# Wrapper to limit Go thread usage on hosts with low ulimit -u (e.g. IONOS shared hosting). +# Always returns 0 so set -e doesn't propagate a yq crash through `local var=$(yq ...)`. yq() { - GOMAXPROCS=1 GOGC=off command yq "$@" + GOMAXPROCS=1 GOGC=off command yq "$@" || return 0 } # Check if yq is installed @@ -544,7 +545,7 @@ find_ancestor_into() { if [[ -f "$config_to_check" ]]; then # Get count of references local ref_count=$(yq eval '.references | length' "$config_to_check" 2>/dev/null) - if [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then + if [[ -n "$ref_count" ]] && [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then # Check each reference for ((i = 0; i < ref_count; i++)); do local ref_data=$(parse_reference "$config_to_check" "$i") @@ -601,7 +602,7 @@ install_references() { # Count references local ref_count=$(yq eval '.references | length' "$config_file" 2>/dev/null) - if [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then + if [[ -z "$ref_count" ]] || [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then log_info "No references to install" return 0 fi @@ -670,7 +671,7 @@ build_reference_tree() { # Count references local ref_count=$(yq eval '.references | length' "$config_file" 2>/dev/null) - if [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then + if [[ -z "$ref_count" ]] || [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then return 0 fi @@ -832,7 +833,7 @@ list_libs() { # Check if there are any references local ref_count=$(yq eval '.references | length' "$ARTY_CONFIG_FILE" 2>/dev/null) - if [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then + if [[ -z "$ref_count" ]] || [[ "$ref_count" == "null" ]] || [[ "$ref_count" == "0" ]]; then # No references defined, check for installed libraries local libs_dir="${ARTY_LIBS_DIR:-${ARTY_HOME:-$PWD/.arty}/libs}" if [[ ! -d "$libs_dir" ]] || [[ -z "$(ls -A "$libs_dir" 2>/dev/null)" ]]; then @@ -2023,7 +2024,7 @@ main() { # Show tree after installation if successful and arty.yml exists and has references if [[ $install_result -eq 0 ]] && [[ -f "$ARTY_CONFIG_FILE" ]]; then local ref_count=$(yq eval '.references | length' "$ARTY_CONFIG_FILE" 2>/dev/null) - if [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then + if [[ -n "$ref_count" ]] && [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then echo log_success "Installation complete!" list_libs @@ -2036,7 +2037,7 @@ main() { # Show tree after installation if successful and arty.yml exists and has references if [[ $install_result -eq 0 ]] && [[ -f "$ARTY_CONFIG_FILE" ]]; then local ref_count=$(yq eval '.references | length' "$ARTY_CONFIG_FILE" 2>/dev/null) - if [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then + if [[ -n "$ref_count" ]] && [[ "$ref_count" != "null" ]] && [[ "$ref_count" != "0" ]]; then echo log_success "Dependencies installed!" list_libs