From 0728947f6dfa4161b3b781f2b223f5a3d6daaa03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 22:03:56 +0200 Subject: [PATCH 1/8] Add dependencies field --- .../IPackageDetails.cs | 9 ++++++++ .../Packages/Classes/PackageDetails.cs | 2 ++ .../Pages/DialogPages/PackageDetailsPage.xaml | 3 +++ .../DialogPages/PackageDetailsPage.xaml.cs | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/src/UniGetUI.PAckageEngine.Interfaces/IPackageDetails.cs b/src/UniGetUI.PAckageEngine.Interfaces/IPackageDetails.cs index b7f1481560..607d4b35c0 100644 --- a/src/UniGetUI.PAckageEngine.Interfaces/IPackageDetails.cs +++ b/src/UniGetUI.PAckageEngine.Interfaces/IPackageDetails.cs @@ -94,5 +94,14 @@ public interface IPackageDetails /// /// An asynchronous task that can be awaited public Task Load(); + + public List Dependencies { get; } + + public struct Dependency + { + public string Name; + public string Version; + public bool Mandatory; + } } } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Classes/PackageDetails.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Classes/PackageDetails.cs index 3095257add..fcb956d4ce 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Classes/PackageDetails.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Classes/PackageDetails.cs @@ -94,6 +94,8 @@ public class PackageDetails : IPackageDetails /// public string[] Tags { get; set; } = []; + public List Dependencies { get; set; } = []; + public PackageDetails(IPackage package) { Package = package; diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml index 6ba6aa7e13..9d93c83403 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml @@ -327,6 +327,9 @@ Update date: Helo + Dependencies: + Helo + Release Notes: Helo diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs index 2371103a7d..bc8d05cbb2 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs @@ -1,4 +1,5 @@ using System.Collections.ObjectModel; +using System.Text; using Windows.UI; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -94,6 +95,8 @@ public PackageDetailsPage(IPackage package, OperationType role, TEL_InstallRefer SetTextToItem(DownloadInstaller_Button, CoreTools.Translate("Download installer")); SetTextToItem(UpdateDate_Label, CoreTools.Translate("Last updated:") + " "); SetTextToItem(UpdateDate_Content, LoadingString); + SetTextToItem(Dependencies_Label, CoreTools.Translate("Dependencies:") + " "); + SetTextToItem(Dependencies_Content, LoadingString); SetTextToItem(ReleaseNotes_Label, CoreTools.Translate("Release notes") + ": "); SetTextToItem(ReleaseNotes_Content, LoadingString); SetTextToItem(ReleaseNotesUrl_Label, CoreTools.Translate("Release notes URL") + ": "); @@ -372,6 +375,26 @@ public async Task LoadInformation() SetTextToItem(ReleaseNotes_Content, details.ReleaseNotes); SetTextToItem(ReleaseNotesUrl_Content, details.ReleaseNotesUrl); + if (false) + { + SetTextToItem(Dependencies_Content, CoreTools.Translate("Not available")); + } + else if (details.Dependencies.Any()) + { + StringBuilder depsString = new("\n"); + foreach (var dep in details.Dependencies) + { + depsString.Append($"  • {dep.Name} ("); + if (dep.Version.Any()) depsString.Append(CoreTools.Translate("Version:") + $" {dep.Version}, "); + depsString.Append($"{(dep.Mandatory ? CoreTools.Translate("mandatory") : CoreTools.Translate("optional"))})\n"); + } + SetTextToItem(Dependencies_Content, depsString.ToString()); + } + else + { + SetTextToItem(Dependencies_Content, CoreTools.Translate("No dependencies found")); + } + ShowableTags.Clear(); foreach (string tag in details.Tags) { From 5feaec2df27715f794bd4adbf8715f01c15067aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 22:04:14 +0200 Subject: [PATCH 2/8] Make WinGet list dependencies --- .../ClientHelpers/BundledWinGetHelper.cs | 17 +++++++++++++++++ .../ClientHelpers/NativeWinGetHelper.cs | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs index fc95aca774..d36370407b 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs @@ -461,6 +461,8 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) bool IsLoadingDescription = false; bool IsLoadingReleaseNotes = false; bool IsLoadingTags = false; + bool capturingDependencies = false; + details.Dependencies.Clear(); foreach (string __line in output) { try @@ -556,6 +558,21 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) details.Tags = []; IsLoadingTags = true; } + else if (line.Contains("- Package Dependencies")) + { + capturingDependencies = true; + } + else if (__line.Contains(" ") && capturingDependencies) + { + details.Dependencies.Add(new() + { + Name = line.Split(' ')[0], + Version = line.Contains('[') ? line.Split('[')[1].TrimEnd(']'): "", + Mandatory = true + }); + } + else if (!__line.Contains(" ")) capturingDependencies = false; + } catch (Exception e) { diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs index 4aa99d47b3..26a558db6f 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs @@ -396,6 +396,8 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) logger.Error(process.StandardError.ReadToEnd()); + bool capturingDependencies = false; + details.Dependencies.Clear(); // Parse the output foreach (string __line in output) { @@ -419,6 +421,20 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) { details.InstallerType = line.Split(":")[1].Trim(); } + else if (line.Contains("- Package Dependencies")) + { + capturingDependencies = true; + } + else if (__line.Contains(" ") && capturingDependencies) + { + details.Dependencies.Add(new() + { + Name = line.Split(' ')[0], + Version = line.Contains('[') ? line.Split('[')[1].TrimEnd(']'): "", + Mandatory = true + }); + } + else if (!__line.Contains(" ")) capturingDependencies = false; } catch (Exception e) { From 9933a507f2b83295954bf1a6af993f8ade44191c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 22:09:02 +0200 Subject: [PATCH 3/8] improvements to bundled winget --- .../ClientHelpers/BundledWinGetHelper.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs index d36370407b..ff7d1605f7 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/BundledWinGetHelper.cs @@ -461,7 +461,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) bool IsLoadingDescription = false; bool IsLoadingReleaseNotes = false; bool IsLoadingTags = false; - bool capturingDependencies = false; + bool IsCapturingDependencies = false; details.Dependencies.Clear(); foreach (string __line in output) { @@ -486,6 +486,16 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) { details.Tags = details.Tags.Append(line.Trim()).ToArray(); } + else if (line.StartsWith(" ") && IsCapturingDependencies) + { + line = line.Trim(); + details.Dependencies.Add(new() + { + Name = line.Split(' ')[0], + Version = line.Contains('[') ? line.Split('[')[1].TrimEnd(']'): "", + Mandatory = true + }); + } // Stop loading multiline fields else if (IsLoadingDescription) @@ -500,6 +510,10 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) { IsLoadingTags = false; } + else if (IsCapturingDependencies) + { + IsCapturingDependencies = false; + } // Check for single-line fields if (line.Contains("Publisher:")) @@ -560,19 +574,8 @@ public void GetPackageDetails_UnSafe(IPackageDetails details) } else if (line.Contains("- Package Dependencies")) { - capturingDependencies = true; + IsCapturingDependencies = true; } - else if (__line.Contains(" ") && capturingDependencies) - { - details.Dependencies.Add(new() - { - Name = line.Split(' ')[0], - Version = line.Contains('[') ? line.Split('[')[1].TrimEnd(']'): "", - Mandatory = true - }); - } - else if (!__line.Contains(" ")) capturingDependencies = false; - } catch (Exception e) { From e01b40c6b83b2586159f5eb61b835b47b9f9e133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 22:38:20 +0200 Subject: [PATCH 4/8] Add dependency listing to npm, pip --- .../ManagerCapabilities.cs | 1 + .../Helpers/NpmPkgDetailsHelper.cs | 42 +++++++++++++++++++ .../Npm.cs | 1 + .../Helpers/PipPkgDetailsHelper.cs | 12 ++++++ .../Pip.cs | 1 + .../Pages/DialogPages/PackageDetailsPage.xaml | 7 ++-- .../DialogPages/PackageDetailsPage.xaml.cs | 8 ++-- 7 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs b/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs index 0eda3bfc7a..02b5d209d3 100644 --- a/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs +++ b/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs @@ -25,6 +25,7 @@ public struct ManagerCapabilities public bool CanRemoveDataOnUninstall = false; public bool CanDownloadInstaller = false; public bool CanUninstallPreviousVersionsAfterUpdate = false; + public bool CanListDependencies = false; public bool SupportsCustomVersions = false; public bool SupportsCustomArchitectures = false; public string[] SupportedCustomArchitectures = []; diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs index d916ef6d94..114204f1e0 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs @@ -61,6 +61,48 @@ protected override void GetDetails_UnSafe(IPackageDetails details) details.InstallerHash = contents?["dist"]?["integrity"]?.ToString(); + details.Dependencies.Clear(); + + HashSet addedDeps = new(); + foreach (var rawDep in (contents?["dependencies"]?.AsObject() ?? [])) + { + if(addedDeps.Contains(rawDep.Key)) continue; + addedDeps.Add(rawDep.Key); + + details.Dependencies.Add(new() + { + Name = rawDep.Key, + Version = rawDep.Value?.GetValue() ?? "", + Mandatory = true, + }); + } + + foreach (var rawDep in (contents?["devDependencies"]?.AsObject() ?? [])) + { + if(addedDeps.Contains(rawDep.Key)) continue; + addedDeps.Add(rawDep.Key); + + details.Dependencies.Add(new() + { + Name = rawDep.Key, + Version = rawDep.Value?.GetValue() ?? "", + Mandatory = false, + }); + } + + foreach (var rawDep in (contents?["peerDependencies"]?.AsObject() ?? [])) + { + if(addedDeps.Contains(rawDep.Key)) continue; + addedDeps.Add(rawDep.Key); + + details.Dependencies.Add(new() + { + Name = rawDep.Key, + Version = rawDep.Value?.GetValue() ?? "", + Mandatory = false, + }); + } + logger.AddToStdErr(p.StandardError.ReadToEnd()); p.WaitForExit(); logger.Close(p.ExitCode); diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index 66d2c0a207..ffc10c742a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -23,6 +23,7 @@ public Npm() SupportsCustomVersions = true, CanDownloadInstaller = true, SupportsCustomScopes = true, + CanListDependencies = true, SupportsPreRelease = true, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs index f6fe219ecf..8a0b48dfd0 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs @@ -55,6 +55,18 @@ protected override void GetDetails_UnSafe(IPackageDetails details) } details.Tags = Tags.ToArray(); } + + foreach (var rawDep in (info?["requires_dist"]?.AsArray() ?? [])) + { + string line = rawDep?.GetValue().Split(';')[0] ?? ""; + string name = line.Split(['>', '<', '=', '!'])[0]; + details.Dependencies.Add(new() + { + Name = name, + Version = line[name.Length..], + Mandatory = true, + }); + } } JsonObject? url = contents?["url"] as JsonObject; diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 86d9277e77..2edf6ebbe3 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -50,6 +50,7 @@ public Pip() SupportsCustomScopes = true, CanDownloadInstaller = true, SupportsPreRelease = true, + CanListDependencies = true, SupportsProxy = ProxySupport.Yes, SupportsProxyAuth = true }; diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml index 9d93c83403..01efcdd7ce 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml @@ -120,6 +120,9 @@ Helo (Helo) + Update date: + Helo + SOURCE_LABEL: Helo @@ -324,12 +327,10 @@ - Update date: - Helo - Dependencies: Helo + Release Notes: Helo diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs index bc8d05cbb2..5d8a9bd662 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs @@ -375,9 +375,9 @@ public async Task LoadInformation() SetTextToItem(ReleaseNotes_Content, details.ReleaseNotes); SetTextToItem(ReleaseNotesUrl_Content, details.ReleaseNotesUrl); - if (false) + if (!details.Package.Manager.Capabilities.CanListDependencies) { - SetTextToItem(Dependencies_Content, CoreTools.Translate("Not available")); + SetTextToItem(Dependencies_Content, null); } else if (details.Dependencies.Any()) { @@ -388,11 +388,11 @@ public async Task LoadInformation() if (dep.Version.Any()) depsString.Append(CoreTools.Translate("Version:") + $" {dep.Version}, "); depsString.Append($"{(dep.Mandatory ? CoreTools.Translate("mandatory") : CoreTools.Translate("optional"))})\n"); } - SetTextToItem(Dependencies_Content, depsString.ToString()); + SetTextToItem(Dependencies_Content, depsString.ToString().TrimEnd('\n')); } else { - SetTextToItem(Dependencies_Content, CoreTools.Translate("No dependencies found")); + SetTextToItem(Dependencies_Content, CoreTools.Translate("No dependencies specified")); } ShowableTags.Clear(); From fd9fcdb609e357ae7330f43d82dd2f025e780db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 23:19:09 +0200 Subject: [PATCH 5/8] add dependency listing to scoop --- .../Helpers/ScoopPkgDetailsHelper.cs | 54 +++++++++++++++++++ .../Scoop.cs | 1 + 2 files changed, 55 insertions(+) diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs index 96e7ea8639..171e88ec88 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs @@ -157,9 +157,63 @@ protected override void GetDetails_UnSafe(IPackageDetails details) out var releaseNotesUrl)) details.ReleaseNotesUrl = releaseNotesUrl; + _getDepends(details, contents); + _getSuggests(details, contents); + logger.Close(0); } + private static void _getSuggests(IPackageDetails details, JsonObject? contents) + { + foreach (var rawDep in (contents?["suggest"]?.AsObject() ?? [])) + { + List innerDeps = []; + + if(rawDep.Value is JsonValue value) innerDeps.Add(value.GetValue()); + else + { + foreach (var iDep in rawDep.Value?.AsArray() ?? []) + { + string? val = iDep?.GetValue(); + if(val is not null) innerDeps.Add(val); + } + } + + foreach(var val in innerDeps) + details.Dependencies.Add(new() + { + Name = val, + Version = "", + Mandatory = false, + }); + } + } + + private static void _getDepends(IPackageDetails details, JsonObject? contents) + { + var node = contents?["depends"]; + List innerDeps = []; + + + if(node is JsonValue value) innerDeps.Add(value.GetValue()); + else + { + foreach (var iDep in node?.AsArray() ?? []) + { + string? val = iDep?.GetValue(); + if(val is not null) innerDeps.Add(val); + } + } + + foreach(var val in innerDeps) + details.Dependencies.Add(new() + { + Name = val, + Version = "", + Mandatory = true, + }); + } + protected override CacheableIcon? GetIcon_UnSafe(IPackage package) { throw new NotImplementedException(); diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 23ef755898..484790c1af 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -51,6 +51,7 @@ public Scoop() CanRunAsAdmin = true, CanSkipIntegrityChecks = true, CanDownloadInstaller = true, + CanListDependencies = true, CanRemoveDataOnUninstall = true, SupportsCustomArchitectures = true, SupportedCustomArchitectures = [Architecture.x86, Architecture.x64, Architecture.arm64], From 7f07aa23bcc56e0026a7b80acfe358ba7f6a37ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 23:26:31 +0200 Subject: [PATCH 6/8] Add dependencies to Vcpkg --- .../Helpers/VcpkgPkgDetailsHelper.cs | 9 +++++++++ src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs | 1 + src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs | 1 + 3 files changed, 11 insertions(+) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs index 0adc4fe8c1..251f42307f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs @@ -54,6 +54,15 @@ protected override void GetDetails_UnSafe(IPackageDetails details) details.Tags = Tags.ToArray(); + foreach (var iDep in contents?["dependencies"]?.AsArray() ?? []) + { + string? val = iDep?.GetValue(); + if (val is not null) + { + details.Dependencies.Add(new() { Name = val, Version = "", Mandatory = true, }); + } + } + logger.Close(0); } diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index d2f75d8966..07bef3111a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -42,6 +42,7 @@ public Vcpkg() { CanRunAsAdmin = true, SupportsCustomSources = true, + CanListDependencies = true, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, }; diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 17e44f306e..442b3c4947 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -43,6 +43,7 @@ public WinGet() CanRunInteractively = true, SupportsCustomVersions = true, CanDownloadInstaller = true, + CanListDependencies = true, SupportsCustomArchitectures = true, SupportedCustomArchitectures = [Architecture.x86, Architecture.x64, Architecture.arm64], SupportsCustomScopes = true, From f8149131b6472d2c2a3c9df402e24142648b134e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Mon, 7 Jul 2025 23:48:41 +0200 Subject: [PATCH 7/8] Add dependencies for all NuGet-based package managers --- .../Chocolatey.cs | 1 + .../DotNet.cs | 1 + .../BaseNuGet.cs | 15 +++++++-------- .../BaseNuGetDetailsHelper.cs | 14 ++++++++++++++ .../Helpers/NpmPkgDetailsHelper.cs | 1 - .../Helpers/PipPkgDetailsHelper.cs | 1 + .../PowerShell.cs | 1 + .../PowerShell7.cs | 1 + .../Helpers/ScoopPkgDetailsHelper.cs | 1 + .../Helpers/VcpkgPkgDetailsHelper.cs | 1 + 10 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 406a924dbb..e16bc0b086 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -32,6 +32,7 @@ public Chocolatey() CanSkipIntegrityChecks = true, CanRunInteractively = true, SupportsCustomVersions = true, + CanListDependencies = true, SupportsCustomArchitectures = true, SupportedCustomArchitectures = [Architecture.x86], SupportsPreRelease = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index 2d988d182f..fd5ef25d2f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -30,6 +30,7 @@ public DotNet() SupportsCustomArchitectures = true, SupportedCustomArchitectures = [Architecture.x86, Architecture.x64, Architecture.arm64, Architecture.arm32], SupportsPreRelease = true, + CanListDependencies = true, SupportsCustomLocations = true, SupportsCustomPackageIcons = true, SupportsCustomVersions = true, diff --git a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGet.cs b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGet.cs index fd6d36351b..e162d67d9f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGet.cs @@ -18,20 +18,19 @@ public abstract class BaseNuGet : PackageManager public sealed override void Initialize() { - if (DetailsHelper is not BaseNuGetDetailsHelper) + static void ThrowIC(string name) { - throw new InvalidOperationException("NuGet-based package managers must not reassign the PackageDetailsProvider property"); + throw new InvalidOperationException($"NuGet-based package managers must have Capabilities.{name} set to true"); } - if (!Capabilities.SupportsCustomVersions) + if (DetailsHelper is not BaseNuGetDetailsHelper) { - throw new InvalidOperationException("NuGet-based package managers must support custom versions"); + throw new InvalidOperationException("NuGet-based package managers must not reassign the PackageDetailsProvider property"); } - if (!Capabilities.SupportsCustomPackageIcons) - { - throw new InvalidOperationException("NuGet-based package managers must support custom versions"); - } + if (!Capabilities.SupportsCustomVersions) ThrowIC(nameof(Capabilities.SupportsCustomVersions)); + if (!Capabilities.SupportsCustomPackageIcons) ThrowIC(nameof(Capabilities.SupportsCustomPackageIcons)); + if (!Capabilities.CanListDependencies) ThrowIC(nameof(Capabilities.CanListDependencies)); base.Initialize(); } diff --git a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs index 6f7eba03ab..8ffa031500 100644 --- a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs @@ -107,6 +107,20 @@ protected override void GetDetails_UnSafe(IPackageDetails details) break; } + details.Dependencies.Clear(); + foreach (Match match in Regex.Matches(PackageManifestContents, + @"([^<]+)")) + { + foreach (var dep in match.Groups[1].ToString().Split('|')) + { + details.Dependencies.Add(new() + { + Name = dep.Split(':')[0], Version = dep.Split(':')[1].TrimEnd(':'), Mandatory = true + }); + } + } + + logger.Close(0); return; } diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs index 114204f1e0..f21adf92e9 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Helpers/NpmPkgDetailsHelper.cs @@ -62,7 +62,6 @@ protected override void GetDetails_UnSafe(IPackageDetails details) details.InstallerHash = contents?["dist"]?["integrity"]?.ToString(); details.Dependencies.Clear(); - HashSet addedDeps = new(); foreach (var rawDep in (contents?["dependencies"]?.AsObject() ?? [])) { diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs index 8a0b48dfd0..3748500f85 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Helpers/PipPkgDetailsHelper.cs @@ -56,6 +56,7 @@ protected override void GetDetails_UnSafe(IPackageDetails details) details.Tags = Tags.ToArray(); } + details.Dependencies.Clear(); foreach (var rawDep in (info?["requires_dist"]?.AsArray() ?? [])) { string line = rawDep?.GetValue().Split(';')[0] ?? ""; diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 02ebe707f8..226daea319 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -25,6 +25,7 @@ public PowerShell() SupportsCustomVersions = true, CanDownloadInstaller = true, SupportsCustomScopes = true, + CanListDependencies = true, SupportsCustomSources = true, SupportsPreRelease = true, SupportsCustomPackageIcons = true, diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index c8c353a81a..28a88538b4 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -26,6 +26,7 @@ public PowerShell7() SupportsCustomSources = true, SupportsPreRelease = true, CanDownloadInstaller = true, + CanListDependencies = true, SupportsCustomPackageIcons = true, CanUninstallPreviousVersionsAfterUpdate = true, Sources = new SourceCapabilities diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs index 171e88ec88..bdd068b5cb 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Helpers/ScoopPkgDetailsHelper.cs @@ -157,6 +157,7 @@ protected override void GetDetails_UnSafe(IPackageDetails details) out var releaseNotesUrl)) details.ReleaseNotesUrl = releaseNotesUrl; + details.Dependencies.Clear(); _getDepends(details, contents); _getSuggests(details, contents); diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs index 251f42307f..e11e9d6618 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Helpers/VcpkgPkgDetailsHelper.cs @@ -54,6 +54,7 @@ protected override void GetDetails_UnSafe(IPackageDetails details) details.Tags = Tags.ToArray(); + details.Dependencies.Clear(); foreach (var iDep in contents?["dependencies"]?.AsArray() ?? []) { string? val = iDep?.GetValue(); From d0cb1f5b31fe8997e6b180d39129e0bfe552acc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Tue, 8 Jul 2025 00:07:54 +0200 Subject: [PATCH 8/8] UI improvements to dependencies list --- .../BaseNuGetDetailsHelper.cs | 7 ++- .../Pages/DialogPages/PackageDetailsPage.xaml | 5 ++- .../DialogPages/PackageDetailsPage.xaml.cs | 43 +++++++++++++++---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs index 8ffa031500..6a9faf4a71 100644 --- a/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsHelper.cs @@ -113,7 +113,12 @@ protected override void GetDetails_UnSafe(IPackageDetails details) { foreach (var dep in match.Groups[1].ToString().Split('|')) { - details.Dependencies.Add(new() + if(string.IsNullOrEmpty(dep)) + continue; + else if (dep.StartsWith("::")) + details.Dependencies.Add(new() { Name = dep.TrimStart(':'), Version = "", Mandatory = true }); + else + details.Dependencies.Add(new() { Name = dep.Split(':')[0], Version = dep.Split(':')[1].TrimEnd(':'), Mandatory = true }); diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml index 01efcdd7ce..74737375fe 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml @@ -328,8 +328,9 @@ Dependencies: - Helo - + + + Release Notes: Helo diff --git a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs index 5d8a9bd662..0382817943 100644 --- a/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs +++ b/src/UniGetUI/Pages/DialogPages/PackageDetailsPage.xaml.cs @@ -96,7 +96,8 @@ public PackageDetailsPage(IPackage package, OperationType role, TEL_InstallRefer SetTextToItem(UpdateDate_Label, CoreTools.Translate("Last updated:") + " "); SetTextToItem(UpdateDate_Content, LoadingString); SetTextToItem(Dependencies_Label, CoreTools.Translate("Dependencies:") + " "); - SetTextToItem(Dependencies_Content, LoadingString); + DependenciesParagraph.Inlines.Clear(); + DependenciesParagraph.Inlines.Add(new Run() { Text = LoadingString, Foreground = new SolidColorBrush(color: Color.FromArgb(255, 127, 127, 127)), }); SetTextToItem(ReleaseNotes_Label, CoreTools.Translate("Release notes") + ": "); SetTextToItem(ReleaseNotes_Content, LoadingString); SetTextToItem(ReleaseNotesUrl_Label, CoreTools.Translate("Release notes URL") + ": "); @@ -377,22 +378,48 @@ public async Task LoadInformation() if (!details.Package.Manager.Capabilities.CanListDependencies) { - SetTextToItem(Dependencies_Content, null); + DependenciesParagraph.Inlines.Clear(); + DependenciesParagraph.Inlines.Add(new Run() + { + Text = CoreTools.Translate("Not available"), + Foreground = new SolidColorBrush(color: Color.FromArgb(255, 127, 127, 127)), + }); } else if (details.Dependencies.Any()) { - StringBuilder depsString = new("\n"); + DependenciesParagraph.Inlines.Clear(); + foreach (var dep in details.Dependencies) { - depsString.Append($"  • {dep.Name} ("); - if (dep.Version.Any()) depsString.Append(CoreTools.Translate("Version:") + $" {dep.Version}, "); - depsString.Append($"{(dep.Mandatory ? CoreTools.Translate("mandatory") : CoreTools.Translate("optional"))})\n"); + DependenciesParagraph.Inlines.Add(new Run() + { + Text = $"  • {dep.Name}", + FontStyle = dep.Mandatory? FontStyle.Normal : FontStyle.Italic, + FontWeight = new FontWeight(600) + }); + + string line = $" ("; + if (dep.Version.Any()) line += CoreTools.Translate("Version:") + $" {dep.Version}, "; + line += $"{(dep.Mandatory ? CoreTools.Translate("mandatory") : CoreTools.Translate("optional"))})"; + + DependenciesParagraph.Inlines.Add(new Run() + { + Text = line, + FontStyle = dep.Mandatory? FontStyle.Normal : FontStyle.Italic, + }); + DependenciesParagraph.Inlines.Add(new LineBreak()); } - SetTextToItem(Dependencies_Content, depsString.ToString().TrimEnd('\n')); + if(DependenciesParagraph.Inlines.Any() && DependenciesParagraph.Inlines.Last() is LineBreak) + DependenciesParagraph.Inlines.RemoveAt(DependenciesParagraph.Inlines.Count-1); } else { - SetTextToItem(Dependencies_Content, CoreTools.Translate("No dependencies specified")); + DependenciesParagraph.Inlines.Clear(); + DependenciesParagraph.Inlines.Add(new Run() + { + Text = CoreTools.Translate("\tNo dependencies specified"), + Foreground = new SolidColorBrush(color: Color.FromArgb(255, 127, 127, 127)), + }); } ShowableTags.Clear();