in src/NuGet.Clients/NuGet.PackageManagement.UI/Models/PackageDetailControlModel.cs [121:231]
protected override Task CreateVersionsAsync(CancellationToken cancellationToken)
{
// The value will be null if the server does not return any versions.
if (_allPackageVersions == null || _allPackageVersions.Count == 0)
{
return Task.CompletedTask;
}
Versions.Clear();
var installedDependency = InstalledPackageDependencies.Where(p =>
StringComparer.OrdinalIgnoreCase.Equals(p.Id, Id) && p.VersionRange != null && p.VersionRange.HasLowerBound)
.OrderByDescending(p => p.VersionRange.MinVersion)
.FirstOrDefault();
// installVersion is null if the package is not installed
var installedVersion = installedDependency?.VersionRange;
List<(NuGetVersion version, bool isDeprecated, bool isVulnerable)> allVersions = _allPackageVersions?.OrderByDescending(v => v.version).ToList();
// null, if no version constraint defined in package.config
VersionRange allowedVersions = _projectVersionConstraints.Select(e => e.VersionRange).FirstOrDefault();
// null, if all versions are allowed to be install or update
var blockedVersions = new List<NuGetVersion>(allVersions.Count);
List<(NuGetVersion version, bool isDeprecated, bool isVulnerable)> allVersionsAllowed;
if (allowedVersions == null)
{
allowedVersions = VersionRange.All;
allVersionsAllowed = allVersions;
}
else
{
allVersionsAllowed = allVersions.Where(v => allowedVersions.Satisfies(v.version)).ToList();
foreach ((NuGetVersion version, bool isDeprecated, bool isVulnerable) in allVersions)
{
if (!allVersionsAllowed.Any(a => a.version.Version.Equals(version.Version)))
{
blockedVersions.Add(version);
}
}
}
var latestPrerelease = allVersionsAllowed.FirstOrDefault(v => v.version.IsPrerelease);
var latestStableVersion = allVersionsAllowed.FirstOrDefault(v => !v.version.IsPrerelease);
// Add installed version if the project is PackageReference
if (_nugetProjects.Any() && installedDependency != null && installedDependency.VersionRange.OriginalString != null && _nugetProjects.First().ProjectStyle.Equals(ProjectModel.ProjectStyle.PackageReference))
{
VersionRange installedVersionRange = VersionRange.Parse(installedDependency.VersionRange.OriginalString, true);
NuGetVersion bestVersion = installedVersionRange.FindBestMatch(allVersionsAllowed.Select(v => v.version));
var deprecationInfo = allVersionsAllowed.FirstOrDefault(v => v.version == bestVersion).isDeprecated;
var vulnerableInfo = allVersionsAllowed.FirstOrDefault(v => v.version == bestVersion).isVulnerable;
DisplayVersion displayVersion = new DisplayVersion(installedVersionRange, bestVersion, additionalInfo: string.Empty, isDeprecated: deprecationInfo, isVulnerable: vulnerableInfo);
_versions.Add(displayVersion);
}
var isInstalledFloatingOrRange = installedVersion != null && installedVersion.IsFloating || (installedVersion?.OriginalString != null &&
(installedVersion.OriginalString.StartsWith("(", StringComparison.OrdinalIgnoreCase) || installedVersion.OriginalString.StartsWith("[", StringComparison.OrdinalIgnoreCase)));
// Add latest prerelease if neeeded
if (latestPrerelease.version != null
&& (latestStableVersion.version == null || latestPrerelease.version > latestStableVersion.version) &&
(isInstalledFloatingOrRange || !latestPrerelease.version.Equals(installedVersion?.MinVersion)))
{
VersionRange latestPrereleaseVersionRange = VersionRange.Parse(latestPrerelease.version.ToString(), allowFloating: false);
_versions.Add(new DisplayVersion(latestPrereleaseVersionRange, latestPrerelease.version, Resources.Version_LatestPrerelease, isDeprecated: latestPrerelease.isDeprecated, isVulnerable: latestPrerelease.isVulnerable));
}
// Add latest stable if needed
if (latestStableVersion.version != null &&
(isInstalledFloatingOrRange || !latestStableVersion.version.Equals(InstalledVersion)))
{
VersionRange latestStableVersionRange = VersionRange.Parse(latestStableVersion.version.ToString(), allowFloating: false);
_versions.Add(new DisplayVersion(latestStableVersionRange, latestStableVersion.version, Resources.Version_LatestStable, isDeprecated: latestStableVersion.isDeprecated, isVulnerable: latestStableVersion.isVulnerable));
}
// add a separator
if (_versions.Count > 0)
{
_versions.Add(null);
}
// first add all the available versions to be updated
foreach (var version in allVersionsAllowed)
{
var installed = version.version.Equals(InstalledVersion);
var autoReferenced = false;
if (installed && _projectVersionConstraints.Any(e => e.IsAutoReferenced && e.VersionRange?.Satisfies(version.version) == true))
{
// do not allow auto referenced packages
autoReferenced = true;
}
VersionRange versionRange = VersionRange.Parse(version.version.ToString(), allowFloating: false);
_versions.Add(new DisplayVersion(versionRange, version.version, additionalInfo: null, isCurrentInstalled: installed, autoReferenced: autoReferenced, isDeprecated: version.isDeprecated, isVulnerable: version.isVulnerable));
}
// Disable controls if this is an auto referenced package.
SetAutoReferencedCheck(InstalledVersion);
// Add disabled versions
AddBlockedVersions(blockedVersions);
var latestVersion = latestPrerelease.version > latestStableVersion.version ? latestPrerelease.version : latestStableVersion.version;
SelectVersion(latestVersion);
return Task.CompletedTask;
}