use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorktreeCleanupConfig {
pub auto_cleanup: bool,
pub cleanup_delay_secs: u64,
pub max_worktrees_per_job: usize,
pub max_total_worktrees: usize,
pub disk_usage_threshold_mb: u64,
pub enable_monitoring: bool,
pub cleanup_timeout_secs: u64,
pub cleanup_workers: usize,
pub retry_failed_cleanup: bool,
pub max_cleanup_retries: u32,
}
impl Default for WorktreeCleanupConfig {
fn default() -> Self {
Self {
auto_cleanup: true,
cleanup_delay_secs: 30,
max_worktrees_per_job: 50,
max_total_worktrees: 200,
disk_usage_threshold_mb: 1024, enable_monitoring: true,
cleanup_timeout_secs: 30,
cleanup_workers: 4,
retry_failed_cleanup: true,
max_cleanup_retries: 3,
}
}
}
impl WorktreeCleanupConfig {
pub fn immediate() -> Self {
Self {
cleanup_delay_secs: 0,
..Default::default()
}
}
pub fn aggressive() -> Self {
Self {
auto_cleanup: true,
cleanup_delay_secs: 5,
max_worktrees_per_job: 20,
max_total_worktrees: 50,
disk_usage_threshold_mb: 512,
..Default::default()
}
}
pub fn conservative() -> Self {
Self {
auto_cleanup: true,
cleanup_delay_secs: 120,
max_worktrees_per_job: 100,
max_total_worktrees: 500,
disk_usage_threshold_mb: 5120, ..Default::default()
}
}
pub fn is_limit_exceeded(&self, active_worktrees: usize, job_worktrees: usize) -> bool {
active_worktrees >= self.max_total_worktrees || job_worktrees >= self.max_worktrees_per_job
}
}