diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 371a97c2..020b32da 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -22,7 +22,7 @@ jobs: os: [ windows-2019 ] env: - #COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} GITHUB_PAT: ${{ secrets.GH_TOKEN }} GPR_PASSWORD: ${{ secrets.GPR_PASSWORD }} GPR_USER: ${{ secrets.GPR_USER }} diff --git a/src/JavaVersionSwitcher/Adapters/IShellAdapter.cs b/src/JavaVersionSwitcher/Adapters/IShellAdapter.cs new file mode 100644 index 00000000..7ba95676 --- /dev/null +++ b/src/JavaVersionSwitcher/Adapters/IShellAdapter.cs @@ -0,0 +1,7 @@ +namespace JavaVersionSwitcher.Adapters +{ + public interface IShellAdapter + { + ShellType GetShellType(); + } +} \ No newline at end of file diff --git a/src/JavaVersionSwitcher/Adapters/ShellAdapter.cs b/src/JavaVersionSwitcher/Adapters/ShellAdapter.cs new file mode 100644 index 00000000..17da2297 --- /dev/null +++ b/src/JavaVersionSwitcher/Adapters/ShellAdapter.cs @@ -0,0 +1,73 @@ +using System; +using System.Diagnostics; +using JavaVersionSwitcher.Logging; + +namespace JavaVersionSwitcher.Adapters +{ + // some of this was inspired by https://stackoverflow.com/a/2336322/180156 + public class ShellAdapter : IShellAdapter + { + private readonly ILogger _logger; + + public ShellAdapter(ILogger logger) + { + _logger = logger; + } + + public ShellType GetShellType() + { + try + { + var proc = GetParentProcess(Process.GetCurrentProcess()); + // when calling "dotnet jvs" the parent is "dotnet" - not sure if that's the case for dotnet-jvs.exe + if ("dotnet".Equals(proc.ProcessName, StringComparison.OrdinalIgnoreCase)) + { + proc = GetParentProcess(proc); + } + + _logger.LogVerbose("Parent process name is: " + proc.ProcessName); + var name = proc.ProcessName.ToLowerInvariant(); + switch (name) + { + case "pwsh": + case "powershell": + return ShellType.PowerShell; + case "cmd": + return ShellType.CommandPrompt; + default: + return ShellType.Unknown; + } + } + catch(Exception e) + { + _logger.LogVerbose($"{e.GetType().Name} while finding parent process: {e.Message}"); + return ShellType.Unknown; + } + } + + private static Process GetParentProcess(Process process) { + return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id)); + } + + private static string FindIndexedProcessName(int pid) { + var processName = Process.GetProcessById(pid).ProcessName; + var processesByName = Process.GetProcessesByName(processName); + string processIndexedName = null; + + for (var index = 0; index < processesByName.Length; index++) { + processIndexedName = index == 0 ? processName : processName + "#" + index; + var processId = new PerformanceCounter("Process", "ID Process", processIndexedName); + if ((int) processId.NextValue() == pid) { + return processIndexedName; + } + } + + return processIndexedName; + } + + private static Process FindPidFromIndexedProcessName(string indexedProcessName) { + var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName); + return Process.GetProcessById((int) parentId.NextValue()); + } + } +} \ No newline at end of file diff --git a/src/JavaVersionSwitcher/Adapters/ShellType.cs b/src/JavaVersionSwitcher/Adapters/ShellType.cs new file mode 100644 index 00000000..d2bd9858 --- /dev/null +++ b/src/JavaVersionSwitcher/Adapters/ShellType.cs @@ -0,0 +1,20 @@ +namespace JavaVersionSwitcher.Adapters +{ + public enum ShellType + { + /// + /// Unknown + /// + Unknown, + + /// + /// PowerShell + /// + PowerShell, + + /// + /// CMD + /// + CommandPrompt, + } +} \ No newline at end of file diff --git a/src/JavaVersionSwitcher/Commands/SwitchVersionCommand.cs b/src/JavaVersionSwitcher/Commands/SwitchVersionCommand.cs index 573221b3..39339873 100644 --- a/src/JavaVersionSwitcher/Commands/SwitchVersionCommand.cs +++ b/src/JavaVersionSwitcher/Commands/SwitchVersionCommand.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; @@ -18,18 +19,21 @@ internal sealed class SwitchVersionCommand : AsyncCommand ExecuteAsync(CommandContext context, Settings se .AddChoices(installations.Select(x => x.Location).ToArray()) ); + string javaHome = null; + string javaBin = null; await AnsiConsole.Status() .StartAsync("Applying...", async ctx => { @@ -66,20 +72,42 @@ await AnsiConsole.Status() ? EnvironmentScope.Machine : EnvironmentScope.User; - var javaHome = await _javaHomeAdapter.GetValue(EnvironmentScope.Process); + javaHome = await _javaHomeAdapter.GetValue(EnvironmentScope.Process); var paths = (await _pathAdapter.GetValue(scope)).ToList(); if (!string.IsNullOrEmpty(javaHome)) { paths = paths.Where(x => !x.StartsWith(javaHome,StringComparison.OrdinalIgnoreCase)).ToList(); } - paths.Add(Path.Combine(selected, "bin")); + javaBin = Path.Combine(selected, "bin"); + paths.Add(javaBin); await _javaHomeAdapter.SetValue(selected, scope); await _pathAdapter.SetValue(paths, scope); }).ConfigureAwait(false); - AnsiConsole.MarkupLine("[yellow]The environment has been modified. You need to refresh it.[/]"); + var shellType = _shellAdapter.GetShellType(); + var refreshCommands = new List(); + switch (shellType) + { + case ShellType.PowerShell: + refreshCommands.Add($"$env:JAVA_HOME=\"{javaHome}\""); + refreshCommands.Add($"$env:PATH=\"{javaBin}{Path.PathSeparator}$($env:PATH)\""); + break; + case ShellType.CommandPrompt: + refreshCommands.Add($"set \"JAVA_HOME={javaHome}\""); + refreshCommands.Add($"set \"PATH={javaBin}{Path.PathSeparator}%PATH%\""); + break; + } + + AnsiConsole.MarkupLine(refreshCommands.Count > 0 + ? "[yellow]The environment has been modified. Apply modifications:[/]" + : "[yellow]The environment has been modified. You need to refresh it.[/]"); + + foreach (var line in refreshCommands) + { + Console.WriteLine(line); + } return 0; } } diff --git a/src/JavaVersionSwitcher/JavaVersionSwitcher.csproj b/src/JavaVersionSwitcher/JavaVersionSwitcher.csproj index 96d34f8b..acaceb8b 100644 --- a/src/JavaVersionSwitcher/JavaVersionSwitcher.csproj +++ b/src/JavaVersionSwitcher/JavaVersionSwitcher.csproj @@ -39,6 +39,7 @@ + diff --git a/src/JavaVersionSwitcher/Program.cs b/src/JavaVersionSwitcher/Program.cs index b0332f34..54840b71 100644 --- a/src/JavaVersionSwitcher/Program.cs +++ b/src/JavaVersionSwitcher/Program.cs @@ -61,6 +61,7 @@ private static ITypeRegistrar BuildRegistrar() container.Register(Lifestyle.Singleton); container.Register(Lifestyle.Singleton); container.Register(Lifestyle.Singleton); + container.Register(Lifestyle.Singleton); container.Collection.Register( new[]