File: ResolvePublishOutputConflicts.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;
 
namespace Microsoft.NET.Build.Tasks.ConflictResolution
{
    public class ResolveOverlappingItemGroupConflicts : TaskBase
    {
        [Required]
        public ITaskItem[]? ItemGroup1 { get; set; }
 
        [Required]
        public ITaskItem[]? ItemGroup2 { get; set; }
 
        public string[]? PreferredPackages { get; set; }
 
        public ITaskItem[]? PackageOverrides { get; set; }
 
        [Output]
        public ITaskItem?[]? RemovedItemGroup1 { get; set; }
 
        [Output]
        public ITaskItem?[]? RemovedItemGroup2 { get; set; }
 
        protected override void ExecuteCore()
        {
            var packageRanks = new PackageRank(PreferredPackages);
            var packageOverrides = new PackageOverrideResolver<ConflictItem>(PackageOverrides);
            var conflicts = new HashSet<ConflictItem>();
 
            var conflictItemGroup1 = GetConflictTaskItems(ItemGroup1, ConflictItemType.CopyLocal);
            var conflictItemGroup2 = GetConflictTaskItems(ItemGroup2, ConflictItemType.CopyLocal);
 
            using (var conflictResolver = new ConflictResolver<ConflictItem>(packageRanks, packageOverrides, Log))
            {
                var allConflicts = conflictItemGroup1.Concat(conflictItemGroup2);
                conflictResolver.ResolveConflicts(allConflicts,
                    ci => ItemUtilities.GetReferenceTargetPath(ci.OriginalItem),
                    (ConflictItem winner, ConflictItem loser) => { conflicts.Add(loser); });
 
                var conflictItems = conflicts.Select(i => i.OriginalItem);
                RemovedItemGroup1 = ItemGroup1?.Intersect(conflictItems).ToArray();
                RemovedItemGroup2 = ItemGroup2?.Intersect(conflictItems).ToArray();
            }
        }
 
        private IEnumerable<ConflictItem> GetConflictTaskItems(ITaskItem[]? items, ConflictItemType itemType)
        {
            return (items != null) ? items.Select(i => new ConflictItem(i, itemType)) : Enumerable.Empty<ConflictItem>();
        }
    }
}