use tracing::info;
use crate::commands::{shorten_path, MessageResult};
use crate::packs::orchestration::ExecutionContext;
use crate::Result;
pub fn reset(ctx: &ExecutionContext) -> Result<MessageResult> {
let data_dir = ctx.paths.data_dir().to_path_buf();
let display_dir = shorten_path(&data_dir, ctx.paths.home_dir());
info!(data_dir = %data_dir.display(), dry_run = ctx.dry_run, "starting reset command");
let entries = if ctx.fs.is_dir(&data_dir) {
ctx.fs.read_dir(&data_dir)?
} else {
Vec::new()
};
if entries.is_empty() {
return Ok(MessageResult {
message: format!("Nothing to reset — no dodot state under {display_dir}."),
details: Vec::new(),
});
}
let mut details = Vec::new();
for entry in &entries {
let label = if entry.is_dir {
format!("{}/", entry.name)
} else {
entry.name.clone()
};
if ctx.dry_run {
details.push(format!("would remove {label}"));
} else {
info!(entry = %entry.path.display(), "removing");
if entry.is_dir {
ctx.fs.remove_dir_all(&entry.path)?;
} else {
ctx.fs.remove_file(&entry.path)?;
}
details.push(format!("removed {label}"));
}
}
let message = if ctx.dry_run {
format!("Would reset all dodot state under {display_dir}.")
} else {
format!("All dodot state under {display_dir} removed. Run `dodot up` to redeploy.")
};
Ok(MessageResult { message, details })
}