From 9818bd8aa1fdb584e998e4252c9fa78c67250f17 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 10:33:36 -0500 Subject: [PATCH 01/37] Update WindowsSdkPackageVersion --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 28daef943f..3ade510491 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -5,7 +5,7 @@ 10.0.19041.0 - 10.0.26100.56 + 10.0.26100.57 8.0.407 Martí Climent and the contributors From 5b5832b83d790f7a7b2e2f71327b4653d376dec1 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 10:34:04 -0500 Subject: [PATCH 02/37] Open the debug logs by default in a debug build --- src/UniGetUI/Pages/LogPages/UniGetUILogPage.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/UniGetUI/Pages/LogPages/UniGetUILogPage.cs b/src/UniGetUI/Pages/LogPages/UniGetUILogPage.cs index 19b62d1ce2..7135094bc9 100644 --- a/src/UniGetUI/Pages/LogPages/UniGetUILogPage.cs +++ b/src/UniGetUI/Pages/LogPages/UniGetUILogPage.cs @@ -20,6 +20,9 @@ protected override void LoadLogLevels() LogLevelCombo.Items.Add(CoreTools.Translate("4 - Information (more)")); LogLevelCombo.Items.Add(CoreTools.Translate("5 - information (debug)")); LogLevelCombo.SelectedIndex = 3; +#if DEBUG + LogLevelCombo.SelectedIndex = 4; +#endif } public override void LoadLog(bool isReload = false) From c32f443f114680616c4d924725b41eca57b7035f Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 10:34:16 -0500 Subject: [PATCH 03/37] Allow for a `which` search to return all the findings, not just the first --- src/UniGetUI.Core.Tools/Tools.cs | 34 +++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/UniGetUI.Core.Tools/Tools.cs b/src/UniGetUI.Core.Tools/Tools.cs index b9b60bf003..fe7e744a79 100644 --- a/src/UniGetUI.Core.Tools/Tools.cs +++ b/src/UniGetUI.Core.Tools/Tools.cs @@ -103,14 +103,16 @@ public static void RelaunchProcess() /// Finds an executable in path and returns its location /// /// The executable alias to find - /// A tuple containing: a boolean hat represents whether the path was found or not; the path to the file if found. + /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. public static async Task> WhichAsync(string command) { return await Task.Run(() => Which(command)); } - public static Tuple Which(string command, bool updateEnv = true) + public static Tuple> WhichMultiple(string command, bool updateEnv = true) { + List paths = []; + command = command.Replace(";", "").Replace("&", "").Trim(); Logger.Debug($"Begin \"which\" search for command {command}"); @@ -142,28 +144,36 @@ public static Tuple Which(string command, bool updateEnv = true) try { process.Start(); - string? line = process.StandardOutput.ReadLine(); - string output; - - if (line is null) output = ""; - else output = line.Trim(); + string[] lines = process.StandardOutput.ReadToEnd() + .Split(["\r\n", "\n"], StringSplitOptions.RemoveEmptyEntries); process.WaitForExit(); - if (process.ExitCode != 0 || output == "") + if ((process.ExitCode != 0 || lines.Length == 0) && paths.Count == 0) { Logger.ImportantInfo($"Command {command} was not found on the system"); - return new Tuple(false, ""); + return new Tuple>(false, []); } - Logger.Debug($"Command {command} was found on {output}"); - return new Tuple(File.Exists(output), output); + foreach (var line in lines) + { + Logger.Debug($"Command {command} was found on {line}{(line.Length > 1 ? $" (#{paths.Count + 1})" : "")}"); + paths.Add(line); + } } catch { - if (updateEnv) return Which(command, false); + if (updateEnv) return WhichMultiple(command, false); throw; } + return new Tuple>(true, paths); + } + + public static Tuple Which(string command, bool updateEnv = true) + { + var (found, paths) = WhichMultiple(command, updateEnv); + if (found && paths.Count > 0) return new Tuple(true, paths[0]); + else return new Tuple(false, ""); } /// From 5f0e2d69826cb998cfbf1df5e2d3f060d4e410dd Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 11:38:47 -0500 Subject: [PATCH 04/37] Add a warning about the Python App Execution Alias (address marticliment/UniGetUI#3522) --- .../ManagersPages/PackageManager.xaml | 18 ++++++++++++++++++ .../ManagersPages/PackageManager.xaml.cs | 14 +++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml index 8377e80299..910488112c 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml @@ -115,6 +115,24 @@ TextWrapping="Wrap" /> + + + + + + + + + + diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index 557dd2e206..022e4b73f5 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -239,6 +239,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e) }; ExtraControls.Children.Add(Scoop_CleanupOnStart); } + // ----------------------------- CHOCO EXTRA SETTINGS ------------------------------ else if (Manager is Chocolatey) @@ -345,7 +346,18 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ExtraControls.Children.Add(DisableNotifsCard); } - base.OnNavigatedTo(e); + // Hide the AppExecutionAliasWarning element if Manager is not Pip + if (Manager is Pip) + { + ManagerLogs.CornerRadius = new CornerRadius(8, 8, 0, 0); + AppExecutionAliasWarningLabel.Text = "If Python cannot be found or is not listing packages but is installed on the system, you may need to disable the \"python.exe\" App Execution Alias in the settings."; + } + else + { + AppExecutionAliasWarning.Visibility = Visibility.Collapsed; + } + + base.OnNavigatedTo(e); } private void ShowVersionHyperlink_Click(object sender, RoutedEventArgs e) From 9d29cf6845b172c72e5545f577f7ba27dcf64728 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 11:56:54 -0500 Subject: [PATCH 05/37] Allow package managers to declare any paths they have NPM, Scoop, Chocolatey, and PowerShell have not been implemented as they are awaiting clarification. --- .../Cargo.cs | 7 ++- .../Chocolatey.cs | 5 ++ .../DotNet.cs | 7 ++- .../Npm.cs | 5 ++ .../Pip.cs | 35 +++++++++++++- .../PowerShell.cs | 6 +++ .../PowerShell7.cs | 8 +++- .../Scoop.cs | 6 +++ .../Vcpkg.cs | 48 +++++++++---------- .../WinGet.cs | 7 ++- .../Manager/PackageManager.cs | 17 ++++++- 11 files changed, 119 insertions(+), 32 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index e218e4695d..3bb0469d30 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -136,9 +136,14 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return GetPackages(LoggableTaskType.ListInstalledPackages); } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("cargo").Item2]; + } + protected override ManagerStatus LoadManager() { - var (found, executablePath) = CoreTools.Which("cargo"); + var (found, executablePath) = GetManagerExecutablePath(); if (!found) { return new(){ ExecutablePath = executablePath, Found = false, Version = ""}; diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index ce581fe3f2..69eaa11bb6 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -190,6 +190,11 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("choco").Item2]; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new(); diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 85cb10dce2..7c2d55db9b 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -125,11 +125,16 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("dotnet").Item2]; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new(); - var (found, path) = CoreTools.Which("dotnet.exe"); + var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 1592da6d11..57aad59ed8 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -187,6 +187,11 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("npm").Item2]; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new() diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index f8d1c2ef3d..439cad8c47 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -302,11 +302,44 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + var (Found, FoundPaths) = CoreTools.WhichMultiple("python"); + HashSet Paths = []; + + if (Found) foreach (var Path in FoundPaths) Paths.Add(Path); + + try + { + List DirsToSearch = []; + string ProgramFiles = @"C:\Program Files"; + string? UserPythonInstallDir = null; + string? AppData = Environment.GetEnvironmentVariable("APPDATA"); + + if (AppData != null) + UserPythonInstallDir = Path.Combine(AppData, "Programs", "Python"); + + if (Directory.Exists(ProgramFiles)) DirsToSearch.Add(ProgramFiles); + if (Directory.Exists(UserPythonInstallDir)) DirsToSearch.Add(UserPythonInstallDir); + + foreach (var Dir in DirsToSearch) + { + string DirName = Path.GetFileName(Dir); + string PythonPath = Path.Join(Dir, "python.exe"); + if (DirName.StartsWith("Python") && File.Exists(PythonPath)) + Paths.Add(PythonPath); + } + } + catch (Exception) { } + + return Paths; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new(); - var (found, path) = CoreTools.Which("python.exe"); + var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index c49ea12a06..2cf7e704ee 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -116,6 +116,12 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + // TODO: Search correctly + return [.. CoreTools.WhichMultiple("powershell").Item2]; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new() diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index d8456ae9d0..87c0b67a19 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -115,9 +115,15 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } + + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("pwsh").Item2]; + } + protected override ManagerStatus LoadManager() { - var (found, path) = CoreTools.Which("pwsh.exe"); + var (found, path) = GetManagerExecutablePath(); ManagerStatus status = new() { diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index acf647a9a0..cc5ceaea9d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -372,6 +372,12 @@ public override void RefreshPackageIndexes() logger.Close(p.ExitCode); } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("scoop").Item2]; + } + + protected override ManagerStatus LoadManager() { ManagerStatus status = new() diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index b8eff47830..1779c96720 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -287,9 +287,27 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } + protected override HashSet LoadAvailablePaths() + { + var (Found, FoundPaths) = CoreTools.WhichMultiple("vcpkg"); + HashSet Paths = []; + + if (Found) foreach (var Path in FoundPaths) Paths.Add(Path); + + var (VcpkgRootFound, VcpkgRoot) = GetVcpkgRoot(); + if (VcpkgRootFound) + { + string VcpkgLocation = Path.Join(VcpkgRoot, "vcpkg.exe"); + + if (File.Exists(VcpkgLocation)) Paths.Add(VcpkgLocation); + } + + return Paths; + } + protected override ManagerStatus LoadManager() { - var (exeFound, exePath) = GetVcpkgPath(); + var (exeFound, exePath) = GetManagerExecutablePath(); var (rootFound, rootPath) = GetVcpkgRoot(); if (!exeFound) @@ -343,7 +361,7 @@ protected override ManagerStatus LoadManager() public override void RefreshPackageIndexes() { - var (found, _) = GetVcpkgPath(); + var (found, _) = GetManagerExecutablePath(); var (vcpkgRootFound, vcpkgRoot) = GetVcpkgRoot(); var (gitFound, gitPath) = CoreTools.Which("git"); @@ -403,28 +421,6 @@ public override void RefreshPackageIndexes() } } - public static Tuple GetVcpkgPath() - { - var (found, path) = CoreTools.Which("vcpkg"); - if (found) - { - return Tuple.Create(found, path); - } - - var (vcpkgRootFound, vcpkgRoot) = GetVcpkgRoot(); - if (vcpkgRootFound) - { - string vcpkgLocation = Path.Join(vcpkgRoot, "vcpkg.exe"); - - if (File.Exists(vcpkgLocation)) - { - return Tuple.Create(true, vcpkgLocation); - } - } - - return Tuple.Create(false, ""); - } - public static Tuple GetVcpkgRoot() { string? vcpkgRoot = Settings.GetValue("CustomVcpkgRoot"); @@ -435,8 +431,8 @@ public static Tuple GetVcpkgRoot() if (vcpkgRoot == null) { - // Unfortunately, we can't use `GetVcpkgPath` for this - // as it would become a bunch of functions calling each other + // Unfortunately, we can't use `GetVcpkgPath` or `GetManagerExecutablePath` + // for this as it would become a bunch of functions calling each other var (found, path) = CoreTools.Which("vcpkg"); path = Path.GetDirectoryName(path); // Make sure the root is a valid root not just a random directory diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 42fd93641d..fd500a7135 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -174,13 +174,18 @@ public ManagerSource GetLocalSource(string id) return LocalPcSource; } + protected override HashSet LoadAvailablePaths() + { + return [.. CoreTools.WhichMultiple("winget").Item2]; + } + protected override ManagerStatus LoadManager() { ManagerStatus status = new(); bool FORCE_BUNDLED = Settings.Get("ForceLegacyBundledWinGet"); - var (found, path) = CoreTools.Which("winget.exe"); + var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 1e78b4f780..974c2524bc 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -59,7 +59,7 @@ public virtual void Initialize() // END integrity check Properties.DefaultSource.RefreshSourceNames(); - foreach(var source in Properties.KnownSources) + foreach (var source in Properties.KnownSources) { source.RefreshSourceNames(); } @@ -116,6 +116,21 @@ public virtual void Initialize() } } + /// + /// Returns a list of paths that could be used for this package manager. + /// For example, if you have three Pythons installed on your system, this would return those three Pythons. + /// + /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. + protected abstract HashSet LoadAvailablePaths(); + + protected Tuple GetManagerExecutablePath() + { + // TODO + HashSet AvailablePaths = LoadAvailablePaths(); + Logger.Debug(Name + " found paths: " + string.Join(", ", AvailablePaths)); + return new Tuple(false, AvailablePaths.ElementAt(0)); + } + /// /// Returns a ManagerStatus object representing the current status of the package manager. This method runs asynchronously. /// From cb4c8b968341a2ab9d8b5492332715a20e84e004 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 12:23:36 -0500 Subject: [PATCH 06/37] GetManagerExecutablePath loads the executable from the user's settings --- .../Manager/PackageManager.cs | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 974c2524bc..89511e3272 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -125,10 +125,33 @@ public virtual void Initialize() protected Tuple GetManagerExecutablePath() { - // TODO HashSet AvailablePaths = LoadAvailablePaths(); - Logger.Debug(Name + " found paths: " + string.Join(", ", AvailablePaths)); - return new Tuple(false, AvailablePaths.ElementAt(0)); + string? Path = Settings.GetDictionaryItem("ManagerPaths", Name); + + if (AvailablePaths.Count == 0) + { + Logger.Warn("No available paths found for manager " + Name); + + if (File.Exists(Path) && Path != null) Logger.Info("Using stored path " + Path); + else Logger.Error("Stored path " + Path + " is invalid"); + return new Tuple(File.Exists(Path) && Path != null, Path ?? ""); + } + else if (Path == null && File.Exists(AvailablePaths.ElementAt(0))) + { + Logger.Info("Stored path for " + Name + " is missing, using AvailablePaths[0]: " + AvailablePaths.ElementAt(0)); + return new Tuple(true, AvailablePaths.ElementAt(0)); + } + else + { + if (File.Exists(Path) && Path != null) + { + Logger.Info("Using stored path " + Path); + return new Tuple(true, Path); + } + } + + Logger.Info("No suitable path found for " + Name); + return new Tuple(false, ""); } /// From bf1fdccceae78862057bb983dd9ff315bae0741a Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:32:27 -0500 Subject: [PATCH 07/37] Only read / write settings if the setting is not blank --- src/UniGetUI.Core.Settings/SettingsEngine.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/UniGetUI.Core.Settings/SettingsEngine.cs b/src/UniGetUI.Core.Settings/SettingsEngine.cs index f2861d92d2..463f044df4 100644 --- a/src/UniGetUI.Core.Settings/SettingsEngine.cs +++ b/src/UniGetUI.Core.Settings/SettingsEngine.cs @@ -11,6 +11,8 @@ public static partial class Settings public static bool Get(string setting, bool invert = false) { + if (setting == "") return false; + if (booleanSettings.TryGetValue(setting, out bool result)) { // If the setting was cached return result ^ invert; @@ -24,6 +26,8 @@ public static bool Get(string setting, bool invert = false) public static void Set(string setting, bool value) { + if (setting == "") return; + try { // Cache that setting's new value @@ -54,6 +58,8 @@ public static void Set(string setting, bool value) public static string GetValue(string setting) { + if (setting == "") return ""; + if (valueSettings.TryGetValue(setting, out string? value)) { // If the setting was cached return value; @@ -73,6 +79,8 @@ public static string GetValue(string setting) public static void SetValue(string setting, string value) { + if (setting == "") return; + try { if (value == String.Empty) From 9547294cacd9c0a2eb49d6078b30d01589cf1f6d Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:33:24 -0500 Subject: [PATCH 08/37] Allow ComboboxCard index selection --- src/UniGetUI/Controls/SettingsWidgets/ComboboxCard.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/UniGetUI/Controls/SettingsWidgets/ComboboxCard.cs b/src/UniGetUI/Controls/SettingsWidgets/ComboboxCard.cs index 13e057859e..fa4af8cbca 100644 --- a/src/UniGetUI/Controls/SettingsWidgets/ComboboxCard.cs +++ b/src/UniGetUI/Controls/SettingsWidgets/ComboboxCard.cs @@ -84,5 +84,6 @@ public void ShowAddedItems() } public string SelectedValue() => _combobox.SelectedValue.ToString() ?? throw new InvalidCastException(); + public void SelectIndex(int index) => _combobox.SelectedIndex = index; } } From 081fcd0fc7417040aaffcbe4a7f6d27dea394072 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:34:25 -0500 Subject: [PATCH 09/37] Change LoadAvailablePaths and GetManagerExecutablePath to public --- src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 2 +- src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs | 2 +- .../PowerShell7.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 2 +- src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 2 +- .../Manager/PackageManager.cs | 4 ++-- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index 3bb0469d30..3aed3e2f7c 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -136,7 +136,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return GetPackages(LoggableTaskType.ListInstalledPackages); } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("cargo").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 69eaa11bb6..7ff9b231f1 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -190,7 +190,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("choco").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 7c2d55db9b..7d00bf2d4f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -125,7 +125,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("dotnet").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 57aad59ed8..606de14aeb 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -187,7 +187,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("npm").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 439cad8c47..6b5af8e08d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -302,7 +302,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { var (Found, FoundPaths) = CoreTools.WhichMultiple("python"); HashSet Paths = []; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 2cf7e704ee..3b05b085d4 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -116,7 +116,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { // TODO: Search correctly return [.. CoreTools.WhichMultiple("powershell").Item2]; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index 87c0b67a19..44198391fa 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -116,7 +116,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("pwsh").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index cc5ceaea9d..91bfeb8b5e 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -372,7 +372,7 @@ public override void RefreshPackageIndexes() logger.Close(p.ExitCode); } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("scoop").Item2]; } diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 1779c96720..b7a0a2fe00 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -287,7 +287,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { var (Found, FoundPaths) = CoreTools.WhichMultiple("vcpkg"); HashSet Paths = []; diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index fd500a7135..50702f6d8f 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -174,7 +174,7 @@ public ManagerSource GetLocalSource(string id) return LocalPcSource; } - protected override HashSet LoadAvailablePaths() + public override HashSet LoadAvailablePaths() { return [.. CoreTools.WhichMultiple("winget").Item2]; } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 89511e3272..38bea624b6 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -121,9 +121,9 @@ public virtual void Initialize() /// For example, if you have three Pythons installed on your system, this would return those three Pythons. /// /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. - protected abstract HashSet LoadAvailablePaths(); + public abstract HashSet LoadAvailablePaths(); - protected Tuple GetManagerExecutablePath() + public Tuple GetManagerExecutablePath() { HashSet AvailablePaths = LoadAvailablePaths(); string? Path = Settings.GetDictionaryItem("ManagerPaths", Name); From 3452fd502be6ea6f70e056dfa170630f29b6c20d Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:34:38 -0500 Subject: [PATCH 10/37] Allow the user to change package manager executable paths in the settings --- .../ManagersPages/PackageManager.xaml | 7 ++++ .../ManagersPages/PackageManager.xaml.cs | 32 +++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml index 910488112c..a20ff78cde 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml @@ -52,6 +52,13 @@ Visibility="Collapsed" /> + ? NavigationRequested; public event EventHandler? ReapplyProperties; public bool CanGoBack => true; - public string ShortTitle => Manager is null? "": CoreTools.Translate("{0} settings", Manager.DisplayName); + public string ShortTitle => Manager is null ? "" : CoreTools.Translate("{0} settings", Manager.DisplayName); public PackageManagerPage() { @@ -80,8 +82,8 @@ protected override void OnNavigatedTo(NavigationEventArgs e) Text = CoreTools.Translate("Always run {pm} operations with administrator rights").Replace("{pm}", Manager.DisplayName), DictionaryName = "AlwaysElevate", SettingName = Manager.Name, - CornerRadius = new CornerRadius(8,8,0,0), - BorderThickness = new Thickness(1,1,1,0), + CornerRadius = new CornerRadius(8, 8, 0, 0), + BorderThickness = new Thickness(1, 1, 1, 0), }; var DisableNotifsCard = new CheckboxCard_Dict() @@ -94,16 +96,26 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ManagerLogsLabel.Text = CoreTools.Translate("View {0} logs", Manager.DisplayName); + HashSet Paths = ((PackageManager)Manager).LoadAvailablePaths(); + var (CurrentlyExists, CurrentPath) = ((PackageManager)Manager).GetManagerExecutablePath(); + foreach (string Path in Paths) + { + ManagerExecutable.AddItem(Path, Path); + } + ManagerExecutable.ShowAddedItems(); + ManagerExecutable.SelectIndex(CurrentlyExists ? Paths.ToList().IndexOf(CurrentPath) : 0); + // ----------------------- SOURCES CONTROL ------------------- ExtraControls.Children.Clear(); - if(Manager.Capabilities.SupportsCustomSources && Manager is not Vcpkg) + if (Manager.Capabilities.SupportsCustomSources && Manager is not Vcpkg) { - SettingsCard SourceManagerCard = new() { + SettingsCard SourceManagerCard = new() + { Resources = { ["SettingsCardLeftIndention"] = 10 }, CornerRadius = new CornerRadius(8), - Margin = new Thickness(0,0,0,16) + Margin = new Thickness(0, 0, 0, 16) }; var man = new SourceManager(Manager); SourceManagerCard.Description = man; @@ -376,7 +388,7 @@ void SetManagerStatus(bool ShowVersion = false) if (!Manager.Status.Version.Contains('\n')) { ManagerStatusBar.Message = - CoreTools.Translate("{pm} version:", new Dictionary {{ "pm", Manager.DisplayName }}) + $" {Manager.Status.Version}"; + CoreTools.Translate("{pm} version:", new Dictionary { { "pm", Manager.DisplayName } }) + $" {Manager.Status.Version}"; } else if (ShowVersion) { @@ -421,5 +433,11 @@ private void ManagerLogs_Click(object sender, RoutedEventArgs e) { MainApp.Instance.MainWindow.NavigationPage.OpenManagerLogs(Manager as IPackageManager); } + + public void ManagerExecutableSelection_OnValueChanged(object sender, EventArgs e) + { + Settings.SetDictionaryItem("ManagerPaths", Manager.Name, ManagerExecutable.SelectedValue()); + RestartRequired?.Invoke(this, EventArgs.Empty); + } } } From ac5f4bc7b32cb407ca57fdc4679dcecb128517ce Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:53:17 -0500 Subject: [PATCH 11/37] Update chocolatey path retrievals --- .../Chocolatey.cs | 42 ++++++++++--------- .../ManagersPages/PackageManager.xaml.cs | 19 --------- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 7ff9b231f1..138ad34f59 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -190,18 +190,24 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } + private static string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); + private static string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); + public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("choco").Item2]; + HashSet ChocoPaths = []; + + var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); + if (SystemFound) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); + if (File.Exists(Path.Join(new_choco_path, "choco.exe"))) ChocoPaths.Add(Path.Join(new_choco_path, "choco.exe")); + + return ChocoPaths; } protected override ManagerStatus LoadManager() { ManagerStatus status = new(); - string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); - string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); - if (!Directory.Exists(old_choco_path)) { Logger.Debug("Old chocolatey path does not exist, not migrating Chocolatey"); @@ -289,26 +295,22 @@ protected override ManagerStatus LoadManager() } } - if (Settings.Get("UseSystemChocolatey")) - { - status.ExecutablePath = CoreTools.Which("choco.exe").Item2; - } - else if (File.Exists(Path.Join(new_choco_path, "choco.exe"))) - { - status.ExecutablePath = Path.Join(new_choco_path, "choco.exe"); - } - else + (status.Found, status.ExecutablePath) = GetManagerExecutablePath(); + + if (Settings.Get("UseSystemChocolatey") && !Settings.Get("TransferredSystemChocolatey")) { - status.ExecutablePath = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey", "choco.exe"); - if (!File.Exists(status.ExecutablePath)) status.ExecutablePath = ""; + var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); + if (SystemFound && SystemPaths.Count > 0) + { + Settings.SetDictionaryItem("ManagerPaths", "Chocolatey", SystemPaths.ElementAt(0)); + Settings.Set("TransferredSystemChocolatey", true); + } } - status.Found = File.Exists(status.ExecutablePath); - if (!status.Found) - { - return status; - } + { + return status; + } Process process = new() { diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index 1393c21296..1432c445a8 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -252,25 +252,6 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ExtraControls.Children.Add(Scoop_CleanupOnStart); } - // ----------------------------- CHOCO EXTRA SETTINGS ------------------------------ - - else if (Manager is Chocolatey) - { - DisableNotifsCard.CornerRadius = new CornerRadius(0); - DisableNotifsCard.BorderThickness = new Thickness(1, 1, 1, 0); - ExtraControls.Children.Add(AlwaysElevateManagerOP); - ExtraControls.Children.Add(DisableNotifsCard); - - CheckboxCard Chocolatey_SystemChoco = new() - { - Text = CoreTools.AutoTranslated("Use system Chocolatey"), - SettingName = "UseSystemChocolatey", - CornerRadius = new CornerRadius(0, 0, 8, 8) - }; - Chocolatey_SystemChoco.StateChanged += (_, _) => RestartRequired?.Invoke(this, new()); - ExtraControls.Children.Add(Chocolatey_SystemChoco); - } - // -------------------------------- VCPKG EXTRA SETTINGS -------------------------------------- else if (Manager is Vcpkg) From 4588d65fc5c5eb3e6057fc928dc5c9b25a4bcb68 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 30 May 2025 15:54:23 -0500 Subject: [PATCH 12/37] Fix the 'Restart UniGetUI' notification appearing even when no changes had happened --- .../Pages/SettingsPages/ManagersPages/PackageManager.xaml | 3 +-- .../Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml index a20ff78cde..eba47c6ce5 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml @@ -57,8 +57,7 @@ Text="Select which manager executable to use:" Padding="24,0,24,0" BorderThickness="1,0,1,1" - CornerRadius="0,0,0,0" - ValueChanged="ManagerExecutableSelection_OnValueChanged" /> + CornerRadius="0,0,0,0" /> Date: Fri, 30 May 2025 15:57:38 -0500 Subject: [PATCH 13/37] Make sure the Chocolatey porter actually ports to system chocolatey and not the path-infused bundled chocolatey --- .../Chocolatey.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 138ad34f59..ad23fc80e6 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -302,15 +302,21 @@ protected override ManagerStatus LoadManager() var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); if (SystemFound && SystemPaths.Count > 0) { - Settings.SetDictionaryItem("ManagerPaths", "Chocolatey", SystemPaths.ElementAt(0)); + string SysPath = SystemPaths.ElementAt(0); + for (int idx = 1; idx < SystemPaths.Count; idx++) + { + if (!SystemPaths.ElementAt(idx).Contains("UniGetUI")) + SysPath = SystemPaths.ElementAt(idx); + } + Settings.SetDictionaryItem("ManagerPaths", "Chocolatey", SysPath); Settings.Set("TransferredSystemChocolatey", true); } } if (!status.Found) - { - return status; - } + { + return status; + } Process process = new() { From 588b9d7d3f648c2afc759ce148562b7ef1e915c3 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 15:43:14 -0500 Subject: [PATCH 14/37] Proper PowerShell path retrieval --- .../PowerShell.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 3b05b085d4..01c3cc73ac 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -118,17 +118,24 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - // TODO: Search correctly - return [.. CoreTools.WhichMultiple("powershell").Item2]; + string path = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); + HashSet paths = [.. CoreTools.WhichMultiple("powershell").Item2]; + if (File.Exists(path) && !paths.Contains(path, StringComparer.OrdinalIgnoreCase)) + { + paths.Add(path); + } + + return paths; } protected override ManagerStatus LoadManager() { + var (found, path) = GetManagerExecutablePath(); ManagerStatus status = new() { - ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe") + ExecutablePath = path, + Found = found }; - status.Found = File.Exists(status.ExecutablePath); if (!status.Found) { From d6a5cb039b12ec429b9dda19a970ccd6557cec53 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 16:24:10 -0500 Subject: [PATCH 15/37] Search for Chocolatey in the ChocolateyInstall environment variable --- .../Chocolatey.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index ad23fc80e6..795e846ff9 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -75,7 +75,7 @@ public static string GetProxyArgument() return $"--proxy {proxyUri.ToString()}"; var creds = Settings.GetProxyCredentials(); - if(creds is null) + if (creds is null) return $"--proxy {proxyUri.ToString()}"; return $"--proxy={proxyUri.ToString()} --proxy-user={Uri.EscapeDataString(creds.UserName)}" + @@ -200,6 +200,8 @@ public override HashSet LoadAvailablePaths() var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); if (SystemFound) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); if (File.Exists(Path.Join(new_choco_path, "choco.exe"))) ChocoPaths.Add(Path.Join(new_choco_path, "choco.exe")); + string EnvPath = Path.Join(Environment.GetEnvironmentVariable("ChocolateyInstall"), "choco.exe"); + if (File.Exists(EnvPath)) ChocoPaths.Add(EnvPath); return ChocoPaths; } @@ -337,7 +339,7 @@ protected override ManagerStatus LoadManager() // If the user is running bundled chocolatey and chocolatey is not in path, add chocolatey to path if (!Settings.Get("UseSystemChocolatey") && !File.Exists("C:\\ProgramData\\Chocolatey\\bin\\choco.exe")) - /* && Settings.Get("ShownWelcomeWizard")) */ + /* && Settings.Get("ShownWelcomeWizard")) */ { string? path = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.User); if (!path?.Contains(status.ExecutablePath.Replace("\\choco.exe", "\\bin")) ?? false) From 6cad1c0f63bd584ff25a5849ae2fd5d7210df8d1 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 17:05:29 -0500 Subject: [PATCH 16/37] Lock path changes behind a secure setting --- src/UniGetUI.Core.SecureSettings/SecureSettings.cs | 2 ++ .../Manager/PackageManager.cs | 9 +++++++++ .../Pages/SettingsPages/GeneralPages/Administrator.xaml | 7 +++++++ .../SettingsPages/GeneralPages/Administrator.xaml.cs | 8 +++++--- .../SettingsPages/ManagersPages/PackageManager.xaml.cs | 6 ++++-- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/UniGetUI.Core.SecureSettings/SecureSettings.cs b/src/UniGetUI.Core.SecureSettings/SecureSettings.cs index 11b2d0044e..b7df210823 100644 --- a/src/UniGetUI.Core.SecureSettings/SecureSettings.cs +++ b/src/UniGetUI.Core.SecureSettings/SecureSettings.cs @@ -16,6 +16,7 @@ public enum K AllowPrePostOpCommand, AllowImportPrePostOpCommands, ForceUserGSudo, + AllowCustomManagerPaths, Unset }; @@ -28,6 +29,7 @@ public static string ResolveKey(K key) K.AllowPrePostOpCommand => "AllowPrePostInstallCommands", K.AllowImportPrePostOpCommands => "AllowImportingPrePostInstallCommands", K.ForceUserGSudo => "ForceUserGSudo", + K.AllowCustomManagerPaths => "AllowCustomManagerPaths", K.Unset => throw new InvalidDataException("SecureSettings key was unset!"), _ => throw new KeyNotFoundException($"The SecureSettings key {key} was not found on the ResolveKey map") diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index da11f01426..61707ed66f 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -1,5 +1,6 @@ using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; +using UniGetUI.Core.SettingsEngine.SecureSettings; using UniGetUI.PackageEngine.Classes.Manager; using UniGetUI.PackageEngine.Classes.Manager.Classes; using UniGetUI.PackageEngine.Classes.Manager.ManagerHelpers; @@ -127,6 +128,14 @@ public Tuple GetManagerExecutablePath() { HashSet AvailablePaths = LoadAvailablePaths(); string? Path = Settings.GetDictionaryItem(Settings.K.ManagerPaths, Name); + if (!SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths)) + { + if (Path != null) + { + Logger.Info($"Available path {Path} found but not used as AllowCustomManagerPaths is turned off"); + } + Path = null; + } if (AvailablePaths.Count == 0) { diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml index f2af768643..98f9670ca5 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml @@ -98,6 +98,13 @@ Text="Allow importing custom pre-install and post-install commands when importing packages from a bundle" WarningText="Pre and post install commands can do very nasty things to your device, if designed to do so. It can be very dangerous to import the commands from a bundle, unless you trust the source of that package bundle" / --> + + diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml.cs b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml.cs index 81aa4dda69..b7e9957aeb 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml.cs @@ -15,7 +15,7 @@ public Administrator() { this.InitializeComponent(); - if(DoCacheAdminRights.Checked && DoCacheAdminRightsForBatches.Checked) + if (DoCacheAdminRights.Checked && DoCacheAdminRightsForBatches.Checked) { DoCacheAdminRights.IsEnabled = true; DoCacheAdminRightsForBatches.IsEnabled = true; @@ -23,9 +23,11 @@ public Administrator() WarningTitlebar.Title = CoreTools.Translate("Warning") + "!"; WarningTitlebar.Message = - CoreTools.Translate("The following settings may pose a security risk, hence they are disabled by default.") + " " + - CoreTools.Translate("Enable the settings below if and only if you fully understand what they do, and the implications they may have.") + "\n\n" + + CoreTools.Translate("The following settings may pose a security risk, hence they are disabled by default.") + " " + + CoreTools.Translate("Enable the settings below if and only if you fully understand what they do, and the implications they may have.") + "\n\n" + CoreTools.Translate("The settings will list, in their descriptions, the potential security issues they may have.") + " "; + + AllowCustomManagerPaths.StateChanged += (_, _) => RestartRequired?.Invoke(this, EventArgs.Empty); // The following settings may pose a security risk, hence they are disabled by default. Enable them ONLY if you undertsand what you are doing. Some of those settings will show a UAC prompt before being enabled." diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index 59d62bde34..b75a5f04ea 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -23,6 +23,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.Core.Logging; +using UniGetUI.Core.SettingsEngine.SecureSettings; // To learn more about WinUI, the WinUI project structure, // and more about our project templates, see: http://aka.ms/winui-project-info. @@ -97,7 +98,8 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ManagerExecutable.ShowAddedItems(); ManagerExecutable.SelectIndex(CurrentlyExists ? Paths.ToList().IndexOf(CurrentPath) : 0); ManagerExecutable.ValueChanged += ManagerExecutableSelection_OnValueChanged; - + ManagerExecutable.IsEnabled = SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths); + InstallOptionsPanel.Description = new InstallOptions_Manager(Manager); // ----------------------- SOURCES CONTROL ------------------- @@ -425,7 +427,7 @@ private void ManagerLogs_Click(object sender, RoutedEventArgs e) public void ManagerExecutableSelection_OnValueChanged(object sender, EventArgs e) { - Settings.SetDictionaryItem("ManagerPaths", Manager.Name, ManagerExecutable.SelectedValue()); + Settings.SetDictionaryItem(Settings.K.ManagerPaths, Manager.Name, ManagerExecutable.SelectedValue()); RestartRequired?.Invoke(this, EventArgs.Empty); } } From d513d903b8f9d614192e6dc2892e802e9829ab6e Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 17:35:22 -0500 Subject: [PATCH 17/37] Properly customize NPM and Scoop scripts --- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 15 ++++++++++++--- .../Scoop.cs | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 606de14aeb..2cc3248cd5 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -37,7 +37,7 @@ public Npm() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "install", - ExecutableCallArgs = " -NoProfile -ExecutionPolicy Bypass -Command npm", + ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", DefaultSource = new ManagerSource(this, "npm", new Uri("https://www.npmjs.com/")), KnownSources = [new ManagerSource(this, "npm", new Uri("https://www.npmjs.com/"))], @@ -189,7 +189,16 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("npm").Item2]; + HashSet Paths = [.. CoreTools.WhichMultiple("npm.ps1").Item2]; + foreach (string Path in CoreTools.WhichMultiple("npm").Item2) + { + string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "npm.ps1"); + if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) + { + Paths.Add(ps1Path); + } + } + return Paths; } protected override ManagerStatus LoadManager() @@ -197,7 +206,7 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), - Found = CoreTools.Which("npm").Item1 + Found = GetManagerExecutablePath().Item1 }; if (!status.Found) diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 9eb2f47fc6..4264008064 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -71,7 +71,7 @@ public Scoop() Description = CoreTools.Translate("Great repository of unknown but useful utilities and other interesting packages.
Contains: Utilities, Command-line programs, General Software (extras bucket required)"), IconId = IconType.Scoop, ColorIconId = "scoop_color", - ExecutableCallArgs = " -NoProfile -ExecutionPolicy Bypass -Command scoop", + ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", ExecutableFriendlyName = "scoop", InstallVerb = "install", UpdateVerb = "update", @@ -375,7 +375,16 @@ public override void RefreshPackageIndexes() public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("scoop").Item2]; + HashSet Paths = [.. CoreTools.WhichMultiple("scoop.ps1").Item2]; + foreach (string Path in CoreTools.WhichMultiple("scoop").Item2) + { + string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "scoop.ps1"); + if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) + { + Paths.Add(ps1Path); + } + } + return Paths; } @@ -383,7 +392,8 @@ protected override ManagerStatus LoadManager() { ManagerStatus status = new() { - ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe") + ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + Found = GetManagerExecutablePath().Item1 }; Process process = new() From a0693158a6335ebe756036c5e5c27693dddae61b Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 17:35:59 -0500 Subject: [PATCH 18/37] Fix Chocolatey loading order --- src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index b0ce403ca6..06f536106d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -298,8 +298,6 @@ protected override ManagerStatus LoadManager() } } - (status.Found, status.ExecutablePath) = GetManagerExecutablePath(); - if (Settings.Get(Settings.K.UseSystemChocolatey) && !Settings.Get(Settings.K.TransferredSystemChocolatey)) { var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); @@ -316,6 +314,8 @@ protected override ManagerStatus LoadManager() } } + (status.Found, status.ExecutablePath) = GetManagerExecutablePath(); + if (!status.Found) { return status; From 5a59fa46785e2f11f6ed8c99a54daae23edae6f4 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Jul 2025 17:37:45 -0500 Subject: [PATCH 19/37] Check all vcpkg folders for the vcpkg root --- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 3989a8b6c3..6675312336 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -434,12 +434,16 @@ public static Tuple GetVcpkgRoot() { // Unfortunately, we can't use `GetVcpkgPath` or `GetManagerExecutablePath` // for this as it would become a bunch of functions calling each other - var (found, path) = CoreTools.Which("vcpkg"); - path = Path.GetDirectoryName(path); - // Make sure the root is a valid root not just a random directory - if (found && Path.Exists($"{path}\\triplets")) + var (found, paths) = CoreTools.WhichMultiple("vcpkg"); + foreach (string path in paths) { - vcpkgRoot = path; + path = Path.GetDirectoryName(path); + // Make sure the root is a valid root not just a random directory + if (found && Path.Exists($"{path}\\triplets")) + { + vcpkgRoot = path; + break; + } } } From ac9b038f681046493893daa47cd671ffd6ef2fce Mon Sep 17 00:00:00 2001 From: mrixner <100489307+mrixner@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:36:26 -0700 Subject: [PATCH 20/37] Update Vcpkg.cs --- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 6675312336..d73f25967a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -437,11 +437,11 @@ public static Tuple GetVcpkgRoot() var (found, paths) = CoreTools.WhichMultiple("vcpkg"); foreach (string path in paths) { - path = Path.GetDirectoryName(path); + string dir = Path.GetDirectoryName(path); // Make sure the root is a valid root not just a random directory - if (found && Path.Exists($"{path}\\triplets")) + if (found && Path.Exists($"{dir}\\triplets")) { - vcpkgRoot = path; + vcpkgRoot = dir; break; } } From 64be1753e246d809181aaee174706664d930cff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 4 Jul 2025 20:33:05 +0200 Subject: [PATCH 21/37] WhichMultiple can return a list only. The boolean is redundant to list.Any() --- src/UniGetUI.Core.Tools/Tools.cs | 24 ++++++++----------- .../Cargo.cs | 2 +- .../Chocolatey.cs | 8 +++---- .../DotNet.cs | 2 +- .../Npm.cs | 4 ++-- .../Pip.cs | 4 ++-- .../PowerShell.cs | 2 +- .../PowerShell7.cs | 2 +- .../Scoop.cs | 4 ++-- .../Vcpkg.cs | 8 +++---- .../WinGet.cs | 2 +- 11 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/UniGetUI.Core.Tools/Tools.cs b/src/UniGetUI.Core.Tools/Tools.cs index e00150d4d6..2252b8430a 100644 --- a/src/UniGetUI.Core.Tools/Tools.cs +++ b/src/UniGetUI.Core.Tools/Tools.cs @@ -109,10 +109,8 @@ public static async Task> WhichAsync(string command) return await Task.Run(() => Which(command)); } - public static Tuple> WhichMultiple(string command, bool updateEnv = true) + public static List WhichMultiple(string command, bool updateEnv = true) { - List paths = []; - command = command.Replace(";", "").Replace("&", "").Trim(); Logger.Debug($"Begin \"which\" search for command {command}"); @@ -149,31 +147,29 @@ public static Tuple> WhichMultiple(string command, bool updat process.WaitForExit(); - if ((process.ExitCode != 0 || lines.Length == 0) && paths.Count == 0) + if (process.ExitCode is not 0) + Logger.Warn($"Call to WhichMultiple with file {command} returned non-zero status {process.ExitCode}"); + + if (lines.Length is 0) { Logger.ImportantInfo($"Command {command} was not found on the system"); - return new Tuple>(false, []); + return []; } - foreach (var line in lines) - { - Logger.Debug($"Command {command} was found on {line}{(line.Length > 1 ? $" (#{paths.Count + 1})" : "")}"); - paths.Add(line); - } + Logger.Debug($"Command {command} was found on {lines[0]} (with {lines.Length-1} more occurrences)"); + return lines.ToList(); } catch { if (updateEnv) return WhichMultiple(command, false); throw; } - return new Tuple>(true, paths); } public static Tuple Which(string command, bool updateEnv = true) { - var (found, paths) = WhichMultiple(command, updateEnv); - if (found && paths.Count > 0) return new Tuple(true, paths[0]); - else return new Tuple(false, ""); + var paths = WhichMultiple(command, updateEnv); + return new(paths.Any(), paths.Any() ? paths[0]: ""); } /// diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index 3aed3e2f7c..da5d07b004 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -138,7 +138,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("cargo").Item2]; + return new(CoreTools.WhichMultiple("cargo")); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 2b724db4e2..8fa4d42f8e 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -197,8 +197,8 @@ public override HashSet LoadAvailablePaths() { HashSet ChocoPaths = []; - var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); - if (SystemFound) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); + var SystemPaths = CoreTools.WhichMultiple("choco"); + if (SystemPaths.Any()) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); if (File.Exists(Path.Join(new_choco_path, "choco.exe"))) ChocoPaths.Add(Path.Join(new_choco_path, "choco.exe")); string EnvPath = Path.Join(Environment.GetEnvironmentVariable("ChocolateyInstall"), "choco.exe"); if (File.Exists(EnvPath)) ChocoPaths.Add(EnvPath); @@ -299,8 +299,8 @@ protected override ManagerStatus LoadManager() if (Settings.Get(Settings.K.UseSystemChocolatey) && !Settings.Get(Settings.K.TransferredSystemChocolatey)) { - var (SystemFound, SystemPaths) = CoreTools.WhichMultiple("choco"); - if (SystemFound && SystemPaths.Count > 0) + var SystemPaths = CoreTools.WhichMultiple("choco"); + if (SystemPaths.Count > 0) { string SysPath = SystemPaths.ElementAt(0); for (int idx = 1; idx < SystemPaths.Count; idx++) diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 29433ebf6f..770367e182 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -127,7 +127,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("dotnet").Item2]; + return new(CoreTools.WhichMultiple("dotnet")); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 2cc3248cd5..35410e70e6 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -189,8 +189,8 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - HashSet Paths = [.. CoreTools.WhichMultiple("npm.ps1").Item2]; - foreach (string Path in CoreTools.WhichMultiple("npm").Item2) + HashSet Paths = new(CoreTools.WhichMultiple("npm.ps1")); + foreach (string Path in CoreTools.WhichMultiple("npm")) { string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "npm.ps1"); if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index db9d82cc13..128e7ee9ee 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -304,10 +304,10 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - var (Found, FoundPaths) = CoreTools.WhichMultiple("python"); + var FoundPaths = CoreTools.WhichMultiple("python"); HashSet Paths = []; - if (Found) foreach (var Path in FoundPaths) Paths.Add(Path); + if (FoundPaths.Any()) foreach (var Path in FoundPaths) Paths.Add(Path); try { diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 01c3cc73ac..d1bfb4cb13 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -119,7 +119,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { string path = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); - HashSet paths = [.. CoreTools.WhichMultiple("powershell").Item2]; + HashSet paths = new(CoreTools.WhichMultiple("powershell")); if (File.Exists(path) && !paths.Contains(path, StringComparer.OrdinalIgnoreCase)) { paths.Add(path); diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index b5a667f563..30862c29af 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -119,7 +119,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("pwsh").Item2]; + return new(CoreTools.WhichMultiple("pwsh")); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index ab9c7495f2..ac4de80418 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -374,8 +374,8 @@ public override void RefreshPackageIndexes() public override HashSet LoadAvailablePaths() { - HashSet Paths = [.. CoreTools.WhichMultiple("scoop.ps1").Item2]; - foreach (string Path in CoreTools.WhichMultiple("scoop").Item2) + HashSet Paths = new(CoreTools.WhichMultiple("scoop.ps1")); + foreach (string Path in CoreTools.WhichMultiple("scoop")) { string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "scoop.ps1"); if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index d73f25967a..8ee0ecbaae 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -290,10 +290,10 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override HashSet LoadAvailablePaths() { - var (Found, FoundPaths) = CoreTools.WhichMultiple("vcpkg"); + var FoundPaths = CoreTools.WhichMultiple("vcpkg"); HashSet Paths = []; - if (Found) foreach (var Path in FoundPaths) Paths.Add(Path); + if (FoundPaths.Any()) foreach (var Path in FoundPaths) Paths.Add(Path); var (VcpkgRootFound, VcpkgRoot) = GetVcpkgRoot(); if (VcpkgRootFound) @@ -434,12 +434,12 @@ public static Tuple GetVcpkgRoot() { // Unfortunately, we can't use `GetVcpkgPath` or `GetManagerExecutablePath` // for this as it would become a bunch of functions calling each other - var (found, paths) = CoreTools.WhichMultiple("vcpkg"); + var paths = CoreTools.WhichMultiple("vcpkg"); foreach (string path in paths) { string dir = Path.GetDirectoryName(path); // Make sure the root is a valid root not just a random directory - if (found && Path.Exists($"{dir}\\triplets")) + if (Path.Exists($"{dir}\\triplets")) { vcpkgRoot = dir; break; diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 8bc25f3865..07fc5555e6 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -175,7 +175,7 @@ public ManagerSource GetLocalSource(string id) public override HashSet LoadAvailablePaths() { - return [.. CoreTools.WhichMultiple("winget").Item2]; + return new(CoreTools.WhichMultiple("winget")); } protected override ManagerStatus LoadManager() From 70d49d18d06052b20aab0accde4cbab805acb38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 4 Jul 2025 20:37:50 +0200 Subject: [PATCH 22/37] HashSets are unordered. This could cause weird bugs where paths get randomly changed when selecting the first appearance --- src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs | 4 ++-- .../PowerShell7.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 4 ++-- .../Manager/PackageManager.cs | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index da5d07b004..eed7f80338 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -136,9 +136,9 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return GetPackages(LoggableTaskType.ListInstalledPackages); } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - return new(CoreTools.WhichMultiple("cargo")); + return CoreTools.WhichMultiple("cargo"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 8fa4d42f8e..7bf2cc087b 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -193,9 +193,9 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() private static readonly string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); private static readonly string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - HashSet ChocoPaths = []; + List ChocoPaths = []; var SystemPaths = CoreTools.WhichMultiple("choco"); if (SystemPaths.Any()) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 770367e182..836c204f6d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -125,9 +125,9 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - return new(CoreTools.WhichMultiple("dotnet")); + return CoreTools.WhichMultiple("dotnet"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 35410e70e6..2869833d8f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -187,9 +187,9 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - HashSet Paths = new(CoreTools.WhichMultiple("npm.ps1")); + var Paths = CoreTools.WhichMultiple("npm.ps1"); foreach (string Path in CoreTools.WhichMultiple("npm")) { string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "npm.ps1"); diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 128e7ee9ee..36c2d3799f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -302,10 +302,10 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { var FoundPaths = CoreTools.WhichMultiple("python"); - HashSet Paths = []; + List Paths = []; if (FoundPaths.Any()) foreach (var Path in FoundPaths) Paths.Add(Path); diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index d1bfb4cb13..fa51b30dfc 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -116,10 +116,10 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override List LoadAvailablePaths() { string path = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); - HashSet paths = new(CoreTools.WhichMultiple("powershell")); + var paths = CoreTools.WhichMultiple("powershell"); if (File.Exists(path) && !paths.Contains(path, StringComparer.OrdinalIgnoreCase)) { paths.Add(path); diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index 30862c29af..c38c2ff937 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -117,9 +117,9 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - return new(CoreTools.WhichMultiple("pwsh")); + return CoreTools.WhichMultiple("pwsh"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index ac4de80418..2f10495c67 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -372,9 +372,9 @@ public override void RefreshPackageIndexes() logger.Close(p.ExitCode); } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - HashSet Paths = new(CoreTools.WhichMultiple("scoop.ps1")); + var Paths = CoreTools.WhichMultiple("scoop.ps1"); foreach (string Path in CoreTools.WhichMultiple("scoop")) { string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "scoop.ps1"); diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 8ee0ecbaae..eabe953c3a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -288,10 +288,10 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { var FoundPaths = CoreTools.WhichMultiple("vcpkg"); - HashSet Paths = []; + List Paths = []; if (FoundPaths.Any()) foreach (var Path in FoundPaths) Paths.Add(Path); diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 07fc5555e6..686c894d4d 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -173,9 +173,9 @@ public ManagerSource GetLocalSource(string id) return LocalPcSource; } - public override HashSet LoadAvailablePaths() + public override IReadOnlyList LoadAvailablePaths() { - return new(CoreTools.WhichMultiple("winget")); + return CoreTools.WhichMultiple("winget"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 61707ed66f..1ceacef7cc 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -122,11 +122,11 @@ public virtual void Initialize() /// For example, if you have three Pythons installed on your system, this would return those three Pythons. /// /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. - public abstract HashSet LoadAvailablePaths(); + public abstract IReadOnlyList LoadAvailablePaths(); public Tuple GetManagerExecutablePath() { - HashSet AvailablePaths = LoadAvailablePaths(); + var AvailablePaths = LoadAvailablePaths(); string? Path = Settings.GetDictionaryItem(Settings.K.ManagerPaths, Name); if (!SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths)) { From 618e760f92682459d741825853a7cd1495a1a3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 4 Jul 2025 20:48:18 +0200 Subject: [PATCH 23/37] Add LoadAvailablePaths to IPackageManager --- .../IPackageManager.cs | 6 ++++++ .../Manager/Classes/NullPackageManager.cs | 18 +----------------- .../ManagersPages/PackageManager.xaml.cs | 2 +- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs index 2eea3188b9..2b5e7612a8 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs @@ -68,5 +68,11 @@ public interface IPackageManager /// an example ///
public void AttemptFastRepair(); + + /// + /// Find all available executable files that apply to this package manager + /// + /// + public IReadOnlyList LoadAvailablePaths(); } } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs index 0fce81ae8d..62a4ca8f50 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs @@ -60,49 +60,33 @@ public NullPackageManager() }; Dependencies = []; } - public IReadOnlyList FindPackages(string query) => throw new NotImplementedException(); - public IReadOnlyList GetAvailableUpdates() => throw new NotImplementedException(); - public IReadOnlyList GetInstalledPackages() => throw new NotImplementedException(); - public void Initialize() => throw new NotImplementedException(); - public bool IsEnabled() => throw new NotImplementedException(); - public bool IsReady() => throw new NotImplementedException(); - public void RefreshPackageIndexes() => throw new NotImplementedException(); - public void AttemptFastRepair() => throw new NotImplementedException(); + public IReadOnlyList LoadAvailablePaths() => throw new NotImplementedException(); } internal class NullSourceHelper : IMultiSourceHelper { public ISourceFactory Factory => throw new NotImplementedException(); - public string[] GetAddSourceParameters(IManagerSource source) => throw new NotImplementedException(); - public string[] GetRemoveSourceParameters(IManagerSource source) => throw new NotImplementedException(); - public OperationVeredict GetAddOperationVeredict(IManagerSource source, int ReturnCode, string[] Output) => throw new NotImplementedException(); - public OperationVeredict GetRemoveOperationVeredict(IManagerSource source, int ReturnCode, string[] Output) => throw new NotImplementedException(); - public IReadOnlyList GetSources() => throw new NotImplementedException(); } internal sealed class NullPkgDetailsHelper : IPackageDetailsHelper { public void GetDetails(IPackageDetails details) => throw new NotImplementedException(); - public IReadOnlyList GetVersions(IPackage package) => throw new NotImplementedException(); - public CacheableIcon? GetIcon(IPackage package) => throw new NotImplementedException(); - public IReadOnlyList GetScreenshots(IPackage package) => throw new NotImplementedException(); - public string? GetInstallLocation(IPackage package) => throw new NotImplementedException(); } diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index b75a5f04ea..4f4b72f889 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -89,7 +89,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ManagerLogsLabel.Text = CoreTools.Translate("View {0} logs", Manager.DisplayName); - HashSet Paths = ((PackageManager)Manager).LoadAvailablePaths(); + var Paths = Manager.LoadAvailablePaths(); var (CurrentlyExists, CurrentPath) = ((PackageManager)Manager).GetManagerExecutablePath(); foreach (string Path in Paths) { From 17de48c6383b18b3c996f51bc9b3652e5428e43a Mon Sep 17 00:00:00 2001 From: mrixner <100489307+mrixner@users.noreply.github.com> Date: Fri, 4 Jul 2025 12:25:08 -0700 Subject: [PATCH 24/37] Update Scoop.cs --- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 2f10495c67..dc8e3861ef 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -374,16 +374,7 @@ public override void RefreshPackageIndexes() public override IReadOnlyList LoadAvailablePaths() { - var Paths = CoreTools.WhichMultiple("scoop.ps1"); - foreach (string Path in CoreTools.WhichMultiple("scoop")) - { - string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "scoop.ps1"); - if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) - { - Paths.Add(ps1Path); - } - } - return Paths; + return CoreTools.WhichMultiple("scoop.ps1"); } From a7d0410649e02ddabae842ee228bda50a33047b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 00:17:13 +0200 Subject: [PATCH 25/37] Migrate Manager.Properties.ExecutableCallArguments to Manager.Status.ExecutableCallArguments (so they can be loaded dynamically) --- .../ManagerProperties.cs | 2 +- .../ManagerStatus.cs | 1 + .../Cargo.cs | 5 ++--- .../Chocolatey.cs | 6 +++--- .../Helpers/ChocolateyDetailsHelper.cs | 2 +- .../Helpers/ChocolateySourceHelper.cs | 2 +- .../DotNet.cs | 4 ++-- .../Helpers/NpmPkgDetailsHelper.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 16 ++++++++-------- .../Helpers/PipPkgDetailsHelper.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 10 +++++----- .../Helpers/PowerShellSourceHelper.cs | 2 +- .../PowerShell.cs | 8 ++++---- .../Helpers/PowerShell7SourceHelper.cs | 2 +- .../PowerShell7.cs | 4 ++-- .../Helpers/ScoopPkgDetailsHelper.cs | 2 +- .../Helpers/ScoopSourceHelper.cs | 2 +- .../Scoop.cs | 16 ++++++++-------- .../Vcpkg.cs | 13 +++++++------ .../ClientHelpers/BundledWinGetHelper.cs | 16 ++++++++-------- .../ClientHelpers/NativeWinGetHelper.cs | 2 +- .../WinGet.cs | 6 +++--- .../PackageOperations.cs | 4 ++-- .../SourceOperations.cs | 8 ++++---- .../Manager/Classes/NullPackageManager.cs | 2 +- .../Manager/PackageManager.cs | 2 +- .../ManagersPages/PackageManager.xaml.cs | 2 +- 27 files changed, 73 insertions(+), 72 deletions(-) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/ManagerProperties.cs b/src/UniGetUI.PAckageEngine.Interfaces/ManagerProperties.cs index 56eac6ffc7..aff3376d32 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/ManagerProperties.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/ManagerProperties.cs @@ -11,7 +11,7 @@ public struct ManagerProperties public string Description { get; set; } = "Unset"; public IconType IconId { get; set; } = IconType.Help; public string ColorIconId { get; set; } = "Unset"; - public string ExecutableCallArgs { get; set; } = "Unset"; + // public string ExecutableCallArgs { get; set; } = "Unset"; public string ExecutableFriendlyName { get; set; } = "Unset"; public string InstallVerb { get; set; } = "Unset"; public string UpdateVerb { get; set; } = "Unset"; diff --git a/src/UniGetUI.PackageEngine.Enums/ManagerStatus.cs b/src/UniGetUI.PackageEngine.Enums/ManagerStatus.cs index 42a95e916c..5596a77766 100644 --- a/src/UniGetUI.PackageEngine.Enums/ManagerStatus.cs +++ b/src/UniGetUI.PackageEngine.Enums/ManagerStatus.cs @@ -5,6 +5,7 @@ public struct ManagerStatus public string Version = ""; public bool Found = false; public string ExecutablePath = ""; + public string ExecutableCallArgs { get; set; } = "Unset"; public ManagerStatus() { } } diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index eed7f80338..cd80afff1d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -64,7 +64,6 @@ public Cargo() InstallVerb = "binstall", UninstallVerb = "uninstall", UpdateVerb = "binstall", - ExecutableCallArgs = "", DefaultSource = cratesIo, KnownSources = [cratesIo] }; @@ -158,7 +157,7 @@ protected override ManagerStatus LoadManager() Logger.Error("cargo version error: " + error); } - return new() { ExecutablePath = executablePath, Found = found, Version = version }; + return new() { ExecutablePath = executablePath, Found = found, Version = version, ExecutableCallArgs = ""}; } private IReadOnlyList GetPackages(LoggableTaskType taskType) @@ -209,7 +208,7 @@ private Process GetProcess(string fileName, string extraArguments) StartInfo = new ProcessStartInfo { FileName = fileName, - Arguments = Properties.ExecutableCallArgs + " " + extraArguments, + Arguments = Status.ExecutableCallArgs + " " + extraArguments, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 7bf2cc087b..7768d80caf 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -54,7 +54,6 @@ public Chocolatey() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "upgrade", - ExecutableCallArgs = "", KnownSources = [new ManagerSource(this, "community", new Uri("https://community.chocolatey.org/api/v2/"))], DefaultSource = new ManagerSource(this, "community", new Uri("https://community.chocolatey.org/api/v2/")), @@ -89,7 +88,7 @@ protected override IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " outdated " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " outdated " + GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -143,7 +142,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " list " + GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -314,6 +313,7 @@ protected override ManagerStatus LoadManager() } (status.Found, status.ExecutablePath) = GetManagerExecutablePath(); + status.ExecutableCallArgs = ""; if (!status.Found) { diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateyDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateyDetailsHelper.cs index 762f8f19d4..a90ec78369 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateyDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateyDetailsHelper.cs @@ -19,7 +19,7 @@ protected override IReadOnlyList GetInstallableVersions_UnSafe(IPackage StartInfo = new ProcessStartInfo { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + $" search {package.Id} --exact --all-versions " + Chocolatey.GetProxyArgument(), + Arguments = Manager.Status.ExecutableCallArgs + $" search {package.Id} --exact --all-versions " + Chocolatey.GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateySourceHelper.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateySourceHelper.cs index a2ab4fd9da..a6cb717f1d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateySourceHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Helpers/ChocolateySourceHelper.cs @@ -40,7 +40,7 @@ protected override IReadOnlyList GetSources_UnSafe() StartInfo = new() { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " source list " + Chocolatey.GetProxyArgument(), + Arguments = Manager.Status.ExecutableCallArgs + " source list " + Chocolatey.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 836c204f6d..5aedd25efa 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -47,7 +47,6 @@ public DotNet() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "update", - ExecutableCallArgs = "tool", DefaultSource = new ManagerSource(this, "nuget.org", new Uri("https://www.nuget.org/api/v2")), KnownSources = [new ManagerSource(this, "nuget.org", new Uri("https://www.nuget.org/api/v2"))], }; @@ -66,7 +65,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list" + (options.Scope == PackageScope.Global ? " --global" : ""), + Arguments = Status.ExecutableCallArgs + " list" + (options.Scope == PackageScope.Global ? " --global" : ""), RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -137,6 +136,7 @@ protected override ManagerStatus LoadManager() var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; + status.ExecutableCallArgs = "tool"; if (!status.Found) { diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs index 1e4b78223a..bc533b6fbc 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs @@ -26,7 +26,7 @@ protected override void GetDetails_UnSafe(IPackageDetails details) p.StartInfo = new ProcessStartInfo { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + details.Package.Id + " --json", + Arguments = Manager.Status.ExecutableCallArgs + " show " + details.Package.Id + " --json", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -99,7 +99,7 @@ protected override IReadOnlyList GetInstallableVersions_UnSafe(IPackage { FileName = Manager.Status.ExecutablePath, Arguments = - Manager.Properties.ExecutableCallArgs + " show " + package.Id + " versions --json", + Manager.Status.ExecutableCallArgs + " show " + package.Id + " versions --json", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 2869833d8f..a93c588432 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -37,7 +37,6 @@ public Npm() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "install", - ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", DefaultSource = new ManagerSource(this, "npm", new Uri("https://www.npmjs.com/")), KnownSources = [new ManagerSource(this, "npm", new Uri("https://www.npmjs.com/"))], @@ -54,7 +53,7 @@ protected override IReadOnlyList FindPackages_UnSafe(string query) StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " search \"" + query + "\" --json", + Arguments = Status.ExecutableCallArgs + " search \"" + query + "\" --json", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -106,7 +105,7 @@ protected override IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " outdated --json" + (options.Scope == PackageScope.Global ? " --global" : ""), + Arguments = Status.ExecutableCallArgs + " outdated --json" + (options.Scope == PackageScope.Global ? " --global" : ""), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -152,7 +151,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list --json" + (options.Scope == PackageScope.Global ? " --global" : ""), + Arguments = Status.ExecutableCallArgs + " list --json" + (options.Scope == PackageScope.Global ? " --global" : ""), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -189,8 +188,8 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override IReadOnlyList LoadAvailablePaths() { - var Paths = CoreTools.WhichMultiple("npm.ps1"); - foreach (string Path in CoreTools.WhichMultiple("npm")) + /*var Paths =*/ return CoreTools.WhichMultiple("npm.ps1"); + /*foreach (string Path in CoreTools.WhichMultiple("npm")) { string ps1Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Path) ?? "", "npm.ps1"); if (File.Exists(ps1Path) && !Paths.Contains(ps1Path, StringComparer.OrdinalIgnoreCase)) @@ -198,7 +197,7 @@ public override IReadOnlyList LoadAvailablePaths() Paths.Add(ps1Path); } } - return Paths; + return Paths;*/ } protected override ManagerStatus LoadManager() @@ -206,6 +205,7 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", Found = GetManagerExecutablePath().Item1 }; @@ -219,7 +219,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " --version", + Arguments = Status.ExecutableCallArgs + " --version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs index 525980ccbb..8cec49261b 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs @@ -101,7 +101,7 @@ protected override IReadOnlyList GetInstallableVersions_UnSafe(IPackage StartInfo = new ProcessStartInfo { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " index versions " + package.Id + " " + Pip.GetProxyArgument(), + Arguments = Manager.Status.ExecutableCallArgs + " index versions " + package.Id + " " + Pip.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardInput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 36c2d3799f..0462c7d44c 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -64,7 +64,6 @@ public Pip() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "install --upgrade", - ExecutableCallArgs = " -m pip", DefaultSource = new ManagerSource(this, "pip", new Uri("https://pypi.org/")), KnownSources = [new ManagerSource(this, "pip", new Uri("https://pypi.org/"))], @@ -103,7 +102,7 @@ protected override IReadOnlyList FindPackages_UnSafe(string query) StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " install parse_pip_search " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " install parse_pip_search " + GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -186,7 +185,7 @@ protected override IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list --outdated " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " list --outdated " + GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -248,7 +247,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " list " + GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -342,6 +341,7 @@ protected override ManagerStatus LoadManager() var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; + status.ExecutableCallArgs = " -m pip"; if (!status.Found) { @@ -353,7 +353,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " --version " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " --version " + GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/Helpers/PowerShellSourceHelper.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/Helpers/PowerShellSourceHelper.cs index 24aff9c25e..9c3d8ae15a 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/Helpers/PowerShellSourceHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/Helpers/PowerShellSourceHelper.cs @@ -47,7 +47,7 @@ protected override IReadOnlyList GetSources_UnSafe() StartInfo = new() { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " Get-PSRepository", + Arguments = Manager.Status.ExecutableCallArgs + " Get-PSRepository", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index fa51b30dfc..6c8b50b6d7 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -47,7 +47,6 @@ public PowerShell() InstallVerb = "Install-Module", UninstallVerb = "Uninstall-Module", UpdateVerb = "Update-Module", - ExecutableCallArgs = " -NoProfile -Command", KnownSources = [new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")), new ManagerSource(this, "PoshTestGallery", new Uri("https://www.poshtestgallery.com/api/v2"))], DefaultSource = new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")), @@ -65,7 +64,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " Get-InstalledModule", + Arguments = Status.ExecutableCallArgs + " Get-InstalledModule", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -134,7 +133,8 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { ExecutablePath = path, - Found = found + Found = found, + ExecutableCallArgs = " -NoProfile -Command", }; if (!status.Found) @@ -147,7 +147,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " \"echo $PSVersionTable\"", + Arguments = Status.ExecutableCallArgs + " \"echo $PSVersionTable\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/Helpers/PowerShell7SourceHelper.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/Helpers/PowerShell7SourceHelper.cs index 2cf616e9bf..96b767cd2c 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/Helpers/PowerShell7SourceHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/Helpers/PowerShell7SourceHelper.cs @@ -47,7 +47,7 @@ protected override IReadOnlyList GetSources_UnSafe() StartInfo = new() { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " \"Get-PSRepository | Format-Table -Property " + + Arguments = Manager.Status.ExecutableCallArgs + " \"Get-PSRepository | Format-Table -Property " + "Name,@{N='SourceLocation';E={If ($_.Uri) {$_.Uri.AbsoluteUri} Else {$_.SourceLocation}}}\"", RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index c38c2ff937..538d00621f 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -48,7 +48,6 @@ public PowerShell7() InstallVerb = "Install-PSResource", UninstallVerb = "Uninstall-PSResource", UpdateVerb = "Update-PSResource", - ExecutableCallArgs = " -NoProfile -Command", KnownSources = [new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")), new ManagerSource(this, "PoshTestGallery", new Uri("https://www.poshtestgallery.com/api/v2"))], DefaultSource = new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")), @@ -66,7 +65,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " \"Get-InstalledPSResource | Format-Table -Property Name,Version,Repository\"", + Arguments = Status.ExecutableCallArgs + " \"Get-InstalledPSResource | Format-Table -Property Name,Version,Repository\"", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, @@ -130,6 +129,7 @@ protected override ManagerStatus LoadManager() { ExecutablePath = path, Found = found, + ExecutableCallArgs = " -NoProfile -Command", }; if (!status.Found) diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs index 0db1abbf5b..a67eae75ce 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs @@ -44,7 +44,7 @@ protected override void GetDetails_UnSafe(IPackageDetails details) StartInfo = new ProcessStartInfo { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " cat " + packageId, + Arguments = Manager.Status.ExecutableCallArgs + " cat " + packageId, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopSourceHelper.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopSourceHelper.cs index ef34441dff..961239d364 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopSourceHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopSourceHelper.cs @@ -40,7 +40,7 @@ protected override IReadOnlyList GetSources_UnSafe() StartInfo = new ProcessStartInfo { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " bucket list", + Arguments = Manager.Status.ExecutableCallArgs + " bucket list", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index dc8e3861ef..fcba2a478e 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -70,7 +70,6 @@ public Scoop() Description = CoreTools.Translate("Great repository of unknown but useful utilities and other interesting packages.
Contains: Utilities, Command-line programs, General Software (extras bucket required)"), IconId = IconType.Scoop, ColorIconId = "scoop_color", - ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", ExecutableFriendlyName = "scoop", InstallVerb = "install", UpdateVerb = "update", @@ -105,7 +104,7 @@ protected override IReadOnlyList FindPackages_UnSafe(string query) StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " install main/scoop-search", + Arguments = Status.ExecutableCallArgs + " install main/scoop-search", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -200,7 +199,7 @@ protected override IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " status", + Arguments = Status.ExecutableCallArgs + " status", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -279,7 +278,7 @@ private IReadOnlyList _getInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list", + Arguments = Status.ExecutableCallArgs + " list", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -355,7 +354,7 @@ public override void RefreshPackageIndexes() ProcessStartInfo StartInfo = new() { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " update", + Arguments = Status.ExecutableCallArgs + " update", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -391,7 +390,8 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { ExecutablePath = path, - Found = GetManagerExecutablePath().Item1 + ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", + Found = GetManagerExecutablePath().Item1, }; Process process = new() @@ -399,7 +399,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " --version", + Arguments = Status.ExecutableCallArgs + " --version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -430,7 +430,7 @@ private async void RunCleanup() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " " + command, + Arguments = Status.ExecutableCallArgs + " " + command, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index eabe953c3a..627f9d6995 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -62,7 +62,6 @@ public Vcpkg() { "x86-windows", new ManagerSource(this, "x86-windows", URI_VCPKG_IO) } }; - string vcpkgRoot = Settings.GetValue(Settings.K.CustomVcpkgRoot); Properties = new ManagerProperties { Name = "vcpkg", @@ -74,7 +73,6 @@ public Vcpkg() InstallVerb = "install", UninstallVerb = "remove", UpdateVerb = "upgrade", - ExecutableCallArgs = vcpkgRoot == "" ? "" : $" --vcpkg-root=\"{vcpkgRoot}\"", DefaultSource = new ManagerSource(this, DefaultTriplet, URI_VCPKG_IO), KnownSources = [.. TripletSourceMap.Values], }; @@ -93,7 +91,7 @@ protected override IReadOnlyList FindPackages_UnSafe(string query) StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + $" search \"{CoreTools.EnsureSafeQueryString(query)}\"", + Arguments = Status.ExecutableCallArgs + $" search \"{CoreTools.EnsureSafeQueryString(query)}\"", // vcpkg has an --x-json flag that would list installed packages in JSON, but it doesn't work for this call (as of 2024-09-30-ab8988503c7cffabfd440b243a383c0a352a023d) // TODO: Perhaps use --x-json when it is fixed RedirectStandardOutput = true, @@ -176,7 +174,7 @@ protected override IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " update", + Arguments = Status.ExecutableCallArgs + " update", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -230,7 +228,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " list", + Arguments = Status.ExecutableCallArgs + " list", // vcpkg has an --x-json flag that would list installed packages in JSON, but it's experimental // TODO: Once --x-json is stable migrate to --x-json RedirectStandardOutput = true, @@ -344,7 +342,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " version", + Arguments = Status.ExecutableCallArgs + " version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -357,6 +355,9 @@ protected override ManagerStatus LoadManager() status.Version = process.StandardOutput.ReadLine()?.Trim() ?? ""; status.Version += $"\n%VCPKG_ROOT% = {rootPath}"; + string vcpkgRoot = Settings.GetValue(Settings.K.CustomVcpkgRoot); + status.ExecutableCallArgs = vcpkgRoot == "" ? "" : $" --vcpkg-root=\"{vcpkgRoot}\""; + return status; } diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs index f00d85c1eb..5c3f3a9868 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs @@ -28,7 +28,7 @@ public IReadOnlyList GetAvailableUpdates_UnSafe() StartInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + + Arguments = Manager.Status.ExecutableCallArgs + " update --include-unknown --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, @@ -140,7 +140,7 @@ public IReadOnlyList GetInstalledPackages_UnSafe() StartInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " list --accept-source-agreements " + WinGet.GetProxyArgument(), + Arguments = Manager.Status.ExecutableCallArgs + " list --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -239,7 +239,7 @@ public IReadOnlyList FindPackages_UnSafe(string query) StartInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " search \"" + query + + Arguments = Manager.Status.ExecutableCallArgs + " search \"" + query + "\" --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, @@ -337,7 +337,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) ProcessStartInfo startInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + + Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --locale " + System.Globalization.CultureInfo.CurrentCulture + " " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, @@ -385,7 +385,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) startInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + + Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --locale en-US " + " " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, @@ -429,7 +429,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) startInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + + Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements " + " " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, @@ -574,7 +574,7 @@ public IReadOnlyList GetInstallableVersions_Unsafe(IPackage package) StartInfo = new ProcessStartInfo { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(package) + + Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(package) + $" --versions --accept-source-agreements " + " " + WinGet.GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, @@ -629,7 +629,7 @@ public IReadOnlyList GetSources_UnSafe() StartInfo = new() { FileName = Manager.Status.ExecutablePath, - Arguments = Manager.Properties.ExecutableCallArgs + " source list " + WinGet.GetProxyArgument(), + Arguments = Manager.Status.ExecutableCallArgs + " source list " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs index 763fb77c58..8a3a93a190 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs @@ -359,7 +359,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) ProcessStartInfo startInfo = new() { FileName = Manager.WinGetBundledPath, - Arguments = Manager.Properties.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + + Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --source " + details.Package.Source.Name, RedirectStandardOutput = true, diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 686c894d4d..8c4f86e4ab 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -71,7 +71,6 @@ public WinGet() InstallVerb = "install", UninstallVerb = "uninstall", UpdateVerb = "update", - ExecutableCallArgs = "", KnownSources = [ new ManagerSource(this, "winget", new Uri("https://cdn.winget.microsoft.com/cache")), new ManagerSource(this, "msstore", new Uri("https://storeedgefd.dsx.mp.microsoft.com/v9.0")) ], DefaultSource = new ManagerSource(this, "winget", new Uri("https://cdn.winget.microsoft.com/cache")) @@ -186,6 +185,7 @@ protected override ManagerStatus LoadManager() var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; + status.ExecutableCallArgs = ""; status.Found = found; if (!status.Found) @@ -212,7 +212,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " --version", + Arguments = Status.ExecutableCallArgs + " --version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -353,7 +353,7 @@ public override void RefreshPackageIndexes() StartInfo = new ProcessStartInfo { FileName = Status.ExecutablePath, - Arguments = Properties.ExecutableCallArgs + " source update --disable-interactivity " + GetProxyArgument(), + Arguments = Status.ExecutableCallArgs + " source update --disable-interactivity " + GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Operations/PackageOperations.cs b/src/UniGetUI.PackageEngine.Operations/PackageOperations.cs index 0e9e35ba6f..b37c8f589c 100644 --- a/src/UniGetUI.PackageEngine.Operations/PackageOperations.cs +++ b/src/UniGetUI.PackageEngine.Operations/PackageOperations.cs @@ -96,12 +96,12 @@ protected sealed override void PrepareProcessStartInfo() } FileName = CoreData.ElevatorPath; - Arguments = $"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Properties.ExecutableCallArgs} {operation_args}"; + Arguments = $"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Status.ExecutableCallArgs} {operation_args}"; } else { FileName = Package.Manager.Status.ExecutablePath; - Arguments = $"{Package.Manager.Properties.ExecutableCallArgs} {operation_args}"; + Arguments = $"{Package.Manager.Status.ExecutableCallArgs} {operation_args}"; } if (IsAdmin && Package.Manager is WinGet) diff --git a/src/UniGetUI.PackageEngine.Operations/SourceOperations.cs b/src/UniGetUI.PackageEngine.Operations/SourceOperations.cs index 0bd01ed287..2916f02b09 100644 --- a/src/UniGetUI.PackageEngine.Operations/SourceOperations.cs +++ b/src/UniGetUI.PackageEngine.Operations/SourceOperations.cs @@ -62,13 +62,13 @@ protected override void PrepareProcessStartInfo() admin = true; process.StartInfo.FileName = CoreData.ElevatorPath; - process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetAddSourceParameters(Source)); + process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Status.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetAddSourceParameters(Source)); } else { process.StartInfo.FileName = Source.Manager.Status.ExecutablePath; - process.StartInfo.Arguments = Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetAddSourceParameters(Source)); + process.StartInfo.Arguments = Source.Manager.Status.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetAddSourceParameters(Source)); } ApplyCapabilities(admin, false, false, null); @@ -115,12 +115,12 @@ protected override void PrepareProcessStartInfo() admin = true; process.StartInfo.FileName = CoreData.ElevatorPath; - process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetRemoveSourceParameters(Source)); + process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Status.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetRemoveSourceParameters(Source)); } else { process.StartInfo.FileName = Source.Manager.Status.ExecutablePath; - process.StartInfo.Arguments = Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetRemoveSourceParameters(Source)); + process.StartInfo.Arguments = Source.Manager.Status.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetRemoveSourceParameters(Source)); } ApplyCapabilities(admin, false, false, null); } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs index 62a4ca8f50..6d9da1e0dc 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs @@ -43,7 +43,6 @@ public NullPackageManager() Description = "Unset", IconId = IconType.Help, ColorIconId = "Unset", - ExecutableCallArgs = "Unset", ExecutableFriendlyName = "Unset", InstallVerb = "Unset", UpdateVerb = "Unset", @@ -55,6 +54,7 @@ public NullPackageManager() Status = new ManagerStatus { ExecutablePath = "C:/file.exe", + ExecutableCallArgs = "Unset", Found = false, Version = "0" }; diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 1ceacef7cc..49f0d49133 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -96,7 +96,7 @@ public virtual void Initialize() (Status.Found ? "\nâ–ˆ Fancy exe name: " + Properties.ExecutableFriendlyName + "\nâ–ˆ Executable path: " + Status.ExecutablePath + - "\nâ–ˆ Call arguments: " + Properties.ExecutableCallArgs + + "\nâ–ˆ Call arguments: " + Status.ExecutableCallArgs + "\nâ–ˆ Version: \n" + "â–ˆ " + Status.Version.Replace("\n", "\nâ–ˆ ") : "\nâ–ˆ THE MANAGER WAS NOT FOUND. PERHAPS IT IS NOT " + diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index 4f4b72f889..f27ce6dbb2 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -70,7 +70,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e) LongVersionTextBlock.Text = Manager.Status.Version + "\n"; SetManagerStatus(false); - LocationLabel.Text = Manager.Status.ExecutablePath + Manager.Properties.ExecutableCallArgs; + LocationLabel.Text = Manager.Status.ExecutablePath + Manager.Status.ExecutableCallArgs; if (LocationLabel.Text == "") LocationLabel.Text = CoreTools.Translate("The executable file for {0} was not found", Manager.DisplayName); EnableManager.KeyName = Manager.Name; EnableManager.Text = CoreTools.Translate("Enable {pm}").Replace("{pm}", Manager.DisplayName); From 9c121de50e8ad6377f12bec8b00bf61288d7d856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 01:04:22 +0200 Subject: [PATCH 26/37] Improvements to how arguments are called --- src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 8 +++++--- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 4 ++-- .../PowerShell.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 2 +- src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 2 +- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 5aedd25efa..5501a9d788 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -136,7 +136,7 @@ protected override ManagerStatus LoadManager() var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; - status.ExecutableCallArgs = "tool"; + status.ExecutableCallArgs = "tool "; if (!status.Found) { @@ -148,7 +148,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = "tool -h", + Arguments = status.ExecutableCallArgs + "-h", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index a93c588432..38fe713065 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -202,11 +202,13 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { + var (found, executable) = GetManagerExecutablePath(); + ManagerStatus status = new() { ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), - ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", - Found = GetManagerExecutablePath().Item1 + ExecutableCallArgs = $"-NoProfile -ExecutionPolicy Bypass -Command \"{executable.Replace(" ", "` ")}\" ", + Found = found }; if (!status.Found) @@ -219,7 +221,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " --version", + Arguments = status.ExecutableCallArgs + "--version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 0462c7d44c..ff78c0d280 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -341,7 +341,7 @@ protected override ManagerStatus LoadManager() var (found, path) = GetManagerExecutablePath(); status.ExecutablePath = path; status.Found = found; - status.ExecutableCallArgs = " -m pip"; + status.ExecutableCallArgs = "-m pip "; if (!status.Found) { @@ -353,7 +353,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " --version " + GetProxyArgument(), + Arguments = status.ExecutableCallArgs + "--version " + GetProxyArgument(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 6c8b50b6d7..b53225a58f 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -147,7 +147,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " \"echo $PSVersionTable\"", + Arguments = status.ExecutableCallArgs + " \"echo $PSVersionTable\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index fcba2a478e..74767be781 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -390,7 +390,7 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { ExecutablePath = path, - ExecutableCallArgs = $" -NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\"", + ExecutableCallArgs = $"-NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\" ", Found = GetManagerExecutablePath().Item1, }; @@ -399,7 +399,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " --version", + Arguments = status.ExecutableCallArgs + "--version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 627f9d6995..5431325e28 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -342,7 +342,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " version", + Arguments = status.ExecutableCallArgs + " version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 8c4f86e4ab..10e8f5e198 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -212,7 +212,7 @@ protected override ManagerStatus LoadManager() StartInfo = new ProcessStartInfo { FileName = status.ExecutablePath, - Arguments = Status.ExecutableCallArgs + " --version", + Arguments = status.ExecutableCallArgs + " --version", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, From 20bf789cec5c1b13e87f29ac590c11031ed477b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:21:47 +0200 Subject: [PATCH 27/37] Move powershell5 exe name to CoreData --- src/UniGetUI.Core.Data/CoreData.cs | 1 + src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 3 ++- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 2 +- .../PowerShell.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 6 +++--- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 2 +- src/UniGetUI/Pages/DialogPages/DialogHelper_Generic.cs | 4 +--- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/UniGetUI.Core.Data/CoreData.cs b/src/UniGetUI.Core.Data/CoreData.cs index 72dcc20099..c30fbc2641 100644 --- a/src/UniGetUI.Core.Data/CoreData.cs +++ b/src/UniGetUI.Core.Data/CoreData.cs @@ -390,5 +390,6 @@ private static int GetCodePage() } } + public static readonly string PowerShell5 = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); } } diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index cd80afff1d..8a67118c76 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -29,14 +29,14 @@ public Cargo() // cargo-update is required to check for installed and upgradable packages new ManagerDependency( "cargo-update", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {cargo install cargo-update; if ($error.count -ne 0){pause}}\"", "cargo install cargo-update", async () => (await CoreTools.WhichAsync("cargo-install-update.exe")).Item1), // Cargo-binstall is required to install and update cargo binaries new ManagerDependency( "cargo-binstall", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {Set-ExecutionPolicy Unrestricted -Scope Process; iex (iwr \\\"https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.ps1\\\").Content; if ($error.count -ne 0){pause}}\"", "Set-ExecutionPolicy Unrestricted -Scope Process; iex (iwr \"https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.ps1\").Content", async () => (await CoreTools.WhichAsync("cargo-binstall.exe")).Item1) diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 38fe713065..6c087204ce 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Text.Json.Nodes; +using UniGetUI.Core.Data; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.Classes.Manager; @@ -206,7 +207,7 @@ protected override ManagerStatus LoadManager() ManagerStatus status = new() { - ExecutablePath = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + ExecutablePath = CoreData.PowerShell5, ExecutableCallArgs = $"-NoProfile -ExecutionPolicy Bypass -Command \"{executable.Replace(" ", "` ")}\" ", Found = found }; diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index ff78c0d280..8d9ad57b53 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -24,7 +24,7 @@ public Pip() // parse_pip_search is required for pip package finding to work new ManagerDependency( "parse-pip-search", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {python.exe " + "-m pip install parse_pip_search; if($error.count -ne 0){pause}}\"", "python -m pip install parse_pip_search", diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index b53225a58f..1b13194fa2 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -117,7 +117,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override List LoadAvailablePaths() { - string path = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); + string path = CoreData.PowerShell5; var paths = CoreTools.WhichMultiple("powershell"); if (File.Exists(path) && !paths.Contains(path, StringComparer.OrdinalIgnoreCase)) { diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 74767be781..1318805863 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -32,14 +32,14 @@ public Scoop() // Scoop-Search is required for search to work new ManagerDependency( "Scoop-Search", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {scoop install main/scoop-search; if($error.count -ne 0){pause}}\"", "scoop install main/scoop-search", async () => (await CoreTools.WhichAsync("scoop-search.exe")).Item1), // GIT is required for scoop updates to work new ManagerDependency( "Git", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {scoop install main/git; if($error.count -ne 0){pause}}\"", "scoop install main/git", async () => (await CoreTools.WhichAsync("git.exe")).Item1) @@ -379,7 +379,7 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - string path = Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"); + string path = CoreData.PowerShell5; var pwsh7 = CoreTools.Which("pwsh.exe"); if (pwsh7.Item1) { diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 5431325e28..3e87c9118e 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -30,7 +30,7 @@ public Vcpkg() // GIT is required for vcpkg updates to work new ManagerDependency( "Git", - Path.Join(Environment.SystemDirectory, "windowspowershell\\v1.0\\powershell.exe"), + CoreData.PowerShell5, "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {winget install --id Git.Git --exact " + "--source winget --accept-source-agreements --accept-package-agreements --force; if($error.count -ne 0){pause}}\"", "winget install --id Git.Git --exact --source winget", diff --git a/src/UniGetUI/Pages/DialogPages/DialogHelper_Generic.cs b/src/UniGetUI/Pages/DialogPages/DialogHelper_Generic.cs index 1ab9f7465f..bc4e3d9bb4 100644 --- a/src/UniGetUI/Pages/DialogPages/DialogHelper_Generic.cs +++ b/src/UniGetUI/Pages/DialogPages/DialogHelper_Generic.cs @@ -399,9 +399,7 @@ public static async void HandleBrokenWinGet() { StartInfo = new() { - FileName = - Path.Join(Environment.SystemDirectory, - "windowspowershell\\v1.0\\powershell.exe"), + FileName = CoreData.PowerShell5, Arguments = "-ExecutionPolicy Bypass -NoLogo -NoProfile -Command \"& {" + "cmd.exe /C \"rmdir /Q /S `\"%temp%\\WinGet`\"\"; " + From 74aa11f75235b292c69a7c8f11a858eb37190583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:30:02 +0200 Subject: [PATCH 28/37] Simplification of ManagerStatus creation --- src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 1 + .../Chocolatey.cs | 6 ++---- .../DotNet.cs | 11 ++++++----- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 7 ++----- .../PowerShell.cs | 1 + src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 13 ++++++++++--- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 6 +++--- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index 8a67118c76..6c8bd32f3c 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -2,6 +2,7 @@ using System.Text; using System.Text.RegularExpressions; using UniGetUI.Core.Classes; +using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; using UniGetUI.PackageEngine.Classes.Manager; diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 7768d80caf..2e8dfc07fe 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -207,8 +207,6 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - ManagerStatus status = new(); - if (!Directory.Exists(old_choco_path)) { Logger.Debug("Old chocolatey path does not exist, not migrating Chocolatey"); @@ -312,8 +310,8 @@ protected override ManagerStatus LoadManager() } } - (status.Found, status.ExecutablePath) = GetManagerExecutablePath(); - status.ExecutableCallArgs = ""; + var (found, executable) = GetManagerExecutablePath(); + ManagerStatus status = new() { Found = found, ExecutablePath = executable, ExecutableCallArgs = "", }; if (!status.Found) { diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 5501a9d788..4e12e78cc0 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -131,12 +131,13 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - ManagerStatus status = new(); - var (found, path) = GetManagerExecutablePath(); - status.ExecutablePath = path; - status.Found = found; - status.ExecutableCallArgs = "tool "; + ManagerStatus status = new() + { + ExecutablePath = path, + Found = found, + ExecutableCallArgs = "tool " + }; if (!status.Found) { diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 8d9ad57b53..8e4bc450d2 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -336,12 +336,9 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - ManagerStatus status = new(); - var (found, path) = GetManagerExecutablePath(); - status.ExecutablePath = path; - status.Found = found; - status.ExecutableCallArgs = "-m pip "; + + ManagerStatus status = new() { ExecutablePath = path, Found = found, ExecutableCallArgs = "-m pip " }; if (!status.Found) { diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 1b13194fa2..384a8db2bd 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using System.Text; using System.Text.RegularExpressions; +using UniGetUI.Core.Data; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.Classes.Manager; diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 1318805863..198180fb50 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using System.Text.RegularExpressions; using UniGetUI.Core.Classes; +using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; @@ -381,19 +382,26 @@ protected override ManagerStatus LoadManager() { string path = CoreData.PowerShell5; var pwsh7 = CoreTools.Which("pwsh.exe"); + if (pwsh7.Item1) { Logger.Info("Scoop found PowerShell7, PowerShell7 will be used..."); path = pwsh7.Item2; } + var (found, executable) = GetManagerExecutablePath(); ManagerStatus status = new() { ExecutablePath = path, - ExecutableCallArgs = $"-NoProfile -ExecutionPolicy Bypass -Command \"& \\\"{GetManagerExecutablePath().Item2}\\\"\" ", - Found = GetManagerExecutablePath().Item1, + ExecutableCallArgs = $"-NoProfile -ExecutionPolicy Bypass -Command \"{executable.Replace(" ", "` ")}\" ", + Found = found, }; + if (!status.Found) + { + return status; + } + Process process = new() { StartInfo = new ProcessStartInfo @@ -409,7 +417,6 @@ protected override ManagerStatus LoadManager() }; process.Start(); status.Version = process.StandardOutput.ReadToEnd().Trim(); - status.Found = CoreTools.Which("scoop").Item1; Status = status; // Wee need this for the RunCleanup method to get the executable path if (status.Found && IsEnabled() && Settings.Get(Settings.K.EnableScoopCleanup)) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 3e87c9118e..a234ab1db3 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -2,6 +2,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; +using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; @@ -363,15 +364,14 @@ protected override ManagerStatus LoadManager() public override void RefreshPackageIndexes() { - var (found, _) = GetManagerExecutablePath(); var (vcpkgRootFound, vcpkgRoot) = GetVcpkgRoot(); var (gitFound, gitPath) = CoreTools.Which("git"); - if (!found || !gitFound || !vcpkgRootFound) + if (!Status.Found || !gitFound || !vcpkgRootFound) { INativeTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.RefreshIndexes); if (Settings.Get(Settings.K.DisableUpdateVcpkgGitPorts)) logger.Error("User has disabled updating sources"); - if (!found) logger.Error("Vcpkg was not found???"); + if (!Status.Found) logger.Error("Vcpkg was not found???"); if (!gitFound) logger.Error("Vcpkg sources won't be updated since git was not found"); if (!vcpkgRootFound) logger.Error("Cannot update vcpkg port files as requested: the VCPKG_ROOT environment variable or custom vcpkg root setting was not set"); logger.Close(Settings.Get(Settings.K.DisableUpdateVcpkgGitPorts) ? 0 : 1); From f099871f82f0b4c105bad7d49e69bb438e1603ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:31:08 +0200 Subject: [PATCH 29/37] More descriptive method names --- src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 4 ++-- .../Chocolatey.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 4 ++-- .../PowerShell.cs | 4 ++-- .../PowerShell7.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 4 ++-- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 6 +++--- src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 4 ++-- .../Manager/Classes/NullPackageManager.cs | 2 +- .../Manager/PackageManager.cs | 6 +++--- .../SettingsPages/ManagersPages/PackageManager.xaml.cs | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs index 2b5e7612a8..c480b05c27 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs @@ -73,6 +73,6 @@ public interface IPackageManager /// Find all available executable files that apply to this package manager /// /// - public IReadOnlyList LoadAvailablePaths(); + public IReadOnlyList _findCandidateExecutableFiles(); } } diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index 6c8bd32f3c..f1bdc4eebc 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -136,14 +136,14 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return GetPackages(LoggableTaskType.ListInstalledPackages); } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { return CoreTools.WhichMultiple("cargo"); } protected override ManagerStatus LoadManager() { - var (found, executablePath) = GetManagerExecutablePath(); + var (found, executablePath) = GetExecutableFile(); if (!found) { return new(){ ExecutablePath = executablePath, Found = false, Version = ""}; diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 2e8dfc07fe..38e7b4ec22 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -192,7 +192,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() private static readonly string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); private static readonly string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { List ChocoPaths = []; @@ -310,7 +310,7 @@ protected override ManagerStatus LoadManager() } } - var (found, executable) = GetManagerExecutablePath(); + var (found, executable) = GetExecutableFile(); ManagerStatus status = new() { Found = found, ExecutablePath = executable, ExecutableCallArgs = "", }; if (!status.Found) diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 4e12e78cc0..e5fc727b1d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -124,14 +124,14 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { return CoreTools.WhichMultiple("dotnet"); } protected override ManagerStatus LoadManager() { - var (found, path) = GetManagerExecutablePath(); + var (found, path) = GetExecutableFile(); ManagerStatus status = new() { ExecutablePath = path, diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 6c087204ce..ccaa82ae22 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -187,7 +187,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { /*var Paths =*/ return CoreTools.WhichMultiple("npm.ps1"); /*foreach (string Path in CoreTools.WhichMultiple("npm")) @@ -203,7 +203,7 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - var (found, executable) = GetManagerExecutablePath(); + var (found, executable) = GetExecutableFile(); ManagerStatus status = new() { diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 8e4bc450d2..2cf80d8bd7 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -301,7 +301,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { var FoundPaths = CoreTools.WhichMultiple("python"); List Paths = []; @@ -336,7 +336,7 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - var (found, path) = GetManagerExecutablePath(); + var (found, path) = GetExecutableFile(); ManagerStatus status = new() { ExecutablePath = path, Found = found, ExecutableCallArgs = "-m pip " }; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 384a8db2bd..f122d45035 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -116,7 +116,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override List LoadAvailablePaths() + public override List _findCandidateExecutableFiles() { string path = CoreData.PowerShell5; var paths = CoreTools.WhichMultiple("powershell"); @@ -130,7 +130,7 @@ public override List LoadAvailablePaths() protected override ManagerStatus LoadManager() { - var (found, path) = GetManagerExecutablePath(); + var (found, path) = GetExecutableFile(); ManagerStatus status = new() { ExecutablePath = path, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index 538d00621f..085580d883 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -116,14 +116,14 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { return CoreTools.WhichMultiple("pwsh"); } protected override ManagerStatus LoadManager() { - var (found, path) = GetManagerExecutablePath(); + var (found, path) = GetExecutableFile(); ManagerStatus status = new() { diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 198180fb50..eae7ac6c7f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -372,7 +372,7 @@ public override void RefreshPackageIndexes() logger.Close(p.ExitCode); } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { return CoreTools.WhichMultiple("scoop.ps1"); } @@ -389,7 +389,7 @@ protected override ManagerStatus LoadManager() path = pwsh7.Item2; } - var (found, executable) = GetManagerExecutablePath(); + var (found, executable) = GetExecutableFile(); ManagerStatus status = new() { ExecutablePath = path, diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index a234ab1db3..c91dec0a9a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -287,7 +287,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { var FoundPaths = CoreTools.WhichMultiple("vcpkg"); List Paths = []; @@ -307,7 +307,7 @@ public override IReadOnlyList LoadAvailablePaths() protected override ManagerStatus LoadManager() { - var (exeFound, exePath) = GetManagerExecutablePath(); + var (exeFound, exePath) = GetExecutableFile(); var (rootFound, rootPath) = GetVcpkgRoot(); if (!exeFound) @@ -433,7 +433,7 @@ public static Tuple GetVcpkgRoot() if (vcpkgRoot == null) { - // Unfortunately, we can't use `GetVcpkgPath` or `GetManagerExecutablePath` + // Unfortunately, we can't use `GetVcpkgPath` or `GetExecutableFile` // for this as it would become a bunch of functions calling each other var paths = CoreTools.WhichMultiple("vcpkg"); foreach (string path in paths) diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 10e8f5e198..6c97f49f54 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -172,7 +172,7 @@ public ManagerSource GetLocalSource(string id) return LocalPcSource; } - public override IReadOnlyList LoadAvailablePaths() + public override IReadOnlyList _findCandidateExecutableFiles() { return CoreTools.WhichMultiple("winget"); } @@ -183,7 +183,7 @@ protected override ManagerStatus LoadManager() bool FORCE_BUNDLED = Settings.Get(Settings.K.ForceLegacyBundledWinGet); - var (found, path) = GetManagerExecutablePath(); + var (found, path) = GetExecutableFile(); status.ExecutablePath = path; status.ExecutableCallArgs = ""; status.Found = found; diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs index 6d9da1e0dc..b665c38aa1 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs @@ -68,7 +68,7 @@ public NullPackageManager() public bool IsReady() => throw new NotImplementedException(); public void RefreshPackageIndexes() => throw new NotImplementedException(); public void AttemptFastRepair() => throw new NotImplementedException(); - public IReadOnlyList LoadAvailablePaths() => throw new NotImplementedException(); + public IReadOnlyList _findCandidateExecutableFiles() => throw new NotImplementedException(); } internal class NullSourceHelper : IMultiSourceHelper diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 49f0d49133..54ad93d793 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -122,11 +122,11 @@ public virtual void Initialize() /// For example, if you have three Pythons installed on your system, this would return those three Pythons. /// /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. - public abstract IReadOnlyList LoadAvailablePaths(); + public abstract IReadOnlyList _findCandidateExecutableFiles(); - public Tuple GetManagerExecutablePath() + public Tuple GetExecutableFile() { - var AvailablePaths = LoadAvailablePaths(); + var AvailablePaths = _findCandidateExecutableFiles(); string? Path = Settings.GetDictionaryItem(Settings.K.ManagerPaths, Name); if (!SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths)) { diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index f27ce6dbb2..5d7b0b18f9 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -89,8 +89,8 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ManagerLogsLabel.Text = CoreTools.Translate("View {0} logs", Manager.DisplayName); - var Paths = Manager.LoadAvailablePaths(); - var (CurrentlyExists, CurrentPath) = ((PackageManager)Manager).GetManagerExecutablePath(); + var Paths = Manager._findCandidateExecutableFiles(); + var (CurrentlyExists, CurrentPath) = ((PackageManager)Manager).GetExecutableFile(); foreach (string Path in Paths) { ManagerExecutable.AddItem(Path, Path); From c7eea03fac178d7e1ceeabb26d97a7fb04501306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:51:37 +0200 Subject: [PATCH 30/37] rename method that is public, for coherence with naming conventions --- src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs | 2 +- src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs | 2 +- src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs | 2 +- src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 2 +- src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 2 +- .../Manager/Classes/NullPackageManager.cs | 2 +- .../Manager/PackageManager.cs | 2 +- .../Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs index c480b05c27..d5a0c5af2b 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs @@ -73,6 +73,6 @@ public interface IPackageManager /// Find all available executable files that apply to this package manager /// /// - public IReadOnlyList _findCandidateExecutableFiles(); + public IReadOnlyList FindCandidateExecutableFiles(); } } diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index f1bdc4eebc..e4b623f3b7 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -136,7 +136,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return GetPackages(LoggableTaskType.ListInstalledPackages); } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { return CoreTools.WhichMultiple("cargo"); } diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 38e7b4ec22..ecb70f7ca1 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -192,7 +192,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() private static readonly string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); private static readonly string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { List ChocoPaths = []; diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index e5fc727b1d..5f52a4fd05 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -124,7 +124,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { return CoreTools.WhichMultiple("dotnet"); } diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index ccaa82ae22..379ab43bc2 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -187,7 +187,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { /*var Paths =*/ return CoreTools.WhichMultiple("npm.ps1"); /*foreach (string Path in CoreTools.WhichMultiple("npm")) diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 2cf80d8bd7..86d9277e77 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -301,7 +301,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { var FoundPaths = CoreTools.WhichMultiple("python"); List Paths = []; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index f122d45035..0013605ada 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -116,7 +116,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override List _findCandidateExecutableFiles() + public override List FindCandidateExecutableFiles() { string path = CoreData.PowerShell5; var paths = CoreTools.WhichMultiple("powershell"); diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index 085580d883..daa2e74df0 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -116,7 +116,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { return CoreTools.WhichMultiple("pwsh"); } diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index eae7ac6c7f..23ef755898 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -372,7 +372,7 @@ public override void RefreshPackageIndexes() logger.Close(p.ExitCode); } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { return CoreTools.WhichMultiple("scoop.ps1"); } diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index c91dec0a9a..878589c365 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -287,7 +287,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() return Packages; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { var FoundPaths = CoreTools.WhichMultiple("vcpkg"); List Paths = []; diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 6c97f49f54..bb0c80fff4 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -172,7 +172,7 @@ public ManagerSource GetLocalSource(string id) return LocalPcSource; } - public override IReadOnlyList _findCandidateExecutableFiles() + public override IReadOnlyList FindCandidateExecutableFiles() { return CoreTools.WhichMultiple("winget"); } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs index b665c38aa1..e1415afd9e 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs @@ -68,7 +68,7 @@ public NullPackageManager() public bool IsReady() => throw new NotImplementedException(); public void RefreshPackageIndexes() => throw new NotImplementedException(); public void AttemptFastRepair() => throw new NotImplementedException(); - public IReadOnlyList _findCandidateExecutableFiles() => throw new NotImplementedException(); + public IReadOnlyList FindCandidateExecutableFiles() => throw new NotImplementedException(); } internal class NullSourceHelper : IMultiSourceHelper diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 54ad93d793..66c99e7321 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -122,7 +122,7 @@ public virtual void Initialize() /// For example, if you have three Pythons installed on your system, this would return those three Pythons. /// /// A tuple containing: a boolean that represents whether the path was found or not; the path to the file if found. - public abstract IReadOnlyList _findCandidateExecutableFiles(); + public abstract IReadOnlyList FindCandidateExecutableFiles(); public Tuple GetExecutableFile() { diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index 5d7b0b18f9..d934871375 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -89,7 +89,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e) ManagerLogsLabel.Text = CoreTools.Translate("View {0} logs", Manager.DisplayName); - var Paths = Manager._findCandidateExecutableFiles(); + var Paths = Manager.FindCandidateExecutableFiles(); var (CurrentlyExists, CurrentPath) = ((PackageManager)Manager).GetExecutableFile(); foreach (string Path in Paths) { From 248b8b0b8ce1a0da55853512cbd0ed93a7739bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:51:59 +0200 Subject: [PATCH 31/37] Make GetExecutableFile() more straight forward --- .../Manager/PackageManager.cs | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 66c99e7321..1c6f6a93e5 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -126,41 +126,46 @@ public virtual void Initialize() public Tuple GetExecutableFile() { - var AvailablePaths = _findCandidateExecutableFiles(); - string? Path = Settings.GetDictionaryItem(Settings.K.ManagerPaths, Name); - if (!SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths)) + var candidates = FindCandidateExecutableFiles(); + if (candidates.Count == 0) { - if (Path != null) - { - Logger.Info($"Available path {Path} found but not used as AllowCustomManagerPaths is turned off"); - } - Path = null; + // No paths were found + return new (false, ""); } - if (AvailablePaths.Count == 0) + // If custom package manager paths are DISABLED, get the first one (as old UniGetUI did) and return it. + if(!SecureSettings.Get(SecureSettings.K.AllowCustomManagerPaths)) { - Logger.Warn("No available paths found for manager " + Name); - - if (File.Exists(Path) && Path != null) Logger.Info("Using stored path " + Path); - else Logger.Error("Stored path " + Path + " is invalid"); - return new Tuple(File.Exists(Path) && Path != null, Path ?? ""); - } - else if (Path == null && File.Exists(AvailablePaths.ElementAt(0))) - { - Logger.Info("Stored path for " + Name + " is missing, using AvailablePaths[0]: " + AvailablePaths.ElementAt(0)); - return new Tuple(true, AvailablePaths.ElementAt(0)); + return new(true, candidates[0]); } else { - if (File.Exists(Path) && Path != null) + string? exeSelection = Settings.GetDictionaryItem(Settings.K.ManagerPaths, Name); + // If there is no executable selection for this package manager + if (string.IsNullOrEmpty(exeSelection)) { - Logger.Info("Using stored path " + Path); - return new Tuple(true, Path); + return new(true, candidates[0]); + } + else if (!File.Exists(exeSelection)) + { + Logger.Error($"The selected executable path {exeSelection} for manager {Name} is not valid, the default will be used..."); + return new(true, candidates[0]); } - } - Logger.Info("No suitable path found for " + Name); - return new Tuple(false, ""); + // While technically executables that are not in the path should work, + // since detection of executables will be performed in the path only, it is more consistent + // to throw an error when a non-path executable is used. + if (candidates.Select(x => x.ToLower()).Contains(exeSelection.ToLower())) + { + return new(true, exeSelection); + } + else + { + Logger.Error($"The selected executable path {exeSelection} for manager {Name} was not found in path, the default will be used..."); + return new(true, candidates[0]); + } + + } } /// From 3959a38dc57e45d1403c3b7271c12b1a8c7496f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 12:58:22 +0200 Subject: [PATCH 32/37] Update PackageManager.cs --- .../Manager/PackageManager.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs index 1c6f6a93e5..06b352f169 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs @@ -148,20 +148,22 @@ public Tuple GetExecutableFile() } else if (!File.Exists(exeSelection)) { - Logger.Error($"The selected executable path {exeSelection} for manager {Name} is not valid, the default will be used..."); + Logger.Error($"The selected executable path {exeSelection} for manager {Name} does not exist, the default one will be used..."); return new(true, candidates[0]); } // While technically executables that are not in the path should work, // since detection of executables will be performed in the path only, it is more consistent - // to throw an error when a non-path executable is used. + // to throw an error when a non-path executable is used. Furthermore, doing this we can filter out + // any invalid paths or files if (candidates.Select(x => x.ToLower()).Contains(exeSelection.ToLower())) { return new(true, exeSelection); } else { - Logger.Error($"The selected executable path {exeSelection} for manager {Name} was not found in path, the default will be used..."); + Logger.Error($"The selected executable path {exeSelection} for manager {Name} was not found in path " + + $"(executables found in path are [{string.Join(',', candidates)}]), the default will be used..."); return new(true, candidates[0]); } From c3145a3d7ea8df7b62c7064721df772a19497f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 13:18:28 +0200 Subject: [PATCH 33/37] Instead of migrating the UseSystemChocolatey setting, the toggle can be added by not adding the local executable as the first one, so the default file will be pulled from path --- .../SettingsEngine_Names.cs | 2 - .../Chocolatey.cs | 72 +++++++------------ 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/src/UniGetUI.Core.Settings/SettingsEngine_Names.cs b/src/UniGetUI.Core.Settings/SettingsEngine_Names.cs index 9165a9fe3a..2c01b4decb 100644 --- a/src/UniGetUI.Core.Settings/SettingsEngine_Names.cs +++ b/src/UniGetUI.Core.Settings/SettingsEngine_Names.cs @@ -75,7 +75,6 @@ public enum K DisableSuccessNotifications, DisableProgressNotifications, KillProcessesThatRefuseToDie, - TransferredSystemChocolatey, ManagerPaths, Test1, @@ -163,7 +162,6 @@ public static string ResolveKey(K key) K.DisableSuccessNotifications => "DisableSuccessNotifications", K.DisableProgressNotifications => "DisableProgressNotifications", K.KillProcessesThatRefuseToDie => "KillProcessesThatRefuseToDie", - K.TransferredSystemChocolatey => "TransferredSystemChocolatey", K.ManagerPaths => "ManagerPaths", K.Test1 => "TestSetting1", diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index ecb70f7ca1..406a924dbb 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -18,8 +18,10 @@ namespace UniGetUI.PackageEngine.Managers.ChocolateyManager { public class Chocolatey : BaseNuGet { - public static new string[] FALSE_PACKAGE_IDS = ["Directory", "", "Did", "Features?", "Validation", "-", "being", "It", "Error", "L'accs", "Maximum", "This", "Output is package name ", "operable", "Invalid"]; - public static new string[] FALSE_PACKAGE_VERSIONS = ["", "of", "Did", "Features?", "Validation", "-", "being", "It", "Error", "L'accs", "Maximum", "This", "packages", "current version", "installed version", "is", "program", "validations", "argument", "no"]; + public static readonly string[] FALSE_PACKAGE_IDS = ["Directory", "", "Did", "Features?", "Validation", "-", "being", "It", "Error", "L'accs", "Maximum", "This", "Output is package name ", "operable", "Invalid"]; + public static readonly string[] FALSE_PACKAGE_VERSIONS = ["", "of", "Did", "Features?", "Validation", "-", "being", "It", "Error", "L'accs", "Maximum", "This", "packages", "current version", "installed version", "is", "program", "validations", "argument", "no"]; + private static readonly string OldChocoPath = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); + private static readonly string NewChocoPath = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); public Chocolatey() { @@ -189,29 +191,25 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() return Packages; } - private static readonly string old_choco_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs\\WingetUI\\choco-cli"); - private static readonly string new_choco_path = Path.Join(CoreData.UniGetUIDataDirectory, "Chocolatey"); - public override IReadOnlyList FindCandidateExecutableFiles() { - List ChocoPaths = []; - - var SystemPaths = CoreTools.WhichMultiple("choco"); - if (SystemPaths.Any()) foreach (var Path in SystemPaths) ChocoPaths.Add(Path); - if (File.Exists(Path.Join(new_choco_path, "choco.exe"))) ChocoPaths.Add(Path.Join(new_choco_path, "choco.exe")); - string EnvPath = Path.Join(Environment.GetEnvironmentVariable("ChocolateyInstall"), "choco.exe"); - if (File.Exists(EnvPath)) ChocoPaths.Add(EnvPath); + List candidates = []; - return ChocoPaths; + if (!Settings.Get(Settings.K.UseSystemChocolatey)) + { + candidates.Add(Path.Join(NewChocoPath, "choco.exe")); + } + candidates.AddRange(CoreTools.WhichMultiple("choco.exe")); + return candidates; } protected override ManagerStatus LoadManager() { - if (!Directory.Exists(old_choco_path)) + if (!Directory.Exists(OldChocoPath)) { Logger.Debug("Old chocolatey path does not exist, not migrating Chocolatey"); } - else if (CoreTools.IsSymbolicLinkDir(old_choco_path)) + else if (CoreTools.IsSymbolicLinkDir(OldChocoPath)) { Logger.ImportantInfo("Old chocolatey path is a symbolic link, not migrating Chocolatey..."); } @@ -227,20 +225,20 @@ protected override ManagerStatus LoadManager() string current_env_var = Environment.GetEnvironmentVariable("chocolateyinstall", EnvironmentVariableTarget.User) ?? ""; - if (current_env_var != "" && Path.GetRelativePath(current_env_var, old_choco_path) == ".") + if (current_env_var != "" && Path.GetRelativePath(current_env_var, OldChocoPath) == ".") { Logger.ImportantInfo("Migrating ChocolateyInstall environment variable to new location"); - Environment.SetEnvironmentVariable("chocolateyinstall", new_choco_path, EnvironmentVariableTarget.User); + Environment.SetEnvironmentVariable("chocolateyinstall", NewChocoPath, EnvironmentVariableTarget.User); } - if (!Directory.Exists(new_choco_path)) + if (!Directory.Exists(NewChocoPath)) { - Directory.CreateDirectory(new_choco_path); + Directory.CreateDirectory(NewChocoPath); } - foreach (string old_subdir in Directory.GetDirectories(old_choco_path, "*", SearchOption.AllDirectories)) + foreach (string old_subdir in Directory.GetDirectories(OldChocoPath, "*", SearchOption.AllDirectories)) { - string new_subdir = old_subdir.Replace(old_choco_path, new_choco_path); + string new_subdir = old_subdir.Replace(OldChocoPath, NewChocoPath); if (!Directory.Exists(new_subdir)) { Logger.Debug("New directory: " + new_subdir); @@ -252,9 +250,9 @@ protected override ManagerStatus LoadManager() } } - foreach (string old_file in Directory.GetFiles(old_choco_path, "*", SearchOption.AllDirectories)) + foreach (string old_file in Directory.GetFiles(OldChocoPath, "*", SearchOption.AllDirectories)) { - string new_file = old_file.Replace(old_choco_path, new_choco_path); + string new_file = old_file.Replace(OldChocoPath, NewChocoPath); if (!File.Exists(new_file)) { Logger.Info("Copying " + old_file); @@ -267,7 +265,7 @@ protected override ManagerStatus LoadManager() } } - foreach (string old_subdir in Directory.GetDirectories(old_choco_path, "*", SearchOption.AllDirectories).Reverse()) + foreach (string old_subdir in Directory.GetDirectories(OldChocoPath, "*", SearchOption.AllDirectories).Reverse()) { if (!Directory.EnumerateFiles(old_subdir).Any() && !Directory.EnumerateDirectories(old_subdir).Any()) { @@ -276,15 +274,15 @@ protected override ManagerStatus LoadManager() } } - if (!Directory.EnumerateFiles(old_choco_path).Any() && !Directory.EnumerateDirectories(old_choco_path).Any()) + if (!Directory.EnumerateFiles(OldChocoPath).Any() && !Directory.EnumerateDirectories(OldChocoPath).Any()) { - Logger.Info("Deleting old Chocolatey directory " + old_choco_path); - Directory.Delete(old_choco_path); + Logger.Info("Deleting old Chocolatey directory " + OldChocoPath); + Directory.Delete(OldChocoPath); } - CoreTools.CreateSymbolicLinkDir(old_choco_path, new_choco_path); + CoreTools.CreateSymbolicLinkDir(OldChocoPath, NewChocoPath); Settings.Set(Settings.K.ChocolateySymbolicLinkCreated, true); - Logger.Info($"Symbolic link created successfully from {old_choco_path} to {new_choco_path}."); + Logger.Info($"Symbolic link created successfully from {OldChocoPath} to {NewChocoPath}."); } catch (Exception e) @@ -294,22 +292,6 @@ protected override ManagerStatus LoadManager() } } - if (Settings.Get(Settings.K.UseSystemChocolatey) && !Settings.Get(Settings.K.TransferredSystemChocolatey)) - { - var SystemPaths = CoreTools.WhichMultiple("choco"); - if (SystemPaths.Count > 0) - { - string SysPath = SystemPaths.ElementAt(0); - for (int idx = 1; idx < SystemPaths.Count; idx++) - { - if (!SystemPaths.ElementAt(idx).Contains("UniGetUI")) - SysPath = SystemPaths.ElementAt(idx); - } - Settings.SetDictionaryItem(Settings.K.ManagerPaths, "Chocolatey", SysPath); - Settings.Set(Settings.K.TransferredSystemChocolatey, true); - } - } - var (found, executable) = GetExecutableFile(); ManagerStatus status = new() { Found = found, ExecutablePath = executable, ExecutableCallArgs = "", }; From 6f9fd087175e9ac69eff868a86ba5f9a70b1185f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 13:31:56 +0200 Subject: [PATCH 34/37] Make WinGet compatible again with the "Use bundled WinGet" toggle --- .../ClientHelpers/BundledWinGetHelper.cs | 14 ++++---- .../ClientHelpers/NativeWinGetHelper.cs | 2 +- .../WinGet.cs | 33 ++++++++++--------- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs index 5c3f3a9868..af3a6d8c16 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs @@ -27,7 +27,7 @@ public IReadOnlyList GetAvailableUpdates_UnSafe() { StartInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " update --include-unknown --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, @@ -139,7 +139,7 @@ public IReadOnlyList GetInstalledPackages_UnSafe() { StartInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " list --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, RedirectStandardError = true, @@ -238,7 +238,7 @@ public IReadOnlyList FindPackages_UnSafe(string query) { StartInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " search \"" + query + "\" --accept-source-agreements " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, @@ -336,7 +336,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) bool LocaleFound = true; ProcessStartInfo startInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --locale " + System.Globalization.CultureInfo.CurrentCulture + " " + WinGet.GetProxyArgument(), @@ -384,7 +384,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) LocaleFound = true; startInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --locale en-US " + " " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, @@ -428,7 +428,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) process = new Process(); startInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements " + " " + WinGet.GetProxyArgument(), RedirectStandardOutput = true, @@ -573,7 +573,7 @@ public IReadOnlyList GetInstallableVersions_Unsafe(IPackage package) { StartInfo = new ProcessStartInfo { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(package) + $" --versions --accept-source-agreements " + " " + WinGet.GetProxyArgument(), UseShellExecute = false, diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs index 8a3a93a190..c87ce8573e 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs @@ -358,7 +358,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) List output = []; ProcessStartInfo startInfo = new() { - FileName = Manager.WinGetBundledPath, + FileName = Manager.BundledWinGetPath, Arguments = Manager.Status.ExecutableCallArgs + " show " + WinGetPkgOperationHelper.GetIdNamePiece(details.Package) + " --disable-interactivity --accept-source-agreements --source " + details.Package.Source.Name, diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index bb0c80fff4..17e44f306e 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -30,11 +30,11 @@ public class WinGet : PackageManager public LocalWinGetSource MicrosoftStoreSource { get; } public static bool NO_PACKAGES_HAVE_BEEN_LOADED { get; private set; } - public string WinGetBundledPath; + public string BundledWinGetPath; public WinGet() { - WinGetBundledPath = Path.Join(CoreData.UniGetUIExecutableDirectory, "winget-cli_x64", "winget.exe"); + BundledWinGetPath = Path.Join(CoreData.UniGetUIExecutableDirectory, "winget-cli_x64", "winget.exe"); Capabilities = new ManagerCapabilities { @@ -174,30 +174,33 @@ public ManagerSource GetLocalSource(string id) public override IReadOnlyList FindCandidateExecutableFiles() { - return CoreTools.WhichMultiple("winget"); + List candidates = new(); + if (!Settings.Get(Settings.K.ForceLegacyBundledWinGet)) + { + candidates.AddRange(CoreTools.WhichMultiple("winget.exe")); + } + + candidates.Add(BundledWinGetPath); + return candidates; } protected override ManagerStatus LoadManager() { - ManagerStatus status = new(); bool FORCE_BUNDLED = Settings.Get(Settings.K.ForceLegacyBundledWinGet); - var (found, path) = GetExecutableFile(); - status.ExecutablePath = path; - status.ExecutableCallArgs = ""; - status.Found = found; - if (!status.Found) + ManagerStatus status = new() { - Logger.Error("User does not have WinGet installed, forcing bundled WinGet..."); - FORCE_BUNDLED = true; - } + ExecutablePath = path, + ExecutableCallArgs = "", + Found = found, + }; - if (FORCE_BUNDLED) + if (found && status.ExecutablePath == BundledWinGetPath && !FORCE_BUNDLED) { - status.ExecutablePath = WinGetBundledPath; - status.Found = File.Exists(WinGetBundledPath); + Logger.Error("User does not have WinGet installed, forcing bundled WinGet..."); + FORCE_BUNDLED = true; } if (!status.Found) From fe58bac186a7ab727dfed08cc525c659026d1357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 13:32:22 +0200 Subject: [PATCH 35/37] add .exe when searching for executable files (prevent interferences from scripts) --- .../Cargo.cs | 2 +- .../DotNet.cs | 2 +- .../PowerShell.cs | 11 +++-------- .../PowerShell7.cs | 2 +- .../Vcpkg.cs | 16 ++++++---------- 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index e4b623f3b7..d17401ac88 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -138,7 +138,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override IReadOnlyList FindCandidateExecutableFiles() { - return CoreTools.WhichMultiple("cargo"); + return CoreTools.WhichMultiple("cargo.exe"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 5f52a4fd05..2d988d182f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -126,7 +126,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override IReadOnlyList FindCandidateExecutableFiles() { - return CoreTools.WhichMultiple("dotnet"); + return CoreTools.WhichMultiple("dotnet.exe"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 0013605ada..02ebe707f8 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -118,14 +118,9 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override List FindCandidateExecutableFiles() { - string path = CoreData.PowerShell5; - var paths = CoreTools.WhichMultiple("powershell"); - if (File.Exists(path) && !paths.Contains(path, StringComparer.OrdinalIgnoreCase)) - { - paths.Add(path); - } - - return paths; + var candidates = CoreTools.WhichMultiple("powershell.exe"); + if(candidates.Count is 0) candidates.Add(CoreData.PowerShell5); + return candidates; } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index daa2e74df0..c8c353a81a 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -118,7 +118,7 @@ protected override IReadOnlyList _getInstalledPackages_UnSafe() public override IReadOnlyList FindCandidateExecutableFiles() { - return CoreTools.WhichMultiple("pwsh"); + return CoreTools.WhichMultiple("pwsh.exe"); } protected override ManagerStatus LoadManager() diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 878589c365..d2f75d8966 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -289,20 +289,16 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() public override IReadOnlyList FindCandidateExecutableFiles() { - var FoundPaths = CoreTools.WhichMultiple("vcpkg"); - List Paths = []; + var candidates = CoreTools.WhichMultiple("vcpkg.exe"); - if (FoundPaths.Any()) foreach (var Path in FoundPaths) Paths.Add(Path); - - var (VcpkgRootFound, VcpkgRoot) = GetVcpkgRoot(); - if (VcpkgRootFound) + var (rootFound, rootPath) = GetVcpkgRoot(); + if (rootFound) { - string VcpkgLocation = Path.Join(VcpkgRoot, "vcpkg.exe"); - - if (File.Exists(VcpkgLocation)) Paths.Add(VcpkgLocation); + string VcpkgLocation = Path.Join(rootPath, "vcpkg.exe"); + if (File.Exists(VcpkgLocation)) candidates.Add(VcpkgLocation); } - return Paths; + return candidates; } protected override ManagerStatus LoadManager() From b063ad6d57339ed9457f6ed92f62e8dd7706e9cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 16:07:56 +0200 Subject: [PATCH 36/37] Improvements to the "Select package manager executable" control on the settings --- .../IPackageManager.cs | 2 + .../Manager/Classes/NullPackageManager.cs | 2 + src/UniGetUI/MainWindow.xaml.cs | 2 +- .../ManagersPages/PackageManager.xaml | 71 +++++++++++++++++-- .../ManagersPages/PackageManager.xaml.cs | 40 ++++++++--- 5 files changed, 99 insertions(+), 18 deletions(-) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs index d5a0c5af2b..50735edd75 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs @@ -74,5 +74,7 @@ public interface IPackageManager /// /// public IReadOnlyList FindCandidateExecutableFiles(); + public Tuple GetExecutableFile(); + } } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs index e1415afd9e..b14fdb7392 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs @@ -69,6 +69,7 @@ public NullPackageManager() public void RefreshPackageIndexes() => throw new NotImplementedException(); public void AttemptFastRepair() => throw new NotImplementedException(); public IReadOnlyList FindCandidateExecutableFiles() => throw new NotImplementedException(); + public Tuple GetExecutableFile() => throw new NotImplementedException(); } internal class NullSourceHelper : IMultiSourceHelper @@ -79,6 +80,7 @@ internal class NullSourceHelper : IMultiSourceHelper public OperationVeredict GetAddOperationVeredict(IManagerSource source, int ReturnCode, string[] Output) => throw new NotImplementedException(); public OperationVeredict GetRemoveOperationVeredict(IManagerSource source, int ReturnCode, string[] Output) => throw new NotImplementedException(); public IReadOnlyList GetSources() => throw new NotImplementedException(); + } internal sealed class NullPkgDetailsHelper : IPackageDetailsHelper diff --git a/src/UniGetUI/MainWindow.xaml.cs b/src/UniGetUI/MainWindow.xaml.cs index 9923d6cf87..d4298d46b5 100644 --- a/src/UniGetUI/MainWindow.xaml.cs +++ b/src/UniGetUI/MainWindow.xaml.cs @@ -56,7 +56,7 @@ public MainWindow() DialogHelper.Window = this; WindowManager.Get(this).IsMinimizable = false; - WindowManager.Get(this).IsMaximizable = false; + // WindowManager.Get(this).IsMaximizable = false; InitializeComponent(); DismissableNotification.CloseButtonContent = CoreTools.Translate("Close"); diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml index 5980a1e061..d23c9fb961 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml @@ -52,15 +52,66 @@ Visibility="Collapsed" /> - + Padding="24,16,24,0" + HorizontalContentAlignment="Left" + BorderThickness="1,0,1,0" + ContentAlignment="Vertical" + CornerRadius="0,0,0,0"> + + + + + + + + + + + + + + + + + + + + + + + + + + + (Settings.K.ManagerPaths, Manager.Name) ?? ""; + if (string.IsNullOrEmpty(selectedValue)) + { + var exe = Manager.GetExecutableFile(); + selectedValue = exe.Item1? exe.Item2: ""; + } + + ExecutableComboBox.SelectedValue = selectedValue; + ExecutableComboBox.SelectionChanged += ExecutableComboBox_SelectionChanged; InstallOptionsPanel.Description = new InstallOptions_Manager(Manager); @@ -425,10 +435,18 @@ private void ManagerLogs_Click(object sender, RoutedEventArgs e) MainApp.Instance.MainWindow.NavigationPage.OpenManagerLogs(Manager as IPackageManager); } - public void ManagerExecutableSelection_OnValueChanged(object sender, EventArgs e) + private void ExecutableComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { - Settings.SetDictionaryItem(Settings.K.ManagerPaths, Manager.Name, ManagerExecutable.SelectedValue()); + if (string.IsNullOrEmpty(ExecutableComboBox.SelectedValue.ToString())) + return; + + Settings.SetDictionaryItem(Settings.K.ManagerPaths, Manager!.Name, ExecutableComboBox.SelectedValue.ToString()); RestartRequired?.Invoke(this, EventArgs.Empty); } + + private void GoToSecureSettingsBtn_Click(object sender, RoutedEventArgs e) + { + MainApp.Instance.MainWindow.NavigationPage.OpenSettingsPage(typeof(Administrator)); + } } } From 6b5230fd56f45de9c9373f94fa636fab8a303a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 5 Jul 2025 16:33:20 +0200 Subject: [PATCH 37/37] improvements to Administrator settings page --- .../GeneralPages/Administrator.xaml | 18 ++++++++++++------ .../ManagersPages/PackageManager.xaml | 6 +++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml index e4c9f1ce80..0626706c1a 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Administrator.xaml @@ -73,6 +73,18 @@ Text="Ignore custom pre-install and post-install commands when importing packages from a bundle" WarningText="Pre and post install commands will be run before and after a package gets installed, upgraded or uninstalled. Be aware that they may break things unless used carefully" /> + + + + - diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml index d23c9fb961..dfd82fc083 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml @@ -54,16 +54,16 @@ - +