use std::path::{Path, PathBuf};
use std::process::Command;
use walkdir::WalkDir;
pub fn find_repos(base: &Path, max_depth: usize) -> Vec<PathBuf> {
WalkDir::new(base)
.max_depth(max_depth)
.follow_links(false)
.into_iter()
.filter_map(|entry| entry.ok()) .filter(|entry| entry.file_name() == ".git" && entry.file_type().is_dir())
.filter_map(|entry| entry.path().parent().map(Path::to_path_buf)) .collect()
}
pub fn display_name(repo: &Path) -> String {
repo.canonicalize()
.ok()
.and_then(|p| p.file_name().map(|n| n.to_string_lossy().into_owned()))
.unwrap_or_else(|| repo.to_string_lossy().into_owned())
}
pub fn git_capture(repo: &str, args: &[&str]) -> Option<String> {
let output = Command::new("git").arg("-C").arg(repo).args(args).output().ok()?;
if !output.status.success() {
return None;
}
Some(String::from_utf8_lossy(&output.stdout).trim().to_string())
}
pub fn git_run(repo: &str, args: &[&str]) -> (bool, String) {
match Command::new("git").arg("-C").arg(repo).args(args).output() {
Ok(output) => {
let mut combined = String::from_utf8_lossy(&output.stdout).into_owned();
combined.push_str(&String::from_utf8_lossy(&output.stderr));
(output.status.success(), combined.trim().to_string())
}
Err(e) => (false, e.to_string()),
}
}