Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ Found by adding CI on Linux and macOS — the suite had only ever run on Windows
file would have reported 34 million "frames" and a duration to match. The
video track is now chosen by handler type. Found by running the parser over
510 real clips, 2.84 TB, from two camera bodies.
- **Linux cards never reached the drive panel.** Cards mount at
`/media/<user>/<LABEL>` or `/run/media/<user>/<LABEL>`, one level below
where the scan looked. It listed the empty `/media/<user>` directory and
another user's unreadable mount as fake removable drives instead. Volumes
now come from `/proc/self/mountinfo`, which names real mount points and
gives the filesystem type, so pseudo and system filesystems are filtered
by type while NFS and SMB shares stay listed as network volumes, outside
card detection. An overlay root (containers, live sessions) is still
treated as the system volume. Without `/proc` the old directory scan is
the fallback.

### Changed

Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pip install -e ".[dev]"
`ffmpeg` and `ffprobe` on `PATH` are optional — the suite runs without them.

```sh
pytest # ~400 tests, about 33s
pytest # ~416 tests, about 33s
pytest --fuzz # property tests at 3000 examples each, about 2 min
ruff check src tests
pytest --cov=offloader --cov-report=term-missing
Expand All @@ -62,6 +62,7 @@ suite fakes all of it:
| A failing destination | `tests/test_data_safety.py` returns handles that raise on write |
| Corruption | flip a byte and re-verify; size stays identical, checksum does not |
| An interrupted recording | write a BRAW with `include_moov=False` |
| A Linux card mount | the `linux_mounts` fixture in `tests/test_volumes.py` writes a fake `mountinfo` and points the scanner at it |
| A deep Windows path | build until `len(str(path)) > 260` — do not hard-code, the temp root's length varies |

If you have real hardware, there are tests that use it and skip cleanly when it
Expand Down
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,11 @@ Volumes that look like camera media are badged `CARD` and sorted to the top —
detected by the marker directories cameras write (`DCIM`, `PRIVATE`, `XDROOT`
and friends) or by a root full of camera originals, since a Blackmagic card
writes clips straight to the root and a reader in a dock reports as a fixed
disk.
disk. On Linux the panel reads the kernel's mount table, so a card mounted under
`/media/<user>/` or `/run/media/<user>/` appears with its filesystem type.
Pseudo and system mounts stay out of the list; NFS and SMB shares are kept
and classified as network volumes, so they can be chosen as destinations,
but they are never offered as cards.

Along the bottom is the **queue**. Jobs run one at a time — offloads are I/O
bound, and running two at once against the same bus makes both slower and the
Expand Down Expand Up @@ -356,17 +360,17 @@ what makes the report layer testable without moving bytes.

```sh
pip install -e ".[dev]"
pytest # 409 tests, ~33s
pytest # 416 tests, ~33s
pytest --fuzz # same suite, 3000 examples per property (~2 min)
ruff check src tests
pytest --cov=offloader --cov-report=term-missing
```

409 tests at 82% line coverage. They cover formatting against the reference's
416 tests at 81% line coverage. They cover formatting against the reference's
exact strings, checksum vectors and streaming equivalence, copy/verify
behaviour including simulated destination corruption, pause/resume/cancel
concurrency, retry discrimination, BRAW container parsing, ffprobe parsing,
preset and history persistence, card detection, PDF geometry read back with
preset and history persistence, card and mount-table detection, PDF geometry read back with
PyMuPDF, the CLI, and the GUI.

The GUI tests run on Qt's offscreen platform and drive the real queue
Expand Down