From 5da6e59d2f55829b52c418723170716a7a6d9944 Mon Sep 17 00:00:00 2001 From: Godopu Date: Wed, 24 Jun 2026 12:28:17 +0900 Subject: [PATCH] fix(deploy): fix update.sh fallback mode, trap rollback, and database names --- deploy/update.sh | 69 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/deploy/update.sh b/deploy/update.sh index a265efd..be317fe 100644 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -76,12 +76,60 @@ fi HAS_MAM=0 if [ -d ".mam" ]; then HAS_MAM=1 - # Move .mam out of the way of remove.sh - mv ".mam" ".mam.update-tmp" + # Copy database and jobs to temporary backup outside of .mam. + # We do NOT move the .mam folder away so that remove.sh can still read .mam/install_manifest.txt! + mkdir -p .mam.update-tmp + # Copy SQLite databases and session files + for db in .mam/agent-sessions.*; do + if [ -f "$db" ]; then + cp -f "$db" .mam.update-tmp/ + fi + done + # Copy jobs history + if [ -d ".mam/jobs" ] && [ "$(ls -A .mam/jobs 2>/dev/null)" ]; then + mkdir -p .mam.update-tmp/jobs + cp -rf .mam/jobs/* .mam.update-tmp/jobs/ + fi + # Copy delegate logs + if [ -d ".mam/delegate_job_logs" ] && [ "$(ls -A .mam/delegate_job_logs 2>/dev/null)" ]; then + mkdir -p .mam.update-tmp/delegate_job_logs + cp -rf .mam/delegate_job_logs/* .mam.update-tmp/delegate_job_logs/ + fi + # Copy manifest so we have a backup + if [ -f ".mam/install_manifest.txt" ]; then + cp -f .mam/install_manifest.txt .mam.update-tmp/ + fi fi +# Define trap to restore backup files on failure +restore_on_failure() { + echo "❌ Update failed. Reverting configuration and database to previous state..." + if [ $HAS_ENV -eq 1 ] && [ -f ".env.update-tmp" ]; then + mv -f ".env.update-tmp" ".env" 2>/dev/null || true + fi + if [ $HAS_MAM -eq 1 ] && [ -d ".mam.update-tmp" ]; then + # Revert to old database/jobs backup by restoring .mam directory + rm -rf .mam 2>/dev/null || true + mkdir -p .mam + cp -f .mam.update-tmp/agent-sessions.* .mam/ 2>/dev/null || true + if [ -d ".mam.update-tmp/jobs" ]; then + cp -rf .mam.update-tmp/jobs .mam/ 2>/dev/null || true + fi + if [ -d ".mam.update-tmp/delegate_job_logs" ]; then + cp -rf .mam.update-tmp/delegate_job_logs .mam/ 2>/dev/null || true + fi + if [ -f ".mam.update-tmp/install_manifest.txt" ]; then + cp -f .mam.update-tmp/install_manifest.txt .mam/ 2>/dev/null || true + fi + rm -rf .mam.update-tmp 2>/dev/null || true + fi +} +trap restore_on_failure EXIT + # 3. Perform uninstallation of existing files echo "🗑️ Removing existing installation..." +# remove.sh will run in manifest mode because .mam/install_manifest.txt is still present. +# It will delete .agents/, documents, scripts, .venv, and .mam folder. bash remove.sh --force # 4. Fetch and run the latest installer from Gitea @@ -93,13 +141,12 @@ elif command -v wget &>/dev/null; then wget -qO- "$INSTALLER_URL" | bash -s -- "$TARGET_DIR" else echo "❌ Error: Neither 'curl' nor 'wget' is available to fetch the installer." >&2 - - # Restore backups before failing - if [ $HAS_ENV -eq 1 ]; then mv ".env.update-tmp" ".env"; fi - if [ $HAS_MAM -eq 1 ]; then mv ".mam.update-tmp" ".mam"; fi exit 1 fi +# Disable failure trap since installation succeeded +trap - EXIT + # 5. Restore backups of configuration and database echo "🔄 Restoring configuration and database..." if [ $HAS_ENV -eq 1 ]; then @@ -108,26 +155,22 @@ if [ $HAS_ENV -eq 1 ]; then fi if [ $HAS_MAM -eq 1 ]; then - # The installer created a new .mam directory with a new manifest. - # We want to merge the old .mam database/jobs back while keeping the new manifest. if [ -d ".mam.update-tmp" ]; then - # Copy SQLite databases - for db in .mam.update-tmp/db.sqlite*; do + # The installer created a new .mam directory with a new manifest. + # We want to merge the old .mam database/jobs back while keeping the new manifest. + for db in .mam.update-tmp/agent-sessions.*; do if [ -f "$db" ]; then cp -f "$db" .mam/ fi done - # Copy jobs history if [ -d ".mam.update-tmp/jobs" ] && [ "$(ls -A .mam.update-tmp/jobs 2>/dev/null)" ]; then mkdir -p .mam/jobs cp -rf .mam.update-tmp/jobs/* .mam/jobs/ fi - # Copy delegate logs if [ -d ".mam.update-tmp/delegate_job_logs" ] && [ "$(ls -A .mam.update-tmp/delegate_job_logs 2>/dev/null)" ]; then mkdir -p .mam/delegate_job_logs cp -rf .mam.update-tmp/delegate_job_logs/* .mam/delegate_job_logs/ fi - # Clean up the backup directory rm -rf ".mam.update-tmp" fi fi