Files
Sylpheed/crates/sylpheed-export/examples/probe_archives.rs
Sylpheed port agent e57eda14e4 recover: the OPTIONS menu work from the deleted auto/port-p6-audio
The nine files touched by the OPTIONS commits of 2026-09-03 (77f1d18,
fda417a, 3efe1cc, 80042cb, 4c24e06, a921c1e, 41f1331, 6b4b1df, edf8979),
taken as of 0148cb8, the tip of auto/port-p6-audio. The branch was deleted
from the server on 2026-09-17 during the consolidation cleanup; issue #6
asks for this work as a reviewable PR, so it is recovered here before the
commits are garbage collected.

This is a review slice, not a self-consistent tree: the OPTIONS work and
the F5/F6 work interleaved in the original history and cannot be separated
by file, so each file carries whatever else had changed in it by
2026-09-04, and files it depends on are absent. The complete state is
recover/port-f5-f6.

Refs #6.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 20:48:48 +02:00

43 lines
1.7 KiB
Rust

//! Which disc archives contain UI screen builds?
//!
//! The exporter reads `dat/GP_TITLE.pak` and nothing else, so four of the five
//! main-menu destinations have no screen file to go to: `authored/flow.json`
//! records LOAD GAME as `GP_SAVE_LOAD`, OPTIONS as `GP_OPTIONS`, and NEW GAME's
//! chain as `DLG_SELECT_DIFFICULTY` -> `SELECT DATA`, all measured destinations
//! that this export cannot reach.
//!
//! This asks the cheap question before anyone refactors the exporter: does the
//! EXISTING build detector find anything in those archives? It changes nothing
//! and writes nothing.
//!
//! cargo run --release -p sylpheed-export --example probe_archives
use sylpheed_formats::{pak::PakArchive, ui_layout};
fn main() -> anyhow::Result<()> {
let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
let mut names: Vec<String> = std::fs::read_dir(format!("{disc}/dat"))?
.filter_map(|e| e.ok())
.map(|e| e.file_name().to_string_lossy().into_owned())
.filter(|n| n.ends_with(".pak"))
.collect();
names.sort();
println!("{:<32} {:>7} {:>8}", "archive", "entries", "builds");
for n in names {
let path = format!("{disc}/dat/{n}");
let Ok(ar) = PakArchive::open(&path) else {
println!("{n:<32} {:>7} {:>8}", "-", "open failed");
continue;
};
let total = ar.entries().len();
let builds = ar
.entries()
.iter()
.filter(|e| ar.read(e).map(|b| ui_layout::is_build(&b)).unwrap_or(false))
.count();
if builds > 0 || n.contains("OPTIONS") || n.contains("SAVE") || n.contains("DIALOG") {
println!("{n:<32} {total:>7} {builds:>8}");
}
}
Ok(())
}