From c473cc562fb7e21860b521ff2d7f93f1e919d39b Mon Sep 17 00:00:00 2001 From: Igor Stojkovic Date: Wed, 15 Apr 2026 15:18:03 +0200 Subject: [PATCH] Added support for update release notes in APIv3 --- .../Editor/Models/NugetPackageV3.cs | 9 ++++++- .../Editor/PackageSource/NugetApiClientV3.cs | 25 ++++++++++++++++--- .../PackageSource/NugetPackageSourceV3.cs | 2 +- src/NuGetForUnity/Editor/Ui/NugetWindow.cs | 7 +++++- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/NuGetForUnity/Editor/Models/NugetPackageV3.cs b/src/NuGetForUnity/Editor/Models/NugetPackageV3.cs index c56cf26b..dd28706f 100644 --- a/src/NuGetForUnity/Editor/Models/NugetPackageV3.cs +++ b/src/NuGetForUnity/Editor/Models/NugetPackageV3.cs @@ -61,6 +61,10 @@ internal sealed class NugetPackageV3 : NugetPackageIdentifier, INugetPackage, IS [NotNull] private NugetPackageSourceV3 packageSource; + [SerializeField] + [NotNull] + private string releaseNotes; + /// /// Initializes a new instance of the class. /// @@ -75,6 +79,7 @@ internal sealed class NugetPackageV3 : NugetPackageIdentifier, INugetPackage, IS /// The short summary. /// The human readable title. /// The URL where the icon can be downloaded. + /// Release notes from the currently installed version. /// All available versions. public NugetPackageV3( [NotNull] string id, @@ -88,6 +93,7 @@ public NugetPackageV3( [CanBeNull] string summary, [CanBeNull] string title, [CanBeNull] string iconUrl, + string releaseNotes, List versions) : base(id, version) { @@ -100,6 +106,7 @@ public NugetPackageV3( Summary = summary; Title = title; this.iconUrl = iconUrl; + this.releaseNotes = releaseNotes; Versions = versions; } @@ -178,7 +185,7 @@ public Task IconTask } /// - public string ReleaseNotes => string.Empty; + public string ReleaseNotes => releaseNotes; /// public RepositoryType RepositoryType => RepositoryType.NotSpecified; diff --git a/src/NuGetForUnity/Editor/PackageSource/NugetApiClientV3.cs b/src/NuGetForUnity/Editor/PackageSource/NugetApiClientV3.cs index 8ba3ca3b..16f709a5 100644 --- a/src/NuGetForUnity/Editor/PackageSource/NugetApiClientV3.cs +++ b/src/NuGetForUnity/Editor/PackageSource/NugetApiClientV3.cs @@ -246,11 +246,13 @@ public async Task DownloadNupkgToFileAsync( /// /// The package source that owns this client. /// The package identifier to receive including the details. + /// True to include prerelease packages (alpha, beta, etc). /// Token to cancel the HTTP request. /// The package or null if we didn't find it. public async Task GetPackageWithAllVersionsAsync( NugetPackageSourceV3 packageSource, INugetPackageIdentifier package, + bool includePrerelease, CancellationToken cancellationToken = default) { var registrationItems = await GetRegistrationPageItemsAsync(packageSource, package, cancellationToken); @@ -262,6 +264,7 @@ public async Task GetPackageWithAllVersionsAsync( var versions = new List(); RegistrationLeafObject latestVersionItem = null; NugetPackageVersion latestVersion = null; + var sb = new StringBuilder(); foreach (var item in registrationItems) { if (item.items is null || item.items.Count == 0) @@ -269,6 +272,7 @@ public async Task GetPackageWithAllVersionsAsync( item.items = await GetRegistrationPageLeafItems(packageSource, item, cancellationToken).ConfigureAwait(false); } + var lastNote = string.Empty; foreach (var leafObject in item.items) { var catalogEntry = leafObject.CatalogEntry; @@ -280,7 +284,11 @@ public async Task GetPackageWithAllVersionsAsync( } var version = new NugetPackageVersion(catalogEntry.version); - versions.Add(version); + if (includePrerelease || !version.IsPrerelease) + { + versions.Add(version); + } + if (latestVersion != null && version <= latestVersion) { continue; @@ -288,11 +296,16 @@ public async Task GetPackageWithAllVersionsAsync( latestVersion = version; latestVersionItem = leafObject; + if (!string.IsNullOrWhiteSpace(catalogEntry.releaseNotes) && lastNote != catalogEntry.releaseNotes && version > package.PackageVersion) + { + sb.Append(catalogEntry.releaseNotes).Append("\n"); + lastNote = catalogEntry.releaseNotes; + } } } versions.Sort((v1, v2) => v2.CompareTo(v1)); - return CreatePackageFromRegistrationLeaf(packageSource, latestVersionItem, versions); + return CreatePackageFromRegistrationLeaf(packageSource, latestVersionItem, sb.ToString(), versions); } /// @@ -314,7 +327,7 @@ public async Task GetPackageWithDetailsAsync( return null; } - return CreatePackageFromRegistrationLeaf(packageSource, leafItem); + return CreatePackageFromRegistrationLeaf(packageSource, leafItem, leafItem.CatalogEntry.releaseNotes); } /// @@ -343,6 +356,7 @@ public async Task> GetPackageDetailsAsync( private static NugetPackageV3 CreatePackageFromRegistrationLeaf( NugetPackageSourceV3 packageSource, RegistrationLeafObject leafItem, + string releaseNotes, List allVersions = null) { var entry = leafItem.CatalogEntry; @@ -368,6 +382,7 @@ private static NugetPackageV3 CreatePackageFromRegistrationLeaf( entry.summary, entry.title, entry.iconUrl, + releaseNotes, allVersions ?? new List { new NugetPackageVersion(entry.version) }) { DownloadUrl = leafItem.packageContent, Dependencies = ConvertDependencyGroups(entry), @@ -443,6 +458,7 @@ private static List SearchResultToNugetPackages(List /// The security vulnerabilities of the package. /// diff --git a/src/NuGetForUnity/Editor/PackageSource/NugetPackageSourceV3.cs b/src/NuGetForUnity/Editor/PackageSource/NugetPackageSourceV3.cs index 16f26afd..df74c107 100644 --- a/src/NuGetForUnity/Editor/PackageSource/NugetPackageSourceV3.cs +++ b/src/NuGetForUnity/Editor/PackageSource/NugetPackageSourceV3.cs @@ -264,7 +264,7 @@ public List GetUpdates( var fetchedPackages = await Task.WhenAll( packagesToFetch.Select(package => - ApiClient.GetPackageWithAllVersionsAsync(this, package, CancellationToken.None))) + ApiClient.GetPackageWithAllVersionsAsync(this, package, includePrerelease, CancellationToken.None))) .ConfigureAwait(false); return fetchedPackages.Where(fetchedPackage => !(fetchedPackage is null)).ToList(); } diff --git a/src/NuGetForUnity/Editor/Ui/NugetWindow.cs b/src/NuGetForUnity/Editor/Ui/NugetWindow.cs index 9e4b621b..d118c320 100644 --- a/src/NuGetForUnity/Editor/Ui/NugetWindow.cs +++ b/src/NuGetForUnity/Editor/Ui/NugetWindow.cs @@ -938,6 +938,7 @@ private void DrawUpdatesHeader() { showPrereleaseUpdates = showPrereleaseTemp; UpdateUpdatePackages(); + versionDropdownDataPerPackage.Clear(); } var showDowngradesTemp = GUILayout.Toggle( @@ -1290,7 +1291,11 @@ private void DrawPackage(INugetPackage package, GUIStyle backgroundStyle, bool c if (!string.IsNullOrEmpty(package.ReleaseNotes)) { EditorGUILayout.LabelField("Release Notes", EditorStyles.boldLabel); - EditorGUILayout.LabelField(package.ReleaseNotes); + var releaseNotesContent = new GUIContent(package.ReleaseNotes); + var releaseNotesRect = EditorGUILayout.GetControlRect( + true, + labelStyle.CalcHeight(releaseNotesContent, EditorGUIUtility.currentViewWidth - 20f) + 12f); + EditorGUI.LabelField(releaseNotesRect, releaseNotesContent, labelStyle); GUILayout.Space(4f); }