use std::path::{Path, PathBuf};
use super::fold::LedgerState;
use super::{EventKind, LedgerError, LedgerEvent, Origin, WorktreeLedger, ledger_key};
#[derive(Debug, Clone)]
pub struct CreationIntent<'a> {
pub repo: &'a Path,
pub branch: Option<String>,
pub origin: Origin,
pub session: Option<String>,
}
#[derive(Debug, thiserror::Error)]
pub enum RecordedCreateError {
#[error("worktree not recorded, creation refused: {0}")]
Ledger(#[from] LedgerError),
#[error("{0}")]
Create(String),
}
pub fn create_recorded(
ledger: &WorktreeLedger,
intent: CreationIntent<'_>,
create: impl FnOnce() -> Result<PathBuf, String>,
) -> Result<PathBuf, RecordedCreateError> {
let mut appender = ledger.open_appender()?;
let path = create().map_err(RecordedCreateError::Create)?;
appender.append(&LedgerEvent::now(
ledger_key(&path),
EventKind::Created {
repo: ledger_key(intent.repo),
branch: intent.branch,
origin: intent.origin,
session: intent.session,
},
))?;
Ok(path)
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct MeasureReport {
pub measured: usize,
pub missing: usize,
}
pub fn measure_live(
ledger: &WorktreeLedger,
state: &LedgerState,
) -> Result<MeasureReport, LedgerError> {
let mut report = MeasureReport::default();
if state.live.is_empty() {
return Ok(report);
}
let mut appender = ledger.open_appender()?;
for path in state.live.keys() {
if !path.is_dir() {
report.missing += 1;
continue;
}
let bytes = trusty_common::sys_metrics::dir_allocated_bytes(path);
appender.append(&LedgerEvent::now(
path.clone(),
EventKind::Measured { bytes },
))?;
report.measured += 1;
}
Ok(report)
}