[fix] clear confirmed update receipts before temporary cleanup

This commit is contained in:
dijunkun
2026-10-21 03:17:20 +08:00
parent ef02ef2e6c
commit 2ea462764d
2 changed files with 15 additions and 3 deletions
+10 -1
View File
@@ -20,6 +20,10 @@ Controller::Controller(fs::path cache) : cache_(std::move(cache)) {
state_ = State::Failed;
error_ = result.value("error", std::string("Update did not complete")) +
"\n" + PathUtf8(previous);
} else if (fs::exists(previous / "started")) {
// Retire receipts confirmed by older clients too, before temporary
// storage is cleaned by the OS and a successful update looks interrupted.
fs::remove(cache_ / "last-update");
}
} catch (const std::exception&) {}
}
@@ -33,7 +37,12 @@ void Controller::ConfirmStartup() {
PlatformKey(ExecutablePath()), "0.0.0");
auto built = BuildVersion();
if (!built.empty() && built[0] == 'v') built.erase(0, 1);
if (artifact.version == built) WriteText(previous / "started", "started\n");
if (artifact.version == built) {
WriteText(previous / "started", "started\n");
// Acknowledge the coordinator first. Successful startup no longer needs
// a persistent pointer into a temporary job directory.
fs::remove(cache_ / "last-update");
}
} catch (const std::exception&) {}
}
Controller::~Controller() {
+5 -2
View File
@@ -116,8 +116,11 @@ xmake b crossdesk
下载、验签或准备失败时不关闭主程序。主程序退出后的安装失败会尝试
重启;macOS/Linux 在退出前取消授权时保留原程序和连接。
`last-update` 位于应用缓存目录,指向私有暂存目录;`request.json` 和
`result.json` 保留升级版本及结果,未完成的任务不会自动重放。成功启动后
删除大型安装包,保留少量诊断文件。失败任务保留下载包便于排查。
`result.json` 保留升级版本及结果,未完成的任务不会自动重放。新版本确认
启动后先通知升级器,再清除 `last-update`,避免临时目录被系统清理后
误报升级中断;旧客户端已经确认成功的记录也会在下次启动时清除。
升级器随后删除大型安装包,保留少量诊断文件。失败任务保留记录和下载包
便于排查。
NSIS、PKG 和 DEB 的安装操作不是跨平台事务。当前没有自动回滚承诺:
安装中断或新版本启动失败时,保留错误并提供手动修复安装路径。不能通过