zoi-cli 1.24.2

Advanced Package Manager & Environment Orchestrator
Documentation
use crate::pkg::{resolve, types};
use anyhow::{Result, anyhow};
use colored::*;
use std::process::Command;

pub fn run(package_name: &str, location: Option<String>, yes: bool) -> Result<()> {
    println!(
        "{} Resolving package '{}' for cloning...",
        "::".bold().blue(),
        package_name.cyan().bold()
    );

    let resolved_source = resolve::resolve_source(package_name, None, false, yes)?;

    let pkg: types::Package = crate::pkg::lua::parser::parse_lua_package(
        resolved_source.path.to_str().ok_or_else(|| {
            anyhow!(
                "Path contains invalid UTF-8 characters: {:?}",
                resolved_source.path
            )
        })?,
        None,
        None,
        false,
    )?;

    if pkg.git.is_empty() {
        return Err(anyhow!(
            "Package '{}' does not have a git repository defined in its metadata.",
            pkg.name
        ));
    }

    let git_url = &pkg.git;
    let target_location = location.unwrap_or_else(|| pkg.name.clone());

    println!(
        "{} Cloning {} into {}...",
        "::".bold().blue(),
        git_url.cyan(),
        if target_location == "." {
            "current directory".bold()
        } else {
            target_location.bold()
        }
    );

    let mut git_cmd = Command::new("git");
    git_cmd.arg("clone").arg(git_url).arg(&target_location);

    let status = git_cmd
        .status()
        .map_err(|e| anyhow!("Failed to execute git clone: {}", e))?;

    if status.success() {
        println!("\n{}", "Successfully cloned repository.".green());
    } else {
        return Err(anyhow!(
            "git clone failed with exit code {:?}",
            status.code()
        ));
    }

    Ok(())
}