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[]