From 457f6ec0798910707899bd2fd6c1cd0beea7ed7d Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 18 Nov 2024 15:50:42 -0600 Subject: [PATCH 1/4] Optimize vcpkg GetSource_UnSafe --- .../Providers/VcpkgSourceProvider.cs | 17 ++++------------- .../Vcpkg.cs | 1 - 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgSourceProvider.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgSourceProvider.cs index c468b169f3..4c26632d60 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgSourceProvider.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgSourceProvider.cs @@ -27,19 +27,10 @@ protected override OperationVeredict _getRemoveSourceOperationVeredict(IManagerS protected override IEnumerable GetSources_UnSafe() { List Sources = []; - // Retrieve all triplets on the system (in %VCPKG_ROOT%\triplets{\community}) - var (vcpkgRootFound, vcpkgRoot) = Vcpkg.GetVcpkgRoot(); - if (vcpkgRootFound) - { - string tripletLocation = Path.Join(vcpkgRoot, "triplets"); - string communityTripletLocation = Path.Join(vcpkgRoot, "triplets", "community"); - - foreach (string tripletFile in Directory.EnumerateFiles(tripletLocation).Concat(Directory.EnumerateFiles(communityTripletLocation))) - { - string triplet = Path.GetFileNameWithoutExtension(tripletFile); - Sources.Add(new ManagerSource(Manager, triplet, Vcpkg.URI_VCPKG_IO)); - } - } + + foreach (string Triplet in Vcpkg.GetSystemTriplets()) { + Sources.Add(new ManagerSource(Manager, Triplet, Vcpkg.URI_VCPKG_IO)); + } return Sources; } diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index f739998f68..1db14af0bf 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -343,7 +343,6 @@ public override void RefreshPackageIndexes() var (vcpkgRootFound, vcpkgRoot) = GetVcpkgRoot(); var (gitFound, gitPath) = CoreTools.Which("git"); - // TODO: Check if Settings.Get("DisableUpdateVcpkgGitPorts") is still needed if (!found || !gitFound || !vcpkgRootFound || Settings.Get("DisableUpdateVcpkgGitPorts")) { INativeTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.RefreshIndexes); From 92f1d484cd06035812b12a76736be0a72d684fd3 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 18 Nov 2024 17:30:03 -0600 Subject: [PATCH 2/4] Add vcpkg package details --- .../Providers/VcpkgPackageDetailsProvider.cs | 87 +++++++++++++++++++ .../Vcpkg.cs | 1 + 2 files changed, 88 insertions(+) create mode 100644 src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs new file mode 100644 index 0000000000..3c71679d37 --- /dev/null +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs @@ -0,0 +1,87 @@ +using System.Diagnostics; +using System.Text.Json.Nodes; +using UniGetUI.Core.Data; +using UniGetUI.Core.SettingsEngine; +using UniGetUI.Core.IconEngine; +using UniGetUI.Core.Logging; +using UniGetUI.Core.Tools; +using UniGetUI.PackageEngine.Classes.Manager.BaseProviders; +using UniGetUI.PackageEngine.Enums; +using UniGetUI.PackageEngine.Interfaces; +using UniGetUI.PackageEngine.ManagerClasses.Classes; +using UniGetUI.PackageEngine.ManagerClasses.Manager; + +namespace UniGetUI.PackageEngine.Managers.VcpkgManager +{ + internal sealed class VcpkgPackageDetailsProvider : BasePackageDetailsProvider + { + public VcpkgPackageDetailsProvider(Vcpkg manager) : base(manager) { } + + protected override void GetDetails_UnSafe(IPackageDetails details) + { + INativeTaskLogger logger = Manager.TaskLogger.CreateNew(LoggableTaskType.LoadPackageDetails); + + const string VCPKG_REPO = "microsoft/vcpkg"; + const string VCPKG_PORT_PATH = "master/ports"; + const string VCPKG_PORT_FILE = "vcpkg.json"; + string PackagePrefix = details.Package.Id.Split(":")[0]; + string PackageName = PackagePrefix.Split("[")[0]; + + string JsonString; + HttpClient client = new(CoreData.GenericHttpClientParameters); + client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreData.UserAgentString); + JsonString = client.GetStringAsync($"https://raw.githubusercontent.com/{VCPKG_REPO}/refs/heads/{VCPKG_PORT_PATH}/{PackageName}/{VCPKG_PORT_FILE}").GetAwaiter().GetResult(); + + JsonObject? contents = JsonNode.Parse(JsonString) as JsonObject; + + details.Description = contents?["description"]?.ToString(); + details.Publisher = contents?["maintainers"]?.ToString(); + // vcpkg doesn't store the author, for some reason??? + if (Uri.TryCreate(contents?["homepage"]?.ToString(), UriKind.RelativeOrAbsolute, out var homepageUrl)) + details.HomepageUrl = homepageUrl; + details.License = contents?["license"]?.ToString(); + details.ManifestUrl = new Uri($"https://github.com/{VCPKG_REPO}/blob/{VCPKG_PORT_PATH}/{PackageName}/{VCPKG_PORT_FILE}"); + // TODO: since each change results in a new commit to the file, you could determine the `UpdateDate` via figuring out the date of the last commit that changed the file was. + // Unfortunately, the GitHub API doesn't seem to allow getting the commit that changed a file, but you can get the date of a commit with + // https://api.github.com/repos/{VCPKG_REPO}/commits/{CommitHash} + + List Tags = []; + if (contents?["supports"] != null) + { + Tags.Add(contents?["supports"]?.ToString()); + } + // TODO: the "features" and "dependencies" keys could also be good candgidates for tags, however their type specifications are all over - + // strings, dictionaries, arrays - so one would first have to figure out how to handle that. + // See https://learn.microsoft.com/en-us/vcpkg/reference/vcpkg-json + if (PackagePrefix.Contains("[")) + { + Tags.Add("library: " + PackagePrefix[..PackagePrefix.IndexOf("[")]); + Tags.Add("feature: " + PackagePrefix[(PackagePrefix.IndexOf("[") + 1)..PackagePrefix.IndexOf("]")]); + } + + details.Tags = Tags.ToArray(); + + logger.Close(0); + } + + protected override CacheableIcon? GetIcon_UnSafe(IPackage package) + { + throw new NotImplementedException(); + } + + protected override IEnumerable GetScreenshots_UnSafe(IPackage package) + { + throw new NotImplementedException(); + } + + protected override string? GetInstallLocation_UnSafe(IPackage package) + { + throw new NotImplementedException(); + } + + protected override IEnumerable GetInstallableVersions_UnSafe(IPackage package) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 1db14af0bf..ddf2c1b0ac 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -76,6 +76,7 @@ public Vcpkg() }; SourceProvider = new VcpkgSourceProvider(this); + PackageDetailsProvider = new VcpkgPackageDetailsProvider(this); OperationProvider = new VcpkgOperationProvider(this); } From 50eab69acaf6d095c9922ebfd0168ecc902e6a8e Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 18 Nov 2024 17:44:46 -0600 Subject: [PATCH 3/4] Add the vcpkg package install location --- .../Providers/VcpkgPackageDetailsProvider.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs index 3c71679d37..de9cc4fd36 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Text.Json.Nodes; +using System.Text.RegularExpressions; using UniGetUI.Core.Data; using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.IconEngine; @@ -76,7 +77,16 @@ protected override IEnumerable GetScreenshots_UnSafe(IPackage package) protected override string? GetInstallLocation_UnSafe(IPackage package) { - throw new NotImplementedException(); + var (rootFound, rootPath) = Vcpkg.GetVcpkgRoot(); + if (!rootFound) + { + return null; + } + + string PackageId = Regex.Replace(package.Id.Replace(":", "_"), @"\[.*\]", String.Empty); + var PackagePath = Path.Join(rootPath, "packages", PackageId); + var VcpkgInstalledPath = Path.Join(rootPath, "installed", package.Id.Split(":")[1]); + return Directory.Exists(PackagePath) ? PackagePath : (Directory.Exists(VcpkgInstalledPath) ? VcpkgInstalledPath : Path.GetDirectoryName(PackageId)); } protected override IEnumerable GetInstallableVersions_UnSafe(IPackage package) From 22a83f0a47c75045647cd2a90c67ea85ae64bf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 20 Nov 2024 22:05:45 +0100 Subject: [PATCH 4/4] Improve redundant diccionary accesses, improvements for non-ascii characters when fetching tags --- .../Providers/VcpkgPackageDetailsProvider.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs index de9cc4fd36..7e1378e6ed 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Providers/VcpkgPackageDetailsProvider.cs @@ -45,21 +45,17 @@ protected override void GetDetails_UnSafe(IPackageDetails details) // TODO: since each change results in a new commit to the file, you could determine the `UpdateDate` via figuring out the date of the last commit that changed the file was. // Unfortunately, the GitHub API doesn't seem to allow getting the commit that changed a file, but you can get the date of a commit with // https://api.github.com/repos/{VCPKG_REPO}/commits/{CommitHash} - + List Tags = []; - if (contents?["supports"] != null) - { - Tags.Add(contents?["supports"]?.ToString()); - } // TODO: the "features" and "dependencies" keys could also be good candgidates for tags, however their type specifications are all over - // strings, dictionaries, arrays - so one would first have to figure out how to handle that. // See https://learn.microsoft.com/en-us/vcpkg/reference/vcpkg-json - if (PackagePrefix.Contains("[")) + if (PackagePrefix.Contains('[')) { - Tags.Add("library: " + PackagePrefix[..PackagePrefix.IndexOf("[")]); - Tags.Add("feature: " + PackagePrefix[(PackagePrefix.IndexOf("[") + 1)..PackagePrefix.IndexOf("]")]); + Tags.Add($"{CoreTools.Translate("library")}: " + PackageName); + Tags.Add($"{CoreTools.Translate("feature")}: " + PackagePrefix.Split('[')[^1][..^1]); } - + details.Tags = Tags.ToArray(); logger.Close(0); @@ -82,7 +78,7 @@ protected override IEnumerable GetScreenshots_UnSafe(IPackage package) { return null; } - + string PackageId = Regex.Replace(package.Id.Replace(":", "_"), @"\[.*\]", String.Empty); var PackagePath = Path.Join(rootPath, "packages", PackageId); var VcpkgInstalledPath = Path.Join(rootPath, "installed", package.Id.Split(":")[1]);