Skip to main content

zoi_cli/cmd/
clone.rs

1use crate::pkg::{resolve, types};
2use anyhow::{Result, anyhow};
3use colored::*;
4use std::process::Command;
5
6pub fn run(package_name: &str, location: Option<String>, yes: bool) -> Result<()> {
7    println!(
8        "{} Resolving package '{}' for cloning...",
9        "::".bold().blue(),
10        package_name.cyan().bold()
11    );
12
13    let resolved_source = resolve::resolve_source(package_name, None, false, yes)?;
14
15    let pkg: types::Package = crate::pkg::lua::parser::parse_lua_package(
16        resolved_source.path.to_str().ok_or_else(|| {
17            anyhow!(
18                "Path contains invalid UTF-8 characters: {:?}",
19                resolved_source.path
20            )
21        })?,
22        None,
23        None,
24        false,
25    )?;
26
27    if pkg.git.is_empty() {
28        return Err(anyhow!(
29            "Package '{}' does not have a git repository defined in its metadata.",
30            pkg.name
31        ));
32    }
33
34    let git_url = &pkg.git;
35    let target_location = location.unwrap_or_else(|| pkg.name.clone());
36
37    println!(
38        "{} Cloning {} into {}...",
39        "::".bold().blue(),
40        git_url.cyan(),
41        if target_location == "." {
42            "current directory".bold()
43        } else {
44            target_location.bold()
45        }
46    );
47
48    let mut git_cmd = Command::new("git");
49    git_cmd.arg("clone").arg(git_url).arg(&target_location);
50
51    let status = git_cmd
52        .status()
53        .map_err(|e| anyhow!("Failed to execute git clone: {}", e))?;
54
55    if status.success() {
56        println!("\n{}", "Successfully cloned repository.".green());
57    } else {
58        return Err(anyhow!(
59            "git clone failed with exit code {:?}",
60            status.code()
61        ));
62    }
63
64    Ok(())
65}