repo-control 0.4.0

A helper for managing multiple git repositories
use tracing::info;

use crate::cli::show_status_table;
use crate::config::ConfigManager;
use crate::error::ProjectStatus;
use crate::git::check_project_status;

pub fn run(config: &ConfigManager) {
    let projects = match config.projects_config.as_ref() {
        Some(pc) => &pc.projects,
        None => {
            eprintln!("Projects config not loaded");
            return;
        }
    };

    let statuses: Vec<(String, _)> = projects
        .iter()
        .map(|p| {
            let dir = config.project_dir(p);
            let status = check_project_status(&dir);
            info!("Project '{}' status: {}", p.name, status);
            (p.name.clone(), status)
        })
        .collect();

    show_status_table(&statuses);

    let total = statuses.len();
    let cloned = statuses
        .iter()
        .filter(|(_, s)| !matches!(s, ProjectStatus::Unknown | ProjectStatus::Uninitialized))
        .count();
    let clean = statuses.iter().filter(|(_, s)| matches!(s, ProjectStatus::Clean)).count();

    if cloned == total && clean == total {
        println!("All {} projects cloned and clean.", total);
    } else {
        if cloned < total {
            println!("{}/{} projects cloned.", cloned, total);
        }
        if clean < total {
            println!("{}/{} projects clean.", clean, total);
        }
    }
}