Skip to main content

Mountain/IPC/WindServiceHandlers/Git/
HandleExec.rs

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