Skip to main content

Mountain/IPC/WindServiceHandlers/Git/
HandleClone.rs

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