Skip to content

Commit d243130

Browse files
doublegateclaude
andauthored
fix(ci): check out Rust sources as LF on Windows too (#582)
* fix(ci): check out Rust sources as LF on Windows too main's CI failed after the v2.9.8 merge (0bd814d), on `test (windows-latest)` only, so Auto Release skipped and v2.9.8 has no tag yet. The failure: app::tests::every_load_path_installs_a_dual_system_cabinet `build_dual_cabinet` is called from `cabinet_for_image` only left: 3, right: 1 The cause is the checkout, not the code. The frontend's source-shape tests read app.rs with include_str! and cut off the test module at "\n#[cfg(test)]\nmod tests {". The windows-latest runner checks out with core.autocrlf, so the file is CRLF and that pattern never matches. The "production" text is then the whole file, and the test counts its own assertion strings: three occurrences of `self.build_dual_cabinet(` where production has one. Splits on the bare "\n#[cfg(test)]" survive CRLF, because the "\n" is still inside "\r\n"; only the two "...\nmod tests {" splits break, which is why one test failed and not six. Pull requests never saw it: the matrix gives non-release PRs Linux only, and Windows tests run on main and on release/* branches. This branch is named release/* so its PR runs Windows. Fix: `*.rs text eol=lf` in .gitattributes, next to the existing WGSL/GLSL rule that exists for the same reason (a byte-compared shader generator). Every .rs file is already LF in the index (`git ls-files --eol`: 523 of 523 i/lf), so no committed byte changes; only what a Windows checkout writes. Rust compiles LF sources on every platform. Not done: making each test split CRLF-tolerant. The attribute fixes the cause for every test that reads source, including future ones, which a per-test patch would not. Verified: converting app.rs to CRLF locally reproduces the failure exactly (left 3, right 1); restoring LF passes it. `git check-attr` reports eol=lf for app.rs. The Windows leg of this PR's CI is the real check. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * docs(release): v2.9.8 ships the 261001 bitstream pair The release notes promised bitstreams "compiled from the release commit at fitter seed 2, on the day of the release". That is no longer true. The release-day compile of the merged sibling (65d86a6, BUILD_DATE 261003) missed on-die setup by 0.162 ns on the pll_hdmi output counter (Slow 1100mV -40C), and release-rbf.sh refused it. The off-die build closed (+0.033 / +0.116 ns). At the maintainer's direction (2026-10-03, the v2.9.3 precedent), v2.9.8 ships the pair compiled at 261001. That compile came from hardware sources identical to the release commit: the diff of rtl/, sys/, *.qip and *.sdc between its tree (e2f88bd) and the merge is empty. Timing: on-die +0.656 / +0.105 ns, off-die +0.033 / +0.116 ns. Two clean compiles of each were byte-identical: on-die 132ec5c0..., off-die 995f8259.... The notes now say exactly that, carry both md5s (the old text promised to add them on attach), and name the datecoded on-die file, RustyNES_20261001.rbf. The sibling's releases/ change is its PR #50. CHANGELOG's Verification bullet records the same fact. The release audits (notes render, anchors, state prose) pass, and markdownlint is clean. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 0bd814d commit d243130

3 files changed

Lines changed: 20 additions & 4 deletions

File tree

‎.gitattributes‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,14 @@
44
# and break that strict equality. WGSL/GLSL line endings are not semantic.
55
*.wgsl text eol=lf
66
*.glsl text eol=lf
7+
8+
# Rust sources are LF on every platform for the same reason (v2.9.8). The
9+
# frontend's source-shape tests read `app.rs` through `include_str!` and split
10+
# off the test module on "\n#[cfg(test)]\nmod tests {". A CRLF checkout -- the
11+
# default on the windows-latest runner -- matches no split, so the tests then
12+
# search their own text: `every_load_path_installs_a_dual_system_cabinet` found
13+
# `self.build_dual_cabinet(` 3 times instead of 1 and failed main's CI on
14+
# Windows only, after passing every PR run (PRs test Linux only). Every `.rs`
15+
# file is already LF in the index (`git ls-files --eol`: 523 of 523), so this
16+
# changes no committed byte; it fixes what a Windows checkout writes.
17+
*.rs text eol=lf

‎.github/release-notes/v2.9.8.md‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ The core's colours now match the emulator's, entry for entry, and a new co-simul
6161

6262
Both builds were re-swept on the new RTL, and fitter seed 2 stays pinned. On-die every seed closes. Off-die, three seeds fail, and seed 2 closes with 33 ps of setup margin, the thinnest this project has pinned.
6363

64-
Both bitstreams are compiled from the release commit at fitter seed 2, on the day of the release, because the build date is part of the design. Two clean compiles of each build were checked byte-identical before the release. The md5 of each attached file is added to this page when the files are attached.
64+
The attached bitstreams were compiled on 2026-10-01 (build date 261001), at fitter seed 2, from hardware sources identical to the release commit. The build date is part of the design, so a compile on another day is a new placement. On release day the on-die build missed timing by 0.162 ns on the HDMI clock, so the 261001 pair ships instead, as v2.9.3 did. Two clean compiles of each were byte-identical:
65+
66+
- on-die: md5 `132ec5c00356a8502823d8fcee53f44f` (timing +0.656 ns setup, +0.105 ns hold);
67+
- off-die: md5 `995f82595902131f128e8f0e3d183f12` (+0.033 ns setup, +0.116 ns hold).
6568

6669
**No hardware has run any bitstream.**
6770

@@ -82,6 +85,6 @@ Both bitstreams are compiled from the release commit at fitter seed 2, on the da
8285
## Install
8386

8487
- Download the pre-built binaries for Linux, macOS, and Windows below.
85-
- The MiSTer core bitstreams are attached below. The on-die build is `RustyNES_MiSTer-v2.9.8.rbf`, also attached under its datecoded name, and the off-die build is `RustyNES_MiSTer-v2.9.8-offdie.rbf`.
88+
- The MiSTer core bitstreams are attached below. The on-die build is `RustyNES_MiSTer-v2.9.8.rbf`, also attached under its datecoded name `RustyNES_20261001.rbf`, and the off-die build is `RustyNES_MiSTer-v2.9.8-offdie.rbf`.
8689
- The WebAssembly build is live at [doublegate.github.io/RustyNES](https://doublegate.github.io/RustyNES/).
8790
- Licensed under GPL-3.0-or-later.

‎CHANGELOG.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,10 @@ number as preparation for v3.0.0, whose notes will restate every one of them.
583583
- Performance is two `ab_check.sh` runs per claim, recorded in
584584
`docs/performance.md`, including the end-to-end result that does not add up.
585585
- The MiSTer core: on-die ladder 175 passed, 0 failed, 1 expected failure, and
586-
off-die 176 / 0 / 1. Both builds were re-swept at the build date, seed 2
587-
stays pinned, and two clean compiles of each are byte-identical.
586+
off-die 176 / 0 / 1. Both builds were re-swept at build date 261001, seed
587+
2 stays pinned, and two clean compiles of each are byte-identical. That
588+
261001 pair is what ships: on release day (261003) the on-die compile
589+
missed setup by 0.162 ns, as v2.9.3's did at 260929.
588590
**No hardware has run any bitstream.**
589591
- The iOS Swift and the mobile device behaviour are unverified on this Linux
590592
host, as before.

0 commit comments

Comments
 (0)