File: PackageOverride.cs
Web Access
Project: ..\..\..\src\Tasks\Microsoft.NET.Build.Extensions.Tasks\Microsoft.NET.Build.Extensions.Tasks.csproj (Microsoft.NET.Build.Extensions.Tasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Build.Framework;
 
#if EXTENSIONS
using OverrideVersion = System.Version;
#else
using OverrideVersion = NuGet.Versioning.NuGetVersion;
using NuGet.Versioning;
#endif
 
namespace Microsoft.NET.Build.Tasks.ConflictResolution
{
    /// <summary>
    /// A PackageOverride contains information about a package that overrides
    /// a set of packages up to a certain version.
    /// </summary>
    /// <remarks>
    /// For example, Microsoft.NETCore.App overrides System.Console up to version 4.3.0,
    /// System.IO up to version version 4.3.0, etc.
    /// </remarks>
    internal class PackageOverride
    {
        public string PackageName { get; }
        public Dictionary<string, OverrideVersion> OverriddenPackages { get; }
 
        private PackageOverride(string packageName, IEnumerable<(string id, OverrideVersion version)> overriddenPackages)
        {
            PackageName = packageName;
 
            OverriddenPackages = new Dictionary<string, OverrideVersion>(StringComparer.OrdinalIgnoreCase);
            foreach (var package in overriddenPackages)
            {
                OverriddenPackages[package.id] = package.version;
            }
        }
 
        public static PackageOverride Create(ITaskItem packageOverrideItem)
        {
            string packageName = packageOverrideItem.ItemSpec;
            string overriddenPackagesString = packageOverrideItem.GetMetadata(MetadataKeys.OverriddenPackages);
 
            return new PackageOverride(packageName, CreateOverriddenPackages(overriddenPackagesString));
        }
 
        private static IEnumerable<(string id, OverrideVersion version)> CreateOverriddenPackages(string overriddenPackagesString)
        {
            if (!string.IsNullOrEmpty(overriddenPackagesString))
            {
                overriddenPackagesString = overriddenPackagesString.Trim();
                string[] overriddenPackagesAndVersions = overriddenPackagesString.Split(new char[] { ';', '\r', '\n', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                return CreateOverriddenPackages(overriddenPackagesAndVersions);
            }
            return Enumerable.Empty<(string id, OverrideVersion version)>();
        }
 
        public static IEnumerable<(string id, OverrideVersion version)> CreateOverriddenPackages(IEnumerable<string> packageOverrideFileLines)
        {
            foreach (string overriddenPackagesAndVersion in packageOverrideFileLines)
            {
                string trimmedOverriddenPackagesAndVersion = overriddenPackagesAndVersion.Trim();
                int separatorIndex = trimmedOverriddenPackagesAndVersion.IndexOf('|');
                if (separatorIndex != -1)
                {
                    string versionString = trimmedOverriddenPackagesAndVersion.Substring(separatorIndex + 1);
                    string overriddenPackage = trimmedOverriddenPackagesAndVersion.Substring(0, separatorIndex);
                    if (OverrideVersion.TryParse(versionString, out OverrideVersion? version))
                    {
                        yield return (overriddenPackage, version);
                    }
                }
            }
 
        }
    }
}