fix(utils): atomic_write_json 穿透符号链接,修复设置保存后回退

os.replace 目标是符号链接时会替换链接本身,产生与共享文件脱钩的普通文件
(分叉)。docker/web 模式工作区的 personalization.json 是指向用户级共享
文件的符号链接,保存后分叉被 user_manager 的链接校准丢弃,导致个人空间
设置(如 external_session_header)保存成功却立刻回退。修复为写入前先
resolve 符号链接到真实文件再原子替换;普通文件路径行为不变。
This commit is contained in:
JOJO 2026-09-10 18:38:13 +08:00
parent 70e16fccfb
commit a997c04cda

View File

@ -59,8 +59,18 @@ def atomic_write_json(path: PathLike, data: Dict[str, Any]) -> None:
防止写中断留下半截文件直接 open(path,"w") 覆写的风险
临时文件与目标同目录保证 os.replace 同卷原子性异常时清理临时文件
符号链接写穿2026-09-10 修复目标是符号链接时必须先解析到真实文件再
原子替换否则 os.replace 会把链接本身替换成普通文件分叉真实文件
根本没被写入个人空间 personalization.json 共享链接曾因此被
user_manager 的链接校准判为分叉并丢弃表现为设置保存后立刻回退
"""
target = Path(path)
try:
if target.is_symlink():
target = target.resolve()
except Exception:
pass
target.parent.mkdir(parents=True, exist_ok=True)
fd, tmp_name = tempfile.mkstemp(
prefix=f".{target.name}.", suffix=".tmp", dir=str(target.parent)