use std::path::{Path, PathBuf};
use crate::backup;
use crate::config::Config;
use crate::error::Result;
use crate::project::ProjectLayout;
use crate::store::default_user_backup_dir;
pub fn run(project: &Path, out: Option<&Path>) -> Result<()> {
let layout = ProjectLayout::new(project);
layout.require_initialized()?;
let _cfg = Config::load(&layout.config_path())?;
let abs_project = std::fs::canonicalize(&layout.root).map_err(crate::error::Error::Io)?;
let abs_out = match out {
Some(p) if p.is_absolute() => p.to_path_buf(),
Some(p) => std::env::current_dir()
.map_err(crate::error::Error::Io)?
.join(p),
None => default_user_backup_dir(&abs_project),
};
let skip = skip_dirs_for(&abs_project, &abs_out);
let archive = backup::create_backup(&abs_project, &abs_out, &skip, None)?;
eprintln!("wrote backup: {}", archive.display());
Ok(())
}
pub fn skip_dirs_for(abs_project: &Path, abs_out: &Path) -> Vec<PathBuf> {
let mut skip: Vec<PathBuf> = Vec::new();
if let Ok(rel) = abs_out.strip_prefix(abs_project) {
if !rel.as_os_str().is_empty() {
skip.push(rel.to_path_buf());
}
}
skip.push(abs_out.to_path_buf());
skip
}