From 750b904abc19e7dd015d9d21a5fb12f8db36fdec Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:40:17 +0100 Subject: [PATCH] Flush terminal input and make repo cache global Restore and sanitize terminal state before prompting by draining stale input from /dev/tty (dd iflag=nonblock) and adding a short sleep, then perform timed reads from /dev/tty in misc/build.func and misc/error_handler.func. Also make _REPO_CACHE a global associative array (declare -gA) with fallbacks in misc/tools.func so the cache survives when tools.func is sourced inside a function scope. --- misc/build.func | 10 +++++++--- misc/error_handler.func | 6 ++++-- misc/tools.func | 6 +++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/misc/build.func b/misc/build.func index 4ed0f5850..e64fb896c 100644 --- a/misc/build.func +++ b/misc/build.func @@ -4391,12 +4391,16 @@ EOF' echo "" echo -en "${YW}Select option [1-${max_option}] (default: 1, auto-remove in 60s): ${CL}" - # Ensure terminal is sane before reading input (lxc-attach|tee may corrupt tty state) + # Restore terminal state after lxc-attach|tee pipeline stty sane 2>/dev/null || true + # Drain stale input from terminal buffer (lxc-attach|tee leaves residual data + # that causes read to return immediately with empty input) + dd iflag=nonblock if=/dev/tty of=/dev/null 2>/dev/null || true + sleep 0.3 - # Read directly from /dev/tty (fresh open = clean state, no inherited corruption) + # Read user choice local response="" - if read -t 60 -r response /dev/null; then + if read -t 60 -r response /dev/null || true + dd iflag=nonblock if=/dev/tty of=/dev/null 2>/dev/null || true + sleep 0.3 local response="" - if read -t 60 -r response /dev/null; then + if read -t 60 -r response /dev/null 2>&1; then diff --git a/misc/tools.func b/misc/tools.func index 0ebde4bd5..e9d08dc51 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -934,7 +934,11 @@ upgrade_package() { # ------------------------------------------------------------------------------ # Repository availability check with caching # ------------------------------------------------------------------------------ -declare -A _REPO_CACHE 2>/dev/null || true +# Note: Must use -gA (global) because tools.func is sourced inside update_os() +# function scope. Plain 'declare -A' would create a local variable that gets +# destroyed when update_os() returns, causing "unbound variable" errors later +# when setup_postgresql/verify_repo_available tries to access the cache key. +declare -gA _REPO_CACHE 2>/dev/null || declare -A _REPO_CACHE 2>/dev/null || true verify_repo_available() { local repo_url="$1"