From c7ce88c37d560da12812eaccac665db1b2486cfa Mon Sep 17 00:00:00 2001 From: weiningwei Date: Mon, 3 Aug 2026 22:07:32 +0800 Subject: [PATCH 1/2] fix(windows): set UseShellExecute to true when launching terminal Signed-off-by: weiningwei --- src/Native/Windows.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index 2ec98ca40..400a0579a 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -159,6 +159,7 @@ public void OpenTerminal(string workdir, string args) startInfo.WorkingDirectory = cwd; startInfo.FileName = terminal; startInfo.Arguments = args; + startInfo.UseShellExecute = true; Process.Start(startInfo); } From 6ac97b7acb1b6bbcdfaeacc23e34dcf50e6a2393 Mon Sep 17 00:00:00 2001 From: weiningwei Date: Mon, 3 Aug 2026 23:32:40 +0800 Subject: [PATCH 2/2] fix: refresh terminal environment from registry to avoid stale env Signed-off-by: weiningwei --- src/Native/Windows.cs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index 400a0579a..88b6c13c3 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -159,10 +159,41 @@ public void OpenTerminal(string workdir, string args) startInfo.WorkingDirectory = cwd; startInfo.FileName = terminal; startInfo.Arguments = args; - startInfo.UseShellExecute = true; + RefreshEnvFromRegistry(startInfo); Process.Start(startInfo); } + private static void RefreshEnvFromRegistry(ProcessStartInfo startInfo) + { + // Read latest machine and user environment from registry, so that + // environment changes made after SourceGit started are picked up. + var machine = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); + var user = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User); + + foreach (System.Collections.DictionaryEntry kv in machine) + startInfo.Environment[kv.Key.ToString()] = kv.Value?.ToString() ?? ""; + + foreach (System.Collections.DictionaryEntry kv in user) + { + var key = kv.Key.ToString(); + var value = kv.Value?.ToString() ?? ""; + if (string.Equals(key, "Path", StringComparison.OrdinalIgnoreCase) && startInfo.Environment.TryGetValue(key, out var existing)) + startInfo.Environment[key] = existing + ";" + value; + else + startInfo.Environment[key] = value; + } + + // Preserve dynamic process-only variables not stored in registry + // (e.g. TEMP, USERNAME, COMPUTERNAME, PROCESSOR_*) + var proc = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process); + foreach (System.Collections.DictionaryEntry kv in proc) + { + var key = kv.Key.ToString(); + if (!startInfo.Environment.ContainsKey(key)) + startInfo.Environment[key] = kv.Value?.ToString() ?? ""; + } + } + public void OpenInFileManager(string path) { if (File.Exists(path))