provisioning/scripts/ensure-typedialog.sh

223 lines
6.6 KiB
Bash
Raw Normal View History

2026-01-08 21:22:57 +00:00
#!/usr/bin/env bash
# ensure-typedialog.sh
# Ensures TypeDialog is installed and available in PATH
# Used by setup commands and scripts that depend on TypeDialog
#
# Usage:
# source ensure-typedialog.sh # Load as functions
# ensure_typedialog_installed # Check and install if needed
# ensure_typedialog_component tui # Ensure specific component
set -euo pipefail
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
INSTALLER_SCRIPT="${SCRIPT_DIR}/install-typedialog.sh"
# ============================================================================
# Helper Functions
# ============================================================================
print_info() {
echo -e "${BLUE} $1${NC}" >&2
}
print_success() {
echo -e "${GREEN}$1${NC}" >&2
}
print_warning() {
echo -e "${YELLOW}⚠️ $1${NC}" >&2
}
print_error() {
echo -e "${RED}$1${NC}" >&2
}
check_command() {
command -v "$1" &> /dev/null
}
# ============================================================================
# TypeDialog Installation Checks
# ============================================================================
ensure_typedialog_installed() {
local force=${1:-false}
if check_command "typedialog"; then
local version=$(typedialog --version 2>/dev/null | head -1)
print_success "TypeDialog available ($version)"
return 0
fi
if [[ "$force" == "true" ]]; then
print_warning "TypeDialog not found - installing..."
if [[ ! -f "$INSTALLER_SCRIPT" ]]; then
print_error "TypeDialog installer not found at: $INSTALLER_SCRIPT"
return 1
fi
# Run installer
if bash "$INSTALLER_SCRIPT" --components all --skip-validation 2>&1 | grep -E "(✅|❌|⚠️)" >&2; then
if check_command "typedialog"; then
print_success "TypeDialog installed successfully"
return 0
else
print_error "Installation completed but typedialog not in PATH"
return 1
fi
else
print_error "TypeDialog installation failed"
return 1
fi
else
print_warning "TypeDialog not found (--force to install)"
return 1
fi
}
ensure_typedialog_component() {
local component=$1
local component_binary="typedialog"
case "$component" in
cli) component_binary="typedialog" ;;
tui) component_binary="typedialog-tui" ;;
web) component_binary="typedialog-web" ;;
ag) component_binary="typedialog-ag" ;;
ai) component_binary="typedialog-ai" ;;
prov-gen) component_binary="typedialog-prov-gen" ;;
*)
print_error "Unknown component: $component"
return 1
;;
esac
if check_command "$component_binary"; then
local version=$("$component_binary" --version 2>/dev/null | head -1 || echo "unknown")
print_success "TypeDialog $component available ($version)"
return 0
else
print_warning "TypeDialog $component not available"
return 1
fi
}
ensure_typedialog_backends() {
local required_backends=${1:-"cli"} # Default to CLI
print_info "Checking required backends: $required_backends"
IFS=',' read -ra backends <<< "$required_backends"
local missing=()
for backend in "${backends[@]}"; do
backend=$(echo "$backend" | xargs) # trim
if ! ensure_typedialog_component "$backend"; then
missing+=("$backend")
fi
done
if [[ ${#missing[@]} -gt 0 ]]; then
print_warning "Missing backends: ${missing[*]}"
return 1
fi
print_success "All required backends available"
return 0
}
# ============================================================================
# Version Checking
# ============================================================================
check_typedialog_version() {
if ! check_command "typedialog"; then
print_error "TypeDialog not installed"
return 1
fi
local installed=$(typedialog --version 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown")
local required=$(grep -A 2 'name = "typedialog"' "${PROJECT_ROOT}/core/versions.ncl" 2>/dev/null | grep 'current = "' | sed 's/.*current = "\([^"]*\)".*/\1/' || echo "unknown")
echo "$installed"
if [[ "$installed" == "$required" ]] || [[ "$required" == "unknown" ]]; then
return 0
fi
print_warning "Version mismatch: installed=$installed, expected=$required"
return 1
}
# ============================================================================
# Main Entry Point (when run as script)
# ============================================================================
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
# Script mode
case "${1:-check}" in
check)
ensure_typedialog_installed false
;;
install|ensure)
ensure_typedialog_installed true
;;
component)
ensure_typedialog_component "${2:-cli}"
;;
backends)
ensure_typedialog_backends "${2:-cli}"
;;
version)
check_typedialog_version
;;
help)
cat <<EOF
${BLUE}ensure-typedialog.sh${NC}
Helper script to ensure TypeDialog is installed and available
Usage (as script):
ensure-typedialog.sh check # Check if installed (non-blocking)
ensure-typedialog.sh install # Install if missing (blocking)
ensure-typedialog.sh component COMP # Check specific component
ensure-typedialog.sh backends BACKEND # Check backends (comma-separated)
ensure-typedialog.sh version # Show installed version
Usage (as library):
source ensure-typedialog.sh
ensure_typedialog_installed true # Install if missing
ensure_typedialog_component tui # Check TUI backend
ensure_typedialog_backends "cli,tui" # Check multiple backends
check_typedialog_version # Get version
Examples:
# In another script:
source provisioning/scripts/ensure-typedialog.sh
ensure_typedialog_installed true || exit 1
# From command line:
./ensure-typedialog.sh install
./ensure-typedialog.sh backends "cli,tui,web"
EOF
;;
*)
print_error "Unknown command: $1"
echo "Use: $0 help"
exit 1
;;
esac
fi