From 310fdf3c14cbcd7b665755ad3b3e6205dcda1f7a Mon Sep 17 00:00:00 2001 From: LIghtJUNction Date: Thu, 2 Apr 2026 19:38:17 +0800 Subject: [PATCH] fix: handle broken dashboard dist symlink in hatch build hook for AUR compatibility --- scripts/hatch_build.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/scripts/hatch_build.py b/scripts/hatch_build.py index b179fe30a..e6bf2ceb5 100644 --- a/scripts/hatch_build.py +++ b/scripts/hatch_build.py @@ -17,7 +17,6 @@ When enabled, this hook: import os import shutil import subprocess -import sys from logging import getLogger from pathlib import Path @@ -38,17 +37,23 @@ class CustomBuildHook(BuildHookInterface): if os.environ.get("ASTRBOT_BUILD_DASHBOARD", "").strip() != "1": # Ensure the target directory and a placeholder exist so the wheel # build does not fail when artifacts = ["..."] is declared. + # Handle the case where dist_target might be a broken symlink (e.g. in AUR builds) + if dist_target.is_symlink() or dist_target.is_file(): + dist_target.unlink() + dist_target.mkdir(parents=True, exist_ok=True) - if not dist_target.exists() or not any(dist_target.iterdir()): + if not any(dist_target.iterdir()): placeholder = dist_target / ".placeholder" placeholder.write_text("# dashboard placeholder\n") return if not dashboard_src.exists(): logger.warning( - "[hatch_build] 'dashboard/' directory not found: skipping dashboard build.", - file=sys.stderr, + "[hatch_build] 'dashboard/' directory not found: skipping dashboard build." ) + if dist_target.is_symlink() or dist_target.is_file(): + dist_target.unlink() + dist_target.mkdir(parents=True, exist_ok=True) placeholder = dist_target / ".placeholder" placeholder.write_text("# dashboard placeholder\n") @@ -73,17 +78,22 @@ class CustomBuildHook(BuildHookInterface): if not dist_src.exists(): logger.warning( - "[hatch_build] dashboard/dist not found after build: skipping copy.", - file=sys.stderr, + "[hatch_build] dashboard/dist not found after build: skipping copy." ) + if dist_target.is_symlink() or dist_target.is_file(): + dist_target.unlink() + dist_target.mkdir(parents=True, exist_ok=True) placeholder = dist_target / ".placeholder" placeholder.write_text("# dashboard placeholder\n") return # ── Copy into the Python package tree ─────────────────────────────── - if dist_target.exists(): + if dist_target.is_symlink() or dist_target.is_file(): + dist_target.unlink() + elif dist_target.exists(): shutil.rmtree(dist_target) + shutil.copytree(dist_src, dist_target) logger.info( f"[hatch_build] Dashboard dist copied → {dist_target.relative_to(root)}"