Skip to main content

Mountain/IPC/WindServiceHandlers/Git/
HandleClone.rs

1#![allow(non_snake_case)]
2
3//! `localGit:clone(operationId, cloneUrl, targetPath, ref?)`.
4//! Optional `ref` becomes `--branch <ref>` so callers can
5//! shallow-clone a tag or branch.
6
7use serde_json::Value;
8
9use crate::IPC::WindServiceHandlers::Git::Shared::RunGit;
10
11pub async fn HandleClone(Arguments:Vec<Value>) -> Result<Value, String> {
12	let OperationId = Arguments.first().and_then(Value::as_str).unwrap_or("").to_string();
13
14	let CloneURL = Arguments.get(1).and_then(Value::as_str).unwrap_or("").to_string();
15
16	let TargetPath = Arguments.get(2).and_then(Value::as_str).unwrap_or("").to_string();
17
18	let Reference = Arguments.get(3).and_then(Value::as_str).map(str::to_string);
19
20	if CloneURL.is_empty() || TargetPath.is_empty() {
21		return Err("git:clone requires cloneUrl and targetPath".to_string());
22	}
23
24	let mut Argv:Vec<String> = vec!["clone".to_string()];
25
26	if let Some(Ref) = Reference {
27		Argv.push("--branch".to_string());
28
29		Argv.push(Ref);
30	}
31
32	Argv.push("--".to_string());
33
34	Argv.push(CloneURL);
35
36	Argv.push(TargetPath);
37
38	let (ExitCode, _, Stderr) = RunGit(&OperationId, &Argv, None).await?;
39
40	if ExitCode != 0 {
41		return Err(format!("git clone failed: {}", Stderr));
42	}
43
44	Ok(Value::Null)
45}