Skip to main content

Mountain/IPC/WindServiceHandlers/Git/
HandleExec.rs

1
2//! `localGit:exec` - arbitrary `git` argv. Used by the Git
3//! extension for commands not on the curated `clone/pull/…`
4//! list. Accepts both the modern `{ Arguments, cwd?,
5//! operationId? }` shape and the legacy positional
6//! `(argv: string[], cwd?: string)`.
7
8use serde_json::{Value, json};
9
10use crate::IPC::WindServiceHandlers::Git::Shared::{
11	AsStringArray::Fn as AsStringArray,
12	Generated::Fn as Generated,
13	RunGit::Fn as RunGit,
14};
15
16pub async fn Fn(Arguments:Vec<Value>) -> Result<Value, String> {
17	let (Argv, Cwd, OperationId) = match Arguments.first() {
18		Some(First) if First.is_object() => {
19			let Obj = First.as_object().unwrap();
20
21			let Argv = Obj.get("Arguments").map(AsStringArray).unwrap_or_default();
22
23			let Cwd = Obj.get("cwd").and_then(Value::as_str).unwrap_or("").to_string();
24
25			let OperationId = Obj.get("operationId").and_then(Value::as_str).unwrap_or("").to_string();
26
27			(Argv, Cwd, OperationId)
28		},
29
30		Some(First) if First.is_array() => {
31			let Argv = AsStringArray(First);
32
33			let Cwd = Arguments.get(1).and_then(Value::as_str).unwrap_or("").to_string();
34
35			(Argv, Cwd, String::new())
36		},
37
38		_ => (Vec::new(), String::new(), String::new()),
39	};
40
41	if Argv.is_empty() {
42		return Err("git:exec requires non-empty Arguments".to_string());
43	}
44
45	let OperationIdRef = if OperationId.is_empty() { Generated() } else { OperationId };
46
47	let CwdOpt = if Cwd.is_empty() { None } else { Some(Cwd.as_str()) };
48
49	let (ExitCode, Stdout, Stderr) = RunGit(&OperationIdRef, &Argv, CwdOpt).await?;
50
51	Ok(json!({
52		"stdout": Stdout,
53		"stderr": Stderr,
54		"exitCode": ExitCode,
55	}))
56}