Repository navigation
0.8.40 — 备份简化成两个按钮 + 部署不再只给体检
备份简化成两个按钮 + 远程 dsh 部署不再只给体检
备份:只剩「备份」和「恢复」两个按钮
0.8.38 的备份面板把「留个底」做成了配置题:排除项文本框、存放位置(远端/本机/两边)、
恢复模式(替换/合并),外加每个归档一行的校验/下载/传回/删除。实际用法只有一件事——
留个底,需要时再回来。现在:
- 「备份」 —— 一键把侧边栏里的所有远程工作区打包成一个
.tar.gz。 - 「恢复」 —— 从下拉里选一个备份时间点,一键把全部工作区还原。
- 依赖/构建目录(
node_modules、.git、dist、build、target、__pycache__、.venv…)
顶层与嵌套都自动排除,不需要用户决定。校验/下载/删除仍在,但只在选中某个备份后才出现。
归档是自描述的:里面带 dsh-remote-backup.json/manifest.json(机器、时间、工作区清单、
排除项、sha256)和一份 paths.tsv(归档成员 ↔ 绝对路径)。恢复端不需要 JSON 解析器就能
知道每个工作区该放回哪里;原来的绝对路径建不出来时(例如把另一台机器的归档恢复过来)会退到
/tmp/<名字>,而不是整批失败。
安全属性没有让步(都带实测用例):
- 归档先校验再动手:损坏/截断 ⇒ 拒绝,目标一个字节都不动。
- 每个工作区是「旧目录先移到一旁 → 换入新的 → 最后才删旧的」,换入失败会把原目录移回去。
- 归档先写 staging 再
mv,绝不发布截断的归档;且先检查所有工作区都存在,
缺一个就整体拒绝——否则「我备份过了」会变成假话。 - 备份目录在某个工作区里时,会自动排除自己,避免每次备份把上一次的增长进去。
- 生成脚本里永不出现
-P/--absolute-names(否则越界成员能写出目标之外)。
这里由真实 shell 抓出三个 bug(字符串断言全都通过):
paths.tsv注入在tar之后,于是 tar 报Cannot stat→ 改为两个 manifest 文件都在
tar 之前由构造器写出。- 存在性检查用了归档成员名(
allws/w1)而不是真实路径(/tmp/allws/w1)→ 每次
these workspaces do not exist。 - manifest 文件写在了 staging 目录根下,而 tar 是以
dsh-remote-backup.json/这个目录
为成员去加的 → 改为先mkdir这个子目录。
另外修掉一个不可见的缺陷:手写的 */ 前缀模式里混进了一个零宽空格(U+200B),
在 diff 里完全看不出来但让模式匹配不到任何东西。现在这类模式由裸目录名派生,
并用用例断言全部是可打印 ASCII。
远程 dsh 部署:按钮不再被体检门控
「部署并验证」以前只在先跑过体检、且体检判定有毛病时才出现
(deploy.verdict.canAutoInstall && !deploy.verdict.ok)。于是只看到体检按钮的用户
永远点不到真正干活的按钮——它在等一次你没有理由去做的检查。宿主侧的 install 动作
本来就会自己重新体检,所以现在按钮始终可用,点击即显式同意。
顺带
- 设置页 i18n 清掉 17 个随面板一起作废的键(中英同步,用例保证两边键集一致)。
- README ×2 的备份说明与配置表按新行为更新。