repo-control 0.2.0

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

use crate::config::ConfigManager;
use crate::git;

pub fn run(config: &mut ConfigManager) {
    if !config.projects_config_exists() {
        println!("Project configuration file doesn't exist - creating");
        if let Err(e) = config.create_projects_config() {
            println!("Creating project configuration file failed: {}", e);
            return;
        }
    } else {
        println!("Project configuration file exists");
    }

    if !config.local_config_exists() {
        println!("Local configuration file doesn't exist - creating");
        if let Err(e) = config.create_local_config() {
            println!("Creating local configuration file failed: {}", e);
            return;
        }
    } else {
        println!("Local configuration file exists");
    }

    if let Err(e) = config.read_local_config() {
        println!("Reading local configuration failed: {}", e);
        return;
    }
    if let Err(e) = config.read_projects_config() {
        println!("Reading project configuration failed: {}", e);
        return;
    }

    let projects = config
        .projects_config
        .as_ref()
        .map(|pc| pc.projects.clone())
        .unwrap_or_default();

    for project in &projects {
        if project.is_root() {
            info!("Skipping root project: '{}'", project.name);
            continue;
        }

        let project_dir = config.project_dir(project);
        if project_dir.exists() {
            println!("Project '{}' already exists", project.name);
            continue;
        }

        let url = match config.get_git_url(project) {
            Ok(u) => u,
            Err(e) => {
                println!("Cloning '{}' failed. Configuration error: {}", project.name, e);
                return;
            }
        };

        info!("Cloning project '{}' from '{}'", project.name, url);
        if let Err(e) = git::clone(&url, &project.path, &config.project_root) {
            println!("Error cloning project '{}': {}", project.name, e);
            return;
        }
    }

    println!("Done");
}