From 46e6ff5f67cb39d079dedcae5f73a2fdc0b4b8d5 Mon Sep 17 00:00:00 2001 From: nick863 <30440255+nick863@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:41:04 -0700 Subject: [PATCH 1/2] Fix resolution of the external dependencies. --- .../ExternalTypeReferenceResolver.cs | 30 ++++++++++++++++--- .../src/Utilities/NugetPackageResolver.cs | 16 ++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/ExternalTypeReferenceResolver.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/ExternalTypeReferenceResolver.cs index e66fbdc2c5a..eaed372b225 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/ExternalTypeReferenceResolver.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/ExternalTypeReferenceResolver.cs @@ -5,6 +5,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; @@ -12,6 +13,7 @@ using Microsoft.CodeAnalysis; using Microsoft.TypeSpec.Generator.Input; using NuGet.Configuration; +using NuGet.Versioning; namespace Microsoft.TypeSpec.Generator.Utilities { @@ -238,10 +240,30 @@ private static async Task ResolveResultAsync(InputExternalType { try { - var resolvedVersion = !string.IsNullOrEmpty(external.MinVersion) - ? external.MinVersion! - : await NugetPackageResolver.ResolveLatestPackageVersion(external.Package!, nugetSettings); - + string? resolvedVersion; + // Search for the compatible version. + if (!string.IsNullOrEmpty(external.MinVersion)) + { + // If min version was provided, we + // 1. Search if it is in our repositories; + // 2. Get the latest one if it is not. + // 3. If our version is a pre release, include pre released versions in our search. + NuGetVersion minVersion = new(external.MinVersion); + IList versions = await NugetPackageResolver.GetAllVersions(external.Package!, nugetSettings, allowPrerelease: minVersion.IsPrerelease); + if (versions.Any(x => x == minVersion)) + { + resolvedVersion = external.MinVersion; + } + else + { + resolvedVersion = versions.Max()?.ToString(); + } + } + else + { + // If min version was not provided, get the latest stable version. + resolvedVersion = await NugetPackageResolver.ResolveLatestPackageVersion(external.Package!, nugetSettings); + } if (!string.IsNullOrEmpty(resolvedVersion)) { var downloader = new NugetPackageDownloader(external.Package!, resolvedVersion!, null, nugetSettings); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs index 2c2883a3534..7174b75a8c2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using NuGet.Configuration; using NuGet.Frameworks; +using NuGet.Packaging; using NuGet.Protocol; using NuGet.Protocol.Core.Types; using NuGet.Repositories; @@ -202,6 +203,21 @@ private static NuGetFramework ResolveCurrentFramework() return null; } + public static async Task> GetAllVersions(string packageName, ISettings nugetSettings, bool allowPrerelease) + { + List versions = []; + var sources = SettingsUtility.GetEnabledSources(nugetSettings); + using var cacheContext = new SourceCacheContext(); + foreach (var source in sources) + { + var repository = Repository.Factory.GetCoreV3(source.Source); + var resource = await repository.GetResourceAsync(); + IEnumerable versionsFromOneRepo = (await resource.GetAllVersionsAsync(packageName, cacheContext, NuGet.Common.NullLogger.Instance, CancellationToken.None)).Where(v => !v.IsPrerelease || allowPrerelease); + versions.AddRange(versionsFromOneRepo); + } + return versions; + } + /// /// Queries the configured NuGet feeds for the latest stable version of . /// When is provided, the latest stable version greater than or equal to it From 6a3f53067febfd09de8f01077c1c37df33cc9e85 Mon Sep 17 00:00:00 2001 From: nick863 <30440255+nick863@users.noreply.github.com> Date: Fri, 21 Aug 2026 17:22:44 -0700 Subject: [PATCH 2/2] Fix --- .../src/Utilities/NugetPackageResolver.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs index 7174b75a8c2..ab8de1f4e93 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/NugetPackageResolver.cs @@ -205,17 +205,24 @@ private static NuGetFramework ResolveCurrentFramework() public static async Task> GetAllVersions(string packageName, ISettings nugetSettings, bool allowPrerelease) { - List versions = []; + HashSet versions = []; var sources = SettingsUtility.GetEnabledSources(nugetSettings); using var cacheContext = new SourceCacheContext(); foreach (var source in sources) { - var repository = Repository.Factory.GetCoreV3(source.Source); - var resource = await repository.GetResourceAsync(); - IEnumerable versionsFromOneRepo = (await resource.GetAllVersionsAsync(packageName, cacheContext, NuGet.Common.NullLogger.Instance, CancellationToken.None)).Where(v => !v.IsPrerelease || allowPrerelease); - versions.AddRange(versionsFromOneRepo); + try + { + var repository = Repository.Factory.GetCoreV3(source.Source); + var resource = await repository.GetResourceAsync(); + IEnumerable versionsFromOneRepo = (await resource.GetAllVersionsAsync(packageName, cacheContext, NuGet.Common.NullLogger.Instance, CancellationToken.None)).Where(v => !v.IsPrerelease || allowPrerelease); + versions.AddRange(versionsFromOneRepo); + } + catch + { + // Skip failed source. + } } - return versions; + return [..versions]; } ///