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
macos-latest closes all three at once: APFS is case-insensitive by default,
the runner is arm64 (some aarch64 coverage, which the flake claims to support
but never builds in CI), and it exercises the non-Linux rename fallback.
Suggested scope
A test-only job, not a second copy of the full gate. fmt, clippy, audit and doc are platform-independent; re-running them buys nothing and
doubles the minutes. Nix is unnecessary too — dtolnay/rust-toolchain + cargo test --locked is enough, and much faster than provisioning Nix on a
macOS runner.
Adding the job turns CI red immediately. The failures are real information, not
noise, but they need handling in the right order.
Fixtures that collapse on a case-insensitive filesystem. These tests create
two entries in one directory whose names fold together, so the second write
overwrites the first and the fixture silently becomes a single file:
Fixtures in the same directory
File
CAFÉ.TXT / Café.txt / café.txt
tests/cli_tests.rs
CAFE.txt / cafe.txt
tests/cli_tests.rs
Fichier.txt / fichier.txt
tests/cli_tests.rs
Visible.txt / visible.txt
tests/cli_tests.rs
These are test-harness bugs, fixable on their own: pick fixture names that stay
distinct under case folding (that is what most of the suite already does — Fichier Test.txt → fichier-test.txt differs by more than case).
Assertions blocked on #4.Visible.txt → visible.txt, Fichier.txt → fichier.txt and CAFE.txt → cafe.txt are case-only renames, which macOS
currently refuses (#4). Those assertions cannot pass until #4 is fixed.
Suggested order:
Fix the fixture collisions above (green on Linux, no behaviour change).
Summary
All three CI jobs run on
ubuntu-latest(.github/workflows/ci.yml), so everyplatform-conditional branch in the codebase ships untested:
rename_no_clobber(src/main.rs:392-401) — the#[cfg(not(target_os = "linux"))]fallback,try_exists()+std::fs::rename, has never beenexecuted by CI. It is the branch implicated in Dangling symlink at the destination escapes conflict detection #5.
is_same_entry(src/lib.rs:769) — the#[cfg(not(unix))]arm, likewise.and unfixable today: a correction there would be a blind change to the only
code path allowed to touch the filesystem.
macos-latestcloses all three at once: APFS is case-insensitive by default,the runner is arm64 (some
aarch64coverage, which the flake claims to supportbut never builds in CI), and it exercises the non-Linux rename fallback.
Suggested scope
A test-only job, not a second copy of the full gate.
fmt,clippy,auditanddocare platform-independent; re-running them buys nothing anddoubles the minutes. Nix is unnecessary too —
dtolnay/rust-toolchain+cargo test --lockedis enough, and much faster than provisioning Nix on amacOS runner.
Expected fallout — read this before landing
Adding the job turns CI red immediately. The failures are real information, not
noise, but they need handling in the right order.
Fixtures that collapse on a case-insensitive filesystem. These tests create
two entries in one directory whose names fold together, so the second
writeoverwrites the first and the fixture silently becomes a single file:
CAFÉ.TXT/Café.txt/café.txttests/cli_tests.rsCAFE.txt/cafe.txttests/cli_tests.rsFichier.txt/fichier.txttests/cli_tests.rsVisible.txt/visible.txttests/cli_tests.rsThese are test-harness bugs, fixable on their own: pick fixture names that stay
distinct under case folding (that is what most of the suite already does —
Fichier Test.txt→fichier-test.txtdiffers by more than case).Assertions blocked on #4.
Visible.txt→visible.txt,Fichier.txt→fichier.txtandCAFE.txt→cafe.txtare case-only renames, which macOScurrently refuses (#4). Those assertions cannot pass until #4 is fixed.
Suggested order:
#[cfg_attr(target_os = "macos", ignore)], referencing Case-only renames rejected on case-insensitive filesystems (macOS) #4.ignore— the test suite becomes the proof that thefix works, which is exactly what is missing today.
Blocks #4. Related: #5.