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}