use super::{Agent, GitTree, GitTreeError, REPO_DIR, cmd, enumerate};
use std::path::Path;
pub struct ProbeStack {
#[cfg(not(target_os = "macos"))]
lock: super::lock_probe::ProcFsLockProbe,
#[cfg(not(target_os = "macos"))]
writer: super::fd_probe::ProcFsProbe,
#[cfg(target_os = "macos")]
probe: super::probe_cache::TtlCache<
super::lsof::LsofProbe<super::lsof::SystemLsof>,
crate::ui_state::SystemClock,
>,
}
impl ProbeStack {
#[cfg(not(target_os = "macos"))]
pub fn platform() -> Self {
Self {
lock: super::lock_probe::ProcFsLockProbe::default(),
writer: super::fd_probe::ProcFsProbe::default(),
}
}
#[cfg(target_os = "macos")]
pub fn platform() -> Self {
Self {
probe: super::lsof::system_probe(),
}
}
pub fn derive(&self, workspace: &Path) -> Result<GitTree, GitTreeError> {
let git_dir = workspace.join(REPO_DIR);
let log = cmd::git_log_first_parent(&git_dir)?;
let commits = log.into_iter().map(enumerate::build_node).collect();
let agents = self.enumerate(workspace, &git_dir)?;
Ok(GitTree { commits, agents })
}
#[cfg(not(target_os = "macos"))]
fn enumerate(&self, workspace: &Path, git_dir: &Path) -> Result<Vec<Agent>, GitTreeError> {
enumerate::enumerate_agents(workspace, git_dir, &self.lock, &self.writer)
}
#[cfg(target_os = "macos")]
fn enumerate(&self, workspace: &Path, git_dir: &Path) -> Result<Vec<Agent>, GitTreeError> {
enumerate::enumerate_agents(workspace, git_dir, &self.probe, &self.probe)
}
#[cfg(target_os = "macos")]
pub fn invalidate_liveness(&self, workspace: &Path, agent_ids: &[String]) {
for id in agent_ids {
self.probe
.invalidate(&workspace.join(super::INBOX_DIR).join(id));
}
}
#[cfg(not(target_os = "macos"))]
pub fn invalidate_liveness(&self, _workspace: &Path, _agent_ids: &[String]) {}
}