diff --git a/src/Commands/Command.cs b/src/Commands/Command.cs index 9bfa1c15..a6f758d7 100644 --- a/src/Commands/Command.cs +++ b/src/Commands/Command.cs @@ -167,6 +167,19 @@ private ProcessStartInfo CreateGitStartInfo() start.Environment.Add("LANG", "C"); start.Environment.Add("LC_ALL", "C"); } + else if (OperatingSystem.IsWindows()) + { + // Use WSL git for WSL paths on Windows + var wsl = new Models.WSL() { Path = WorkingDirectory }; + if (wsl.IsWSLPath()) + { + start.FileName = "wsl"; + start.Arguments = $"git {start.Arguments}"; + + wsl.SetEnvironmentForProcess(start); + selfExecFile = start.Environment["SSH_ASKPASS"]; + } + } // Force using this app as git editor. switch (Editor) diff --git a/src/Models/WSL.cs b/src/Models/WSL.cs new file mode 100644 index 00000000..690b17f2 --- /dev/null +++ b/src/Models/WSL.cs @@ -0,0 +1,45 @@ +using System; +using System.Diagnostics; +using System.Text; + +namespace SourceGit.Models +{ + public class WSL + { + public string Path { get; set; } = ""; + + public bool IsWSLPath() + { + return OperatingSystem.IsWindows() && !string.IsNullOrEmpty(Path) && + (Path.StartsWith("//wsl.localhost/", StringComparison.OrdinalIgnoreCase) || + Path.StartsWith("//wsl$/", StringComparison.OrdinalIgnoreCase)); + } + + public void SetEnvironmentForProcess(ProcessStartInfo start) + { + start.Environment.Add("LANG", "C"); + start.Environment.Add("LC_ALL", "C"); + + if (start.Environment.TryGetValue("SSH_ASKPASS", out var askPassPath) && !string.IsNullOrEmpty(askPassPath) && System.IO.Path.IsPathRooted(askPassPath)) + { + // Convert Windows path to WSL path + var driveLetter = askPassPath[0].ToString(); + start.Environment["SSH_ASKPASS"] = askPassPath + .Replace($"{driveLetter}:\\", $"/mnt/{driveLetter.ToLowerInvariant()}/") + .Replace('\\', '/'); + } + + var wslEnvirionment = new[] { "SSH_ASKPASS", "SSH_ASKPASS_REQUIRE", "SOURCEGIT_LAUNCH_AS_ASKPASS", "GIT_SSH_COMMAND", "LANG", "LC_ALL" }; + var wslEnvBuilder = new StringBuilder(); + + foreach (string env in wslEnvirionment) + { + if (start.Environment.ContainsKey(env)) + wslEnvBuilder.Append($"{env}:"); + } + + // Forward environment variables for WSL + start.Environment.Add("WSLENV", wslEnvBuilder.ToString().TrimEnd(':')); + } + } +} diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index b02cf36a..9fb990bd 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -869,7 +869,15 @@ public void StartSearchCommits() public void SetWatcherEnabled(bool enabled) { - _watcher?.SetEnabled(enabled); + var wsl = new Models.WSL() { Path = FullPath }; + if (wsl.IsWSLPath()) + { + _watcher?.MarkBranchDirtyManually(); + } + else + { + _watcher?.SetEnabled(enabled); + } } public void MarkBranchesDirtyManually()