fetch refuses a manifest whose paths differ only in letter case (closes #154)
check / check (push) Failing after 1s

On a case-insensitive filesystem, such as the macOS default, A.txt and
a.txt are one file: fetch downloaded one, replaced it with the other and
exited 0, leaving a tree check rejects. A file and a directory whose
names differ only in case did the same.

The existing name-clash check now also records each listed file, and
each directory one is in, among the names fetch writes. A listed file at
a name already taken, or a directory spelled differently from one
already there, refuses the manifest on every filesystem, before the
destination is created or any file requested. The message names both
paths.

Model: opus-5-5
This commit is contained in:
2026-10-05 23:01:15 +00:00
parent ce024baaed
commit c3f96d768f
3 changed files with 90 additions and 15 deletions
+5 -3
View File
@@ -274,9 +274,11 @@ are now tracked only in the [issues](https://git.eeqj.de/sneak/mfer/issues).
tree later. Each file is downloaded to a temp file beside it, such as
`.a.txt.tmp` for `a.txt`, then moved into place. A manifest is refused
before any file is downloaded if it lists a file where fetch writes
another: at the temp file of a listed file, or at `index.mf` or
`.index.mf.tmp` at the top of the tree. Names are compared in any letter
case.
another: at another listed file or a directory one is in, at the temp file
of a listed file, or at `index.mf` or `.index.mf.tmp` at the top of the
tree. Names are compared in any letter case, on every filesystem, since on
a case-insensitive one `A.txt` and `a.txt` are one file; a directory two
listed files are in must be spelled alike in both.
- `mfer fetch --require-signature <fingerprint> https://example.com/stuff/`
- as above, but first refuses a manifest not signed by the key with that
fingerprint, as `mfer check --require-signature` does, before downloading