From ec1a37d18f7ca7139f1db684b2222c3bbbbfd0161dfc2572ce617610358ce423 Mon Sep 17 00:00:00 2001 From: ahdoawhfo Date: Fri, 17 Apr 2026 14:11:53 +0800 Subject: [PATCH] Fix env_check_apply_fixes under partial fix needs The function used a chain of `(( NEED_X == 1 )) && { ... }` statements. When the last flag is 0 the trailing arithmetic evaluates to false and bash returns 1 from the function. Under the main script's `set -e` that propagates up to bootstrap which exits with the misleading "line 60" ERR trap right after the installer announces it is going to create the state directory. Rewrite the body as plain `if` blocks and return 0 explicitly. Add two regression assertions that exercise the "only some flags set" and "nothing to do" paths so the class of bug is caught in CI. Co-Authored-By: Claude Opus 4.7 (1M context) --- lib/env_check.sh | 17 ++++++++++++++--- tests/test_env_check.sh | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/env_check.sh b/lib/env_check.sh index 41d79a4..10224e9 100644 --- a/lib/env_check.sh +++ b/lib/env_check.sh @@ -156,9 +156,20 @@ SYSCTL } env_check_apply_fixes() { - (( ENV_CHECK_NEED_PACKAGES == 1 )) && { log_info '正在安装缺失软件包...'; _env_install_packages || return 1; } - (( ENV_CHECK_NEED_STORAGE == 1 )) && { log_info '正在创建状态目录...'; mkdir -p "${IPF_STORAGE_DIR}"; chmod 750 "${IPF_STORAGE_DIR}"; } - (( ENV_CHECK_NEED_SYSCTL == 1 )) && { log_info '正在写入 sysctl 配置并启用转发...'; _env_write_sysctl || return 1; } + if (( ENV_CHECK_NEED_PACKAGES == 1 )); then + log_info '正在安装缺失软件包...' + _env_install_packages || return 1 + fi + if (( ENV_CHECK_NEED_STORAGE == 1 )); then + log_info '正在创建状态目录...' + mkdir -p "${IPF_STORAGE_DIR}" + chmod 750 "${IPF_STORAGE_DIR}" + fi + if (( ENV_CHECK_NEED_SYSCTL == 1 )); then + log_info '正在写入 sysctl 配置并启用转发...' + _env_write_sysctl || return 1 + fi + return 0 } env_check_all() { diff --git a/tests/test_env_check.sh b/tests/test_env_check.sh index 4e5c2fd..347354a 100755 --- a/tests/test_env_check.sh +++ b/tests/test_env_check.sh @@ -126,4 +126,19 @@ export IPF_TEST_INPUTS=$'n\n' assert_eq '3' "$(status_of env_check_all)" 'env_check_all should return 3 when user rejects autofix' +# Regression: env_check_apply_fixes must return 0 even when the last flag is 0. +# 之前写成 `(( NEED_SYSCTL == 1 )) && { ... }`,NEED_SYSCTL=0 时函数返回 1, +# 外层 set -e 直接把脚本打死。 +ENV_CHECK_NEED_PACKAGES=1 +ENV_CHECK_NEED_STORAGE=0 +ENV_CHECK_NEED_SYSCTL=0 +assert_eq '0' "$(status_of env_check_apply_fixes)" \ + 'env_check_apply_fixes should return 0 when only some fixes are needed' + +ENV_CHECK_NEED_PACKAGES=0 +ENV_CHECK_NEED_STORAGE=0 +ENV_CHECK_NEED_SYSCTL=0 +assert_eq '0' "$(status_of env_check_apply_fixes)" \ + 'env_check_apply_fixes should return 0 when no fixes are needed' + pass 'test_env_check.sh'