You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
On a case-insensitive Linux mount (WSL /mnt/c, exFAT/NTFS USB), Save.png and save.PNG overwrite each other's output yet both count as written, and -o icons over -i Icons replaces the sources #166
Case sensitivity is a property of the filesystem, not of the OS. Linux often works on case-insensitive volumes: WSL's /mnt/c, Docker Desktop bind mounts, exFAT/NTFS USB drives, and ext4 casefold directories. macOS can also format a volume case-sensitive.
Failure scenarios (traced)
Silent overwrite between inputs. On WSL, an input folder /mnt/c/Icons holds Save.png and save.PNG. Their output names are Save.png and save.png, which are different Ordinal keys, so no collision is reported. On disk they are the same file. The second input overwrites the first, the summary says "2 file(s) written", and the exit code is 0.
The reverse on a case-sensitive APFS volume.-i Icons -o icons is rejected, although they are two different directories. Inputs A.png and a.png are reported as a collision, and the run exits 2.
I could not mount a case-insensitive filesystem in the sandbox, so these are traced from the code rather than reproduced.
Decide output collisions from the output folder's actual behaviour. Either probe it once (write a temp file, then check whether its case-swapped name exists), or refuse to write over a file this run has already written, compared by identity.
Add tests for a case-alias output directory and for inputs whose names differ only in case. Where the CI host cannot provide a case-insensitive mount, an injectable comparer or probe is fine.
Related: #120 (closed, the original overwrite fix) and #157 (symlinked output, the directory half only).
Area / suggested assignment:IconHelper/Arguments.cs (PathComparison, IsSameDirectory) and the written collision dictionary in IconHelper/IconHelper.cs. This is path-identity and safety logic in the CLI.
Next step: Replace the string comparison in IsSameDirectory with an identity check, and refuse to overwrite a file this run has already written, again compared by identity. Use an injectable comparer or probe so CI can test case-insensitive behaviour without a real mount.
Activity
matt-edmondson commentedon Nov 2, 2026
Triage
/mnt/c, USB drives). Scenario 1 loses output silently while reporting success. Neither has been reproduced yet; both are traced from the code.IconHelper/Arguments.cs(PathComparison,IsSameDirectory) and thewrittencollision dictionary inIconHelper/IconHelper.cs. This is path-identity and safety logic in the CLI.IsSameDirectorywith an identity check, and refuse to overwrite a file this run has already written, again compared by identity. Use an injectable comparer or probe so CI can test case-insensitive behaviour without a real mount.Generated by Claude Code