Repository navigation
v1.12.5 - estate-restore --to refuses a link or a hard-linked file already at a restored file's path
estate-restore --to refuses a link or a hard-linked file already at a restored file's path
A restore with --to <dir> already refused a link planted in a directory below the destination, but it did not look at the restored file's own path. Nothing a user could do before is taken away. The installed plugin moved: scripts/lib/estate-archive.mjs (six lines in restoreSession), skills/coalwash/references/method.md and its plugin/ twin.
Fixed
estate-restore --to <dir>checks the final file path too (CodeRabbit, PR #18, threadr4231603560).ownSandboxDirchecked every directory component under the destination, but not the file path itself. Before the write,restoreSessionnow reads the entry already at that path withlstat. A symlink (dangling or not) or a junction there is refused with "restore refused on : the destination file is a link (a restore never writes through a link under its destination)". An entry that is not a regular file, or a file with a second hard link, is refused with "restore refused on : the destination entry is not a single-link regular file (a restore never writes through a link under its destination)". The planted entry is left in place, and files already written stay. An absent path and an ordinary single-link file behave as before. Measured on Windows before the fix: a junction there failed with a bareEPERMon the rename and no stated reason, and a hard link there was replaced (ok: true), the outside file untouched; the file-symlink legs could not be made on that box. The destination root may still be a link, your own choice. — test:scripts/lib/estate-archive.test.mjs,fire 67: a ${kind} already at <to>/<sid>.jsonl is refused, and what it points at is untouched(one leg each for a file symlink, a dangling file symlink, a junction and a hard link; a leg whose link this volume cannot make skips visibly; the file-symlink legs ran on no box yet, they belong to the POSIX CI legs) and its controlfire 67 control: an ordinary single-link file already at <to>/<sid>.jsonl is still replaced by the restored bytes
Changed
- Docs: the
estate-restorerow, the Write guard row and the Docs link inREADME.md, andreferences/method.md§3, now say what the code does. Theestate-restorerow andmethod.mdname the final-path check above. The Write guard row said "Off:writeGuard: "snapshot-only"or"off""; inconfig-schema.mjssnapshot-onlykeeps the airbag and silences only the advisory, and only"off"turns the guard off. The list of remaining subcommands namesconfig-status, which was missing from it. The Docs line points athttps://docs.thecolliery.org/tools/coalwash, and "(publishing soon)" is gone. - Contributor-facing: canon re-copies. Six files re-copied by blob from the org canon at
.github9456288:scripts/lib/wave-run.test.mjs,scripts/lib/git-env-census.mjs,scripts/lib/git-env-census.vectors.mjs,scripts/lib/machine-reading.mjs,scripts/verify-release-shape.mjsandscripts/verify-release-shape.test.mjs. Dev tooling; none of it is in the installed plugin. - Contributor-facing: test fixes (CodeRabbit
t120, PR #18,E2-3,E2-5,E2-6). The held-cwd child intest-plan.test.mjsruns with HOME, USERPROFILE, TEMP, TMP and TMPDIR pointed at its sandbox, and its readiness wait is bounded by a poll count, notDate.now(). A newgit-env.test.mjstest provesgitEnvremovesGIT_DIRandGIT_INDEX_FILEfrom its copy and leavesprocess.envalone. The FIFO test inrepo-fs.test.mjsprobes whether a FIFO can be made (mkfifoexits 0 and the path is a FIFO) in place of a platform check; the platform gate on thewizard.test.mjsshort-name test is dropped and its child getsstdioand a timeout.build-plugin.mjsexportsDEV_ONLY_LIBS,build-plugin.test.mjsloops its never-ships check over every entry, and the failure text and comments name what the list holds.