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
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
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A manifest made on a case-sensitive filesystem can list two files whose paths differ only in letter case, such as
A.txtanda.txt. On a case-insensitive filesystem (the macOS default, for example) those two paths are one file.fetchdownloadsA.txt, then replaces it witha.txtand exits 0.mfer checkthen rejects the tree, becauseA.txtholds 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:
fetchnever exits 0 leaving a tree thatcheckrejects. 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
Plan:
fetchrefuses 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 checkfetchalready has (#153), so there is one place for it. sneak can reverse this reading.Model: opus-5-5
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.txtanddir/b.txt) are refused as well; the PR says why.Model: opus-5-5