use crate::prelude::*;
use crate::fleet::config::GitModules;
use crate::fleet::error::Result;
use crate::fleet::git::{GitOps, SubmoduleOps, SubmoduleStatus};
use crate::fleet::output::Formatter;
use rayon::prelude::*;
pub fn execute<P: AsRef<Path> + Sync>(repo_root: P, _verbose: bool) -> Result<()> {
let gitmodules = GitModules::parse(&repo_root)?;
Formatter::print_info(&format!(
"Superproject + {} submodule(s)",
gitmodules.submodules.len()
));
let repo = GitOps::open_repo(&repo_root)?;
let is_detached = GitOps::is_detached_head(&repo)?;
let current_branch = if is_detached {
None
} else {
Some(GitOps::current_branch(&repo)?)
};
let is_clean = GitOps::is_clean(&repo)?;
let uncommitted_files = if !is_clean {
GitOps::get_uncommitted_files(&repo)?
} else {
Vec::new()
};
let (ahead, behind) = if !is_detached {
GitOps::get_ahead_behind(&repo).unwrap_or((0, 0))
} else {
(0, 0)
};
let super_status = SubmoduleStatus {
name: "[SUPERPROJECT]".to_string(),
path: ".".to_string(),
current_branch,
is_clean,
is_detached,
ahead,
behind,
uncommitted_files,
exists: true,
};
let mut statuses: Vec<_> = gitmodules
.submodules
.par_iter()
.map(|submodule| SubmoduleOps::get_status(&repo_root, submodule))
.collect::<Result<Vec<_>>>()?;
statuses.insert(0, super_status);
Formatter::print_status(&statuses);
Ok(())
}