From 2edf5e7b0669d929b9d94aeb3b79c043b53eeabf Mon Sep 17 00:00:00 2001 From: Meliox Date: Sat, 8 Aug 2026 23:52:31 +0200 Subject: [PATCH] fix: remove duplicate test scripts from src/scripts/test/ test-patches.sh and test-syntax.sh were left in src/scripts/test/ after the restructure; the canonical copies are in build/test/ where they belong. --- src/scripts/test/test-patches.sh | 168 ------------------------------- src/scripts/test/test-syntax.sh | 144 -------------------------- 2 files changed, 312 deletions(-) delete mode 100644 src/scripts/test/test-patches.sh delete mode 100644 src/scripts/test/test-syntax.sh diff --git a/src/scripts/test/test-patches.sh b/src/scripts/test/test-patches.sh deleted file mode 100644 index 6e5f1f3..0000000 --- a/src/scripts/test/test-patches.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash -# src/scripts/test/test-patches.sh -# -# Exercises pve-mod's patch engine against the installed Proxmox files. -# -# Usage: test-mods.sh | all -# -# Mods are auto-discovered from the [modules] section of the main config, so -# adding a new mod (a new [modules] key plus a patches// directory) is -# picked up automatically - no edits to this script are required. -# -# For each target mod it: -# 1. enables only that mod in the main config -# 2. turns on every conditional flag referenced by the mod's patches.list, -# so all of the mod's patches are exercised (e.g. node_info's gpu_history) -# 3. runs apply-patches.sh and asserts it exits 0 -# 4. runs revert-patches.sh and asserts it reports no unclean reversions -# -# Failure detection relies on the apply exit code: the patch engine performs an -# atomic preflight dry-run and exits non-zero if any mod cannot apply cleanly. -# -# Must run as root (it edits /etc/pve-mod and the patched system files). - -set -u - -MAIN_CONF="${PVE_MOD_MAIN_CONF:-/etc/pve-mod/pve-mod.conf}" -CONFD_DIR="${PVE_MOD_CONFD_DIR:-/etc/pve-mod/conf.d}" -PATCHES_DIR="${PVE_MOD_PATCHES_DIR:-/usr/lib/pve-mod/patches}" -APPLY="${PVE_MOD_APPLY:-/usr/lib/pve-mod/apply-patches.sh}" -REVERT="${PVE_MOD_REVERT:-/usr/lib/pve-mod/revert-patches.sh}" - -info() { echo "[test] $*"; } -warn() { echo "[test] WARNING: $*" >&2; } - -# List the keys of the [modules] section in the main config, one per line. -list_modules() { - [[ -f "$MAIN_CONF" ]] || return 0 - awk -F= ' - /^\[/ { in_sec = ($0 == "[modules]") } - in_sec && /^[^#=]+=/ { - gsub(/^[[:space:]]+|[[:space:]]+$/, "", $1) - print $1 - } - ' "$MAIN_CONF" -} - -# set_conf
: set an existing key within a section. -set_conf() { - local file="$1" section="$2" key="$3" value="$4" - [[ -f "$file" ]] || { warn "config not found: $file"; return 1; } - awk -v sec="[$section]" -v k="$key" -v v="$value" ' - /^\[/ { in_sec = ($0 == sec) } - { - if (in_sec && $0 ~ "^[[:space:]]*"k"[[:space:]]*=") { - print k"="v - } else { - print - } - } - ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" -} - -# Disable every discovered mod in the main config. -disable_all_modules() { - local m - for m in $(list_modules); do - set_conf "$MAIN_CONF" modules "$m" 0 - done -} - -# Turn on every conditional flag a mod's patches.list references, so all of its -# patches become active. Conditions look like: section.key=value -enable_conditions() { - local mod="$1" - local manifest="$PATCHES_DIR/$mod/patches.list" - local mod_conf="$CONFD_DIR/$mod.conf" - [[ -f "$manifest" ]] || return 0 - local line cond local_key want sect ckey - while IFS= read -r line; do - line="${line%%#*}" - line="$(echo "$line" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')" - [[ -z "$line" ]] && continue - # Skip lines without a condition (no whitespace after the patch name). - [[ "$line" == *[[:space:]]* ]] || continue - cond="$(echo "${line#*[[:space:]]}" | sed -E 's/^[[:space:]]+//')" - [[ "$cond" == *=* ]] || continue - local_key="${cond%%=*}" - want="${cond#*=}" - sect="${local_key%%.*}" - ckey="${local_key#*.}" - set_conf "$mod_conf" "$sect" "$ckey" "$want" \ - && info " enabled condition $local_key=$want in $(basename "$mod_conf")" - done < "$manifest" -} - -# Test a single mod end to end. Returns 0 on success, 1 on failure. -test_one_mod() { - local mod="$1" - echo "::group::Testing mod: $mod" - local ok=0 - - if [[ ! -f "$PATCHES_DIR/$mod/patches.list" ]]; then - warn "no patch manifest for mod '$mod' ($PATCHES_DIR/$mod/patches.list)" - echo "::endgroup::" - return 1 - fi - - disable_all_modules - set_conf "$MAIN_CONF" modules "$mod" 1 - enable_conditions "$mod" - - info "Applying patches for '$mod'..." - local apply_log apply_rc - apply_log="$("$APPLY" 2>&1)"; apply_rc=$? - echo "$apply_log" - if [[ $apply_rc -ne 0 ]]; then - warn "apply-patches.sh failed for mod '$mod' (exit $apply_rc)" - ok=1 - fi - - if [[ $ok -eq 0 ]]; then - info "Reverting patches for '$mod'..." - local revert_log - revert_log="$("$REVERT" 2>&1)" - echo "$revert_log" - if echo "$revert_log" | grep -qE "could not be reverted cleanly|reported an error"; then - warn "revert-patches.sh reported an unclean revert for mod '$mod'" - ok=1 - fi - fi - - if [[ $ok -eq 0 ]]; then - info "PASS: $mod" - else - warn "FAIL: $mod" - fi - echo "::endgroup::" - return $ok -} - -# ── main ────────────────────────────────────────────────────────────────────── -[[ $# -eq 1 ]] || { echo "Usage: $0 |all" >&2; exit 2; } - -if ! command -v patch >/dev/null 2>&1; then - warn "'patch' command not found; install the 'patch' package." - exit 1 -fi - -targets=() -if [[ "$1" == "all" ]]; then - mapfile -t targets < <(list_modules) - [[ ${#targets[@]} -gt 0 ]] || { warn "no mods found in [modules] of $MAIN_CONF"; exit 1; } -else - targets=("$1") -fi - -failed=() -for mod in "${targets[@]}"; do - test_one_mod "$mod" || failed+=("$mod") -done - -echo "" -if [[ ${#failed[@]} -gt 0 ]]; then - warn "Failed mods: ${failed[*]}" - exit 1 -fi -info "All tested mods passed: ${targets[*]}" -exit 0 diff --git a/src/scripts/test/test-syntax.sh b/src/scripts/test/test-syntax.sh deleted file mode 100644 index a274bfe..0000000 --- a/src/scripts/test/test-syntax.sh +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env bash -# src/scripts/test/test-syntax.sh -# -# Validates source syntax for all mod files without requiring a running system. -# -# Usage: test-syntax.sh | all -# -# Mods are auto-discovered by scanning for subdirectories of src/ that contain -# a files/ or patches/ directory. No installed package required. -# -# For each target mod it: -# 1. runs perl -c on every .pm file under /files/ -# 2. runs node --check on every .js file under /files/ -# 3. runs bash -n on post-apply.sh and post-revert.sh in /patches/ - -set -u - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -SRC_DIR="${PVE_MOD_SRC_DIR:-$(cd "$SCRIPT_DIR/../../.." && pwd)/src/modules}" - -info() { echo "[syntax] $*"; } -warn() { echo "[syntax] WARNING: $*" >&2; } - -# List mod names by scanning SRC_DIR for subdirs that contain files/ or patches/. -list_modules() { - local d name - for d in "$SRC_DIR"/*/; do - [[ -d "$d" ]] || continue - name="$(basename "$d")" - if [[ -d "$d/files" || -d "$d/patches" ]]; then - echo "$name" - fi - done | sort -} - -# check_perl_syntax : run perl -c on every .pm under /files/ -check_perl_syntax() { - local mod="$1" - local files_dir="$SRC_DIR/$mod/files" - [[ -d "$files_dir" ]] || return 0 - - local ok=0 f output - while IFS= read -r f; do - output="$(perl -c "$f" 2>&1)" - if [[ $? -ne 0 ]]; then - warn "perl -c FAILED: $f" - echo "$output" - ok=1 - fi - done < <(find "$files_dir" -name "*.pm" -type f | sort) - return $ok -} - -# check_js_syntax : run node --check on every .js under /files/ -check_js_syntax() { - local mod="$1" - local files_dir="$SRC_DIR/$mod/files" - [[ -d "$files_dir" ]] || return 0 - - local ok=0 f output - while IFS= read -r f; do - output="$(node --check "$f" 2>&1)" - if [[ $? -ne 0 ]]; then - warn "node --check FAILED: $f" - echo "$output" - ok=1 - fi - done < <(find "$files_dir" -name "*.js" -type f | sort) - return $ok -} - -# check_bash_syntax : run bash -n on post-apply.sh and post-revert.sh -check_bash_syntax() { - local mod="$1" - local patches_src="$SRC_DIR/$mod/patches" - [[ -d "$patches_src" ]] || return 0 - - local ok=0 script f output - for script in post-apply.sh post-revert.sh; do - f="$patches_src/$script" - [[ -f "$f" ]] || continue - output="$(bash -n "$f" 2>&1)" - if [[ $? -ne 0 ]]; then - warn "bash -n FAILED: $f" - echo "$output" - ok=1 - fi - done - return $ok -} - -# test_syntax_one_mod : run all syntax checks for one mod. -# Returns 0 on pass, 1 on any failure. -test_syntax_one_mod() { - local mod="$1" - echo "::group::Syntax check: $mod" - local ok=0 - - check_perl_syntax "$mod" || ok=1 - check_js_syntax "$mod" || ok=1 - check_bash_syntax "$mod" || ok=1 - - if [[ $ok -eq 0 ]]; then - info "PASS: $mod" - else - warn "FAIL: $mod" - fi - echo "::endgroup::" - return $ok -} - -# ── main ────────────────────────────────────────────────────────────────────── -[[ $# -eq 1 ]] || { echo "Usage: $0 |all" >&2; exit 2; } - -if ! command -v perl >/dev/null 2>&1; then - warn "'perl' command not found; install perl." - exit 1 -fi - -if ! command -v node >/dev/null 2>&1; then - warn "'node' command not found; install nodejs." - exit 1 -fi - -targets=() -if [[ "$1" == "all" ]]; then - mapfile -t targets < <(list_modules) - [[ ${#targets[@]} -gt 0 ]] || { warn "no mods found in $SRC_DIR"; exit 1; } -else - targets=("$1") -fi - -failed=() -for mod in "${targets[@]}"; do - test_syntax_one_mod "$mod" || failed+=("$mod") -done - -echo "" -if [[ ${#failed[@]} -gt 0 ]]; then - warn "Failed mods: ${failed[*]}" - exit 1 -fi -info "All tested mods passed: ${targets[*]}" -exit 0