| File: Resolution\GatherExceptionHelpers.cs | Web Access |
| Project: src\nuget-client\src\NuGet.Core\NuGet.PackageManagement\NuGet.PackageManagement.csproj (NuGet.PackageManagement) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #nullable disable using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using NuGet.Common; using NuGet.Packaging.Core; namespace NuGet.PackageManagement { public static class GatherExceptionHelpers { /// <summary> /// Throw if packages.config contains an AllowedVersions entry for the target, /// and no packages outside of that range have been found. /// </summary> /// <param name="target">target package id</param> /// <param name="packagesConfig">entries from packages.config</param> /// <param name="availablePackages">gathered packages</param> public static void ThrowIfVersionIsDisallowedByPackagesConfig(string target, IEnumerable<Packaging.PackageReference> packagesConfig, IEnumerable<PackageDependencyInfo> availablePackages, ILogger logger) { ThrowIfVersionIsDisallowedByPackagesConfig(new string[] { target }, packagesConfig, availablePackages, logger); } /// <summary> /// Throw if packages.config contains an AllowedVersions entry for the target, /// and no packages outside of that range have been found. /// </summary> /// <param name="targets">target package ids</param> /// <param name="packagesConfig">entries from packages.config</param> /// <param name="availablePackages">gathered packages</param> public static void ThrowIfVersionIsDisallowedByPackagesConfig(IEnumerable<string> targets, IEnumerable<Packaging.PackageReference> packagesConfig, IEnumerable<PackageDependencyInfo> availablePackages, ILogger logger) { foreach (var target in targets) { var configEntry = packagesConfig.FirstOrDefault(reference => reference.HasAllowedVersions && StringComparer.OrdinalIgnoreCase.Equals(target, reference.PackageIdentity.Id)); if (configEntry != null) { logger.LogMinimal(string.Format( CultureInfo.CurrentCulture, Strings.PackagesConfigAllowedVersions, configEntry.AllowedVersions.PrettyPrint(), "packages.config")); var packagesForId = availablePackages.Where(package => StringComparer.OrdinalIgnoreCase.Equals(target, package.Id)); // check if package versions exist, but none satisfy the allowed range if (packagesForId.Any() && !packagesForId.Any(package => configEntry.AllowedVersions.Satisfies(package.Version))) { // Unable to resolve '{0}'. An additional constraint {1} defined in {2} prevents this operation. throw new InvalidOperationException( String.Format(CultureInfo.CurrentCulture, Strings.PackagesConfigAllowedVersionConflict, target, configEntry.AllowedVersions.PrettyPrint(), "packages.config")); } } } } /// <summary> /// Throw if packages.config contains a newer version of the package already /// </summary> /// <param name="target">target package id</param> /// <param name="packagesConfig">entries from packages.config</param> /// <param name="availablePackages">gathered packages</param> public static void ThrowIfNewerVersionAlreadyReferenced(string target, IEnumerable<Packaging.PackageReference> packagesConfig, IEnumerable<PackageDependencyInfo> availablePackages) { var configEntry = packagesConfig.FirstOrDefault(r => r.PackageIdentity.Id.Equals(target, StringComparison.OrdinalIgnoreCase)); var availablePackage = availablePackages.FirstOrDefault(p => p.Id.Equals(target, StringComparison.OrdinalIgnoreCase)); if (configEntry != null && availablePackage != null && configEntry.PackageIdentity.Version > availablePackage.Version) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Strings.NewerVersionAlreadyReferenced, target)); } } } }