feat(prune): R2 dry-run prune shell + persist wiring, report-only
Add ReaSamplerSession::pruneDryRun enumerating the resolved current bank folder, feeding the R1 core, and returning a PruneReport (count/bytes/list). New pure bankRelativeForName + buildPruneReport keep spelling and tally testable. Register forever-stable BANK_PRUNE_FOLDER action, report-only. No deletion.
This commit is contained in:
@@ -41,11 +41,36 @@
|
||||
// match here (e.g. case-insensitive compare) would be the unsafe direction — it could
|
||||
// let one spelling of a referenced file be treated as an orphan under another.
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace reasampler {
|
||||
|
||||
// The dry-run prune result (Phase R, Wave 2 — report only, no deletion). The thin
|
||||
// prune shell (persist) fills this from pruneOrphans() + a per-file size stat and hands
|
||||
// it to the report surface; R3 will act on the SAME set behind the confirm guardrail.
|
||||
// REAPER-free / filesystem-free by design (the shell does the I/O; this is just the
|
||||
// tallied outcome), so the count/size aggregation is unit-testable outside the DAW.
|
||||
//
|
||||
// * count — number of orphan files (== orphans.size(); the AUTHORITATIVE tally,
|
||||
// exact even when `orphans` below is a truncated display list).
|
||||
// * totalBytes — sum of the on-disk sizes of the orphan files, in bytes (reclaimable
|
||||
// space). A file the stat could not size contributes 0 (never negative).
|
||||
// * orphans — the orphan file list as project-relative index-spelled paths, in
|
||||
// folder-enumeration order (deterministic). MAY be truncated for a large
|
||||
// set (the shell's display cap); `count` stays exact regardless, and
|
||||
// `truncated` says whether the list was clipped.
|
||||
// * truncated — true iff `orphans` holds fewer than `count` entries (a large set was
|
||||
// clipped for display); false when the list is complete.
|
||||
struct PruneReport {
|
||||
std::size_t count = 0;
|
||||
std::uint64_t totalBytes = 0;
|
||||
std::vector<std::string> orphans;
|
||||
bool truncated = false;
|
||||
};
|
||||
|
||||
// Computes the prune orphan set: (owned ∩ present) − referenced.
|
||||
//
|
||||
// Returns the subset of `present` that is BOTH owned AND unreferenced, in the ORDER
|
||||
@@ -60,4 +85,24 @@ std::vector<std::string> pruneOrphans(const std::vector<std::string>& present,
|
||||
const std::vector<std::string>& referenced,
|
||||
const std::vector<std::string>& owned);
|
||||
|
||||
// Tallies a dry-run PruneReport from a computed orphan set and a per-path size lookup.
|
||||
// PURE (no I/O): the shell does the folder stat and passes the sizes in `sizeByPath`;
|
||||
// this owns the count / byte-sum / display-truncation decision so it is unit-testable.
|
||||
//
|
||||
// * count == orphans.size() (the authoritative tally, exact regardless of the cap).
|
||||
// * totalBytes == the sum of sizeByPath[o] over EVERY orphan o (not just the displayed
|
||||
// ones); a path missing from sizeByPath contributes 0 (an orphan whose
|
||||
// size could not be stat'd — never negative, never dropped from the sum).
|
||||
// * orphans == the first `displayCap` orphans in input order (the deterministic
|
||||
// folder-enumeration order pruneOrphans preserved); the whole set when
|
||||
// count <= displayCap. displayCap == 0 means "no display cap" (whole set).
|
||||
// * truncated == count > orphans.size() (a large set was clipped for display).
|
||||
//
|
||||
// Kept separate from pruneOrphans so the safety-critical set algebra stays a pure function
|
||||
// of three sets, while the presentation tally (which the R2 dry-run and R3 confirm both
|
||||
// need) is its own small, testable step.
|
||||
PruneReport buildPruneReport(const std::vector<std::string>& orphans,
|
||||
const std::unordered_map<std::string, std::uint64_t>& sizeByPath,
|
||||
std::size_t displayCap);
|
||||
|
||||
} // namespace reasampler
|
||||
|
||||
Reference in New Issue
Block a user