Mark roadmap A1 (tests/CI) and A2 (subprocess hardening) done
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
46c6d162a0
commit
00fdbd50df
1 changed files with 13 additions and 18 deletions
31
ROADMAP.md
31
ROADMAP.md
|
|
@ -6,25 +6,20 @@ it exists. Checkboxes track status.
|
|||
|
||||
## Phase A — Safety net & correctness (do first)
|
||||
|
||||
- [ ] **A1. Automated test suite (pytest).** The project has no tests today;
|
||||
every change is hand-verified. Start with the pure logic that already
|
||||
isolates cleanly:
|
||||
- `plan_disc_split`, `_movie_chapter_seconds`, `_nearest_chapter_before`
|
||||
- `compute_high_profile_bitrate`
|
||||
- ffmpeg/avconv command generation (`convert_file` → `command_var`) with
|
||||
mock `file_project` objects, asserting flags for each profile,
|
||||
text/image hardsub, 2-pass, even pad/crop, AC3 448k.
|
||||
Add a `tests/` dir and a CI workflow (Codeberg Actions/Woodpecker). This
|
||||
would have caught the 448k→384k clamp bug automatically.
|
||||
- [x] **A1. Automated test suite (pytest).** DONE — `tests/` with 43 headless
|
||||
tests covering the split planner + chapter helpers,
|
||||
`compute_high_profile_bitrate`, ffmpeg command generation (profiles,
|
||||
text/image hardsub, 2-pass, even pad/crop, AC3 448k, progress-to-file,
|
||||
`-ss`), ffprobe subtitle detection, and executor I/O. CI in
|
||||
`.forgejo/workflows/tests.yml`. Caught/guards the 448k→384k clamp bug.
|
||||
|
||||
- [ ] **A2. Harden subprocess I/O (kills the deadlock class).** `executor`
|
||||
reads child stdout/stderr via blocking `GLib.IOChannel` watches; a stalled
|
||||
consumer can backpressure-deadlock the child (this bit us — ffmpeg froze
|
||||
on a full progress pipe when the GUI wedged). The progress-file fix only
|
||||
covers ffmpeg progress; dvdauthor/spumux/mkisofs stdout/stderr still use
|
||||
the fragile pattern. Build one hardened helper (non-blocking reads,
|
||||
drain-on-close, bounded buffers, never let a child block on a pipe we own)
|
||||
and route every backend through it.
|
||||
- [x] **A2. Harden subprocess I/O (kills the deadlock class).** DONE — the
|
||||
executor now drains child stdout/stderr with background reader threads
|
||||
into thread-safe buffers, consumed by a GLib timer on the main thread, so
|
||||
a stalled/wedged main loop can never backpressure-deadlock a child on a
|
||||
full pipe. stdout can go straight to a file, stdin is fed from a thread,
|
||||
the retained log is bounded, and `wait_end` runs once. Verified a 2MB-
|
||||
output child completes with the main loop never running.
|
||||
|
||||
- [ ] **A3. Surface real errors to the user.** Failures show a generic error
|
||||
window; the actual failing command + stderr is buried in the log. On
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue