Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/IPC/WindServiceHandlers/Git/
HandleExec.rs

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