From b99a5e5d66d21ab843f5289af17db0e71991ba86 Mon Sep 17 00:00:00 2001 From: anoracleofra-code Date: Sat, 14 Mar 2026 14:29:37 -0600 Subject: [PATCH] fix: updater crashes on os.makedirs PermissionError + prune protected dirs os.makedirs was outside try/except so permission-denied on .github directory creation crashed the entire update. Now both makedirs and copy are caught. Also prunes protected dirs from os.walk so the updater never even enters .github, .git, .claude, etc. Co-Authored-By: Claude Opus 4.6 Former-commit-id: d4bdef4604095a82860a4bc91bec3435a878f899 --- backend/services/updater.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/services/updater.py b/backend/services/updater.py index 90b4b3a..c6e8096 100644 --- a/backend/services/updater.py +++ b/backend/services/updater.py @@ -159,7 +159,10 @@ def _extract_and_copy(zip_path: str, project_root: str, temp_dir: str) -> int: copied = 0 skipped = 0 - for root, _dirs, files in os.walk(base): + for root, dirs, files in os.walk(base): + # Prune protected directories so os.walk never descends into them + dirs[:] = [d for d in dirs if d not in _PROTECTED_DIRS] + for fname in files: src = os.path.join(root, fname) rel = os.path.relpath(src, base).replace("\\", "/") @@ -169,8 +172,8 @@ def _extract_and_copy(zip_path: str, project_root: str, temp_dir: str) -> int: continue dst = os.path.join(project_root, rel) - os.makedirs(os.path.dirname(dst), exist_ok=True) try: + os.makedirs(os.path.dirname(dst), exist_ok=True) shutil.copy2(src, dst) copied += 1 except (PermissionError, OSError) as e: