Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
c5d6dc5
fix(squashfs): release the backing handle before renaming over it (R-…
danifunker Aug 8, 2026
da30ef7
fix(zip): derive the disk-image extension list from the canonical one…
danifunker Aug 9, 2026
88e1339
fix(cli): let an error carry its exit code (R-004)
danifunker Aug 9, 2026
174eb4e
fix(new): give ProDOS a default volume name it can store (R-006)
danifunker Aug 9, 2026
9fe84e3
fix(cli): name the filesystem when refusing a write, and exit 4 (R-034)
danifunker Aug 9, 2026
04dd974
fix(show): detect the partition table before assuming APM (R-026)
danifunker Aug 9, 2026
62fc1eb
fix(inspect): accept --fs-type, and honour it (R-010)
danifunker Aug 9, 2026
a39a452
docs: an upstream prompt for the two opticaldiscs cue defects
danifunker Aug 9, 2026
e0977ea
feat(optical): extract a single file or folder, and archive to tar
danifunker Aug 9, 2026
3eb6f8a
feat(optical): --filesystem-index, and cases for the extract surface
danifunker Aug 9, 2026
1b2340f
docs: close F-001 and F-004, register the three that are left
danifunker Aug 9, 2026
7377255
docs: resume prompt for the next regression-fix session
danifunker Aug 9, 2026
9ce701b
fix(cli): error envelope under --format json, and ls --format (R-005,…
danifunker Aug 9, 2026
267e565
docs(regress): R-016 is a feature gap, not a defect — becomes F-008
danifunker Aug 10, 2026
fdfe306
docs: close R-001 and R-002, and add the parity test that guards the …
danifunker Aug 10, 2026
4546109
fix(resize): grow the container, or refuse — never both (R-021)
danifunker Aug 10, 2026
855c945
fix(repack): refuse a volume that is not Human68k (R-023)
danifunker Aug 10, 2026
8afbac9
fix(backup): normalise source_device to a leaf (R-035)
danifunker Aug 10, 2026
c6e66fd
fix(partition): detect a bare HPFS volume (R-022)
danifunker Aug 10, 2026
89b5575
docs: resume prompt and tranches for the next regression-fix session
danifunker Aug 10, 2026
4fd826b
fix(resize): shrink safely, and never over live data (R-037)
danifunker Aug 10, 2026
a3162e4
test(regress): admit the OS/2 Warp 4.52 HPFS fixture
danifunker Aug 10, 2026
93a6d53
fix: two CI breaks the local suite cannot see
danifunker Aug 10, 2026
620fe51
docs(regress): how the corpus reaches hosts that cannot see the share
danifunker Aug 10, 2026
4e4bf5e
test(regress): make three markdown claims executable instead
danifunker Aug 10, 2026
c214a7d
fix(cli): one missing-image guard for every verb (R-036)
danifunker Aug 10, 2026
528223a
fix(partition): let a QL Microdrive cartridge reach its own driver (R…
danifunker Aug 10, 2026
23874a0
fix(regress): consolidate reports the current state, not all of history
danifunker Aug 10, 2026
a0ae701
fix(optical,g64): bump opticaldiscs to 0.15; G64 refuses writes properly
danifunker Aug 10, 2026
a190182
fix(affs): size the bitmap, find the root block, zero header_key
danifunker Aug 10, 2026
0af2b79
fix(apple-dos): store the byte length; close R-028 and R-031
danifunker Aug 10, 2026
56fac01
fix(ufs): apply UFS1's rotational cylinder-group offset (R-013)
danifunker Aug 10, 2026
7c716ad
fix(efs,sfs): truncation warning, and refuse an SFS write honestly
danifunker Aug 10, 2026
ce16151
docs(regress): strike the R-015 and R-031 summary rows
danifunker Aug 10, 2026
01b2ebd
docs(regress): R-029's fixture is a deliberate prefix, not a broken one
danifunker Aug 10, 2026
1baa137
feat(inspect): --expect-fs and --require-known, and an `identified` f…
danifunker Aug 11, 2026
b9606dc
feat(inspect): --expect-layout, for asserting the disk's shape
danifunker Aug 11, 2026
0db7dbf
refactor(inspect): drop --require-known; expect-fs already covers it
danifunker Aug 11, 2026
e63faff
test(regress): fixtures --identify, so a fixture must prove what it is
danifunker Aug 11, 2026
7b1e3fd
feat(regress): oracles --detect / --export, and get machine paths out…
danifunker Aug 12, 2026
6556a8b
feat(regress): find emulators, or ask where they are
danifunker Aug 12, 2026
7065d99
feat(regress): oracles --scan, to inventory a MiSTer over ssh
danifunker Aug 12, 2026
5646bef
feat(regress): a WinUAE oracle, and look in ~/emulators
danifunker Aug 12, 2026
52748e6
feat(regress): an amitools oracle — and it rejects every AFFS volume …
danifunker Aug 12, 2026
2c0da94
docs(regress): iris runs IRIX; the file channel is the blocker
danifunker Aug 12, 2026
5e11a93
feat(regress): IRIX itself checks our EFS — and rejects it (R-039)
danifunker Aug 14, 2026
a436be9
fix(efs): stamp real timestamps on new inodes + mkfs root (no more 1969)
danifunker Aug 14, 2026
b19256c
feat(fs): preserve source mtime across copy/import/extract (all Unix …
danifunker Aug 14, 2026
77dfc06
feat(fs/times): format-specific date encoders for every driver
danifunker Aug 14, 2026
e366bae
feat(fs): FAT / exFAT / Human68k honour source mtime on import
danifunker Aug 14, 2026
eb5f725
feat(fs/ntfs): honour source mtime on import + read modified_unix
danifunker Aug 14, 2026
78c7bb5
feat(fs): HFS / HFS+ / MFS honour source mtime on import
danifunker Aug 14, 2026
e992e9e
feat(fs): ProDOS / HPFS / UCSD / OS-9 / QDOS / ADFS honour source mtime
danifunker Aug 14, 2026
3c5ccb8
feat(fs): Amiga family bridges unix_times; cross-fs regression tests
danifunker Aug 14, 2026
6e9ab9c
fix(regress): R-038 was a stale artifact, and the runner now says so
danifunker Aug 15, 2026
2708cd1
feat(regress): an FS-UAE mount oracle for R-020 — built, not yet answ…
danifunker Aug 15, 2026
0a23851
fix(regress): R-020 answered — Kickstart 3.1 mounts our AFFS volumes
danifunker Aug 15, 2026
d9dd766
docs(regress): close out R-038 and R-020, with the commands to re-che…
danifunker Aug 15, 2026
f9be5e0
docs(regress): sweep the four docs that still called R-020 blocked
danifunker Aug 15, 2026
fdfa77a
fix(efs): the free-space bitmap is LSB-first — R-039
danifunker Aug 15, 2026
bf06816
fix(regress): a stray CR broke the oracle registry
danifunker Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,29 @@ That feature list is exactly what CI's Windows vintage leg builds (`.github/work

The definitive check is an actual `rustup toolchain install 1.73.0` build of that manifest; the command above is the cheap proxy that catches the wiring mistakes (wrong shim path, raw `io::Error::other` left in, unused imports).

### The pipeline builds more than your machine does

A green `cargo test` and a green `rb-regress run` are not a green pipeline.
Run this before pushing:

```bash
scripts/preflight.sh
```

It runs what CI runs: `cargo test --release` (CI's test step is release, not
debug), the MiSTer feature set (`optical` on, `native-zstd` off — anything
touching zstd must go through `crate::rbformats::zstd_compat`, never the `zstd`
crate directly), the Rust 1.73 vintage floor, and the doc-parity tests.

**After pushing, read the job list, not the run conclusion.** Several jobs are
`continue-on-error: true` — the MiSTer `rb-cli-mini` build among them — so they
can fail while `gh run list` still reports the run as `success`. That hid a
compile error for a day.

```bash
gh run view <run-id>
```

### mrustc mis-lowers `leading_zeros` / `leading_ones` on narrow integers

The PowerPC build (`rb-cli-ppc`, via mrustc's C backend — see `scripts/build-ppc.sh`)
Expand Down
70 changes: 3 additions & 67 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ webbrowser = { version = "1.0", optional = true }
# 0.13.0 — `physical` / `open_physical`: reading a disc from the drive as flat
# cooked sectors, which is what makes DVD and Blu-ray work at all
# (the CD-only MMC ioctls fail on that media with ENOTTY).
opticaldiscs = { version = "0.13.0", features = ["drives"], optional = true }
opticaldiscs = { version = "0.15.0", features = ["drives"], optional = true }
cd-da-reader = { git = "https://github.com/danifunker/rust-cd-da-reader", branch = "file-backend-on-1.0", optional = true }
# In-app CD-DA playback (Optical tab). Pinned <0.20 for the
# OutputStream::try_default / Sink::try_new API used in gui/optical_audio.rs.
Expand Down Expand Up @@ -251,6 +251,10 @@ flate2 = { version = "1", default-features = false, features = ["rust_backend"]
# produces the standard LZ4 frame, interoperable with the DOS tool's liblz4.
lz4_flex = "0.13"
tar = "0.4"
# Set an extracted file's mtime/atime after we write it (the plain host-fs
# export path). Already a transitive dep via `tar` in every lockfile — this
# just promotes it so we can call `set_file_mtime` directly.
filetime = "0.2"
bzip2 = "0.6"
zip = { version = "8", default-features = false, features = ["deflate", "aes-crypto"] }
base64 = "0.22"
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -685,7 +685,9 @@ PC Engine CD, CD32, GameCube, Wii, CD-i, and 3DO.
| SGI | Yes | Yes | SGI Volume Header (IRIX). 16 fixed slots; checksum recomputed on every write; geometry (`vh_dp`) preserved across edits. `rb-cli new hd sgi-efs` synthesizes a dvh + EFS-root hard disk from scratch (IRIX 5.3-6.5). |
| AHDI | Yes | No (browse); writes whole tables from scratch | Atari ST / TT / Falcon hard disks. Four primary entries at 0x1C6 plus XGM extended chains, big-endian, no magic number — detection keys off the 0x1234 word-sum and plausible geometry. `rb-cli new hd atari` writes a fresh root sector with the tags you name (GEM / BGM / RAW); a GEM partition over 16 MiB is promoted to BGM, which is what TOS needs. Creating an XGM chain, and grafting in a bootable bootstrap, are future work. |
| Sun | Yes | No (browse); writes whole labels from scratch | Sun disk label / SMI VTOC (SPARC Solaris / SunOS). 8 big-endian slices (magic `0xDABE`), geometry-derived offsets; the whole-disk "backup" slice is excluded from the list. Surfaces the UFS slices to the existing big-endian-SPARC UFS reader (browse / inspect / extract). `rb-cli new hd sun` writes a fresh label with the slice tags you name (`root`, `usr`, `swap`, … or a bare tag number), cylinder-aligned from `--heads` / `--sectors`, with slice 2 reserved for the whole-disk alias. Parser and writer both cross-validated against `fdisk` / `sfdisk`; editing an existing label and full-disk backup are future work. |
| None (superfloppy) | Yes — auto-detects the filesystem at sector 0 (FAT / NTFS / exFAT / ext / XFS / JFS / UFS / ReiserFS / btrfs / SquashFS / HFS / HFS+ / APFS / Amiga SFS / Apple DOS 3.3 / CBM DOS / Atari DOS / RS-DOS / OS-9 RBF / DragonDOS / Acorn DFS / ADFS / TR-DOS / TI-99 / QDOS / Human68k / Alto BFS / Pilot/Cedar / Apple Lisa FS / …) | — | Standard floppy / disk sizes are recognised even without a partition table. Xerox Alto packs (`.pdi` / `.bfs` / CopyDisk / Salto `.dsk`), Pilot/Cedar PDIs (`fsFamily=2`), Dwarf 6085 `.zdisk` images, and tag-bearing Apple Lisa DiskCopy 4.2 / DART disks are detected by content and presented as a single browsable volume. |
| X68k | Yes | No (browse); writes whole tables from scratch | Sharp X68000 SASI/SCSI hard disks — Human68k's native scheme. 16-byte header plus 8 entries at byte 2048, big-endian, no magic number. Both geometries are auto-detected: SCSI (`X68SCSI1`, table at 0x800, 1024-byte sectors) and SASI (table at 0x400, 256-byte sectors), including custom-IPL game disks. `rb-cli new hd x68k` synthesizes a bootable disk with the Sharp IPL signature and a Human68k FAT volume. |
| DSD | Yes | — (fixed floppy geometry) | Double-sided Acorn DFS (`.dsd`). Not a table on the disk: the two sides are stored track-interleaved, so the reader de-interleaves them and this scheme presents them as **two** Acorn DFS partitions — side 0 at byte 0, side 1 at half the image. Edits to either side re-interleave on save. |
| None (superfloppy) | Yes — auto-detects the filesystem at sector 0 (FAT / NTFS / exFAT / HPFS / ext / XFS / JFS / UFS / ReiserFS / btrfs / SquashFS / HFS / HFS+ / APFS / Amiga SFS / Apple DOS 3.3 / CBM DOS / Atari DOS / RS-DOS / OS-9 RBF / DragonDOS / Acorn DFS / ADFS / TR-DOS / TI-99 / QDOS / Human68k / Alto BFS / Pilot/Cedar / Apple Lisa FS / …) | — | Standard floppy / disk sizes are recognised even without a partition table. Xerox Alto packs (`.pdi` / `.bfs` / CopyDisk / Salto `.dsk`), Pilot/Cedar PDIs (`fsFamily=2`), Dwarf 6085 `.zdisk` images, and tag-bearing Apple Lisa DiskCopy 4.2 / DART disks are detected by content and presented as a single browsable volume. |

The Clonezilla image format is also parsed as a source (MBR, GPT, partclone
images, partition table sidecars) for restore — see `docs/clonezilla.md`.
Expand Down
Loading