fetch: two listed files whose names differ only in letter case replace each other on a case-insensitive filesystem #154

Closed
opened 2026-10-04 19:13:45 +02:00 by clawbot · 2 comments
Collaborator

A manifest made on a case-sensitive filesystem can list two files whose paths differ only in letter case, such as A.txt and a.txt. On a case-insensitive filesystem (the macOS default, for example) those two paths are one file. fetch downloads A.txt, then replaces it with a.txt and exits 0. mfer check then rejects the tree, because A.txt holds the other file's content, and every later fetch downloads it again. The same goes for a file and a directory whose names differ only in case.

#153 refuses a listed file that sits at another listed file's temp name, comparing names ignoring case. It does not catch two listed files at what is one name on such a filesystem.

Acceptable: fetch never exits 0 leaving a tree that check rejects. For example, it refuses such a manifest before it creates the destination or requests any file, and a test covers it.

Unverified: this follows from reading the code; it has not been run on a case-insensitive filesystem.

Model: opus-5-5

A manifest made on a case-sensitive filesystem can list two files whose paths differ only in letter case, such as `A.txt` and `a.txt`. On a case-insensitive filesystem (the macOS default, for example) those two paths are one file. `fetch` downloads `A.txt`, then replaces it with `a.txt` and exits 0. `mfer check` then rejects the tree, because `A.txt` holds the other file's content, and every later fetch downloads it again. The same goes for a file and a directory whose names differ only in case. https://git.eeqj.de/sneak/mfer/pulls/153 refuses a listed file that sits at another listed file's temp name, comparing names ignoring case. It does not catch two listed files at what is one name on such a filesystem. Acceptable: `fetch` never exits 0 leaving a tree that `check` rejects. For example, it refuses such a manifest before it creates the destination or requests any file, and a test covers it. Unverified: this follows from reading the code; it has not been run on a case-insensitive filesystem. Model: opus-5-5
Author
Collaborator

Plan: fetch refuses a manifest in which two listed paths (files or directories) are equal when letter case is ignored, before it creates the destination or requests any file, with a test. It refuses on every filesystem, not only case-insensitive ones: a manifest meant to be fetched anywhere should not depend on where it lands, and detecting the destination filesystem adds machinery for little gain. The check joins the name-clash check fetch already has (#153), so there is one place for it. sneak can reverse this reading.

Model: opus-5-5

Plan: `fetch` refuses a manifest in which two listed paths (files or directories) are equal when letter case is ignored, before it creates the destination or requests any file, with a test. It refuses on every filesystem, not only case-insensitive ones: a manifest meant to be fetched anywhere should not depend on where it lands, and detecting the destination filesystem adds machinery for little gain. The check joins the name-clash check `fetch` already has (https://git.eeqj.de/sneak/mfer/pulls/153), so there is one place for it. sneak can reverse this reading. Model: opus-5-5
clawbot self-assigned this 2026-10-06 00:49:19 +02:00
Author
Collaborator

Built in #157, as the plan above describes. The existing name-clash check now also catches two listed files, or a listed file and a directory another listed file is in, whose names are equal when letter case is ignored. It refuses on every filesystem, before anything is created or downloaded. Two spellings of one directory (Dir/a.txt and dir/b.txt) are refused as well; the PR says why.

Model: opus-5-5

Built in https://git.eeqj.de/sneak/mfer/pulls/157, as the plan above describes. The existing name-clash check now also catches two listed files, or a listed file and a directory another listed file is in, whose names are equal when letter case is ignored. It refuses on every filesystem, before anything is created or downloaded. Two spellings of one directory (`Dir/a.txt` and `dir/b.txt`) are refused as well; the PR says why. Model: opus-5-5
Sign in to join this conversation.