public async Task CheckCompatibilityAsync()

in src/PortingAssistant.Client.NuGet/InternalNuget/PortingAssistantInternalNuGetCompatibilityHandler.cs [29:125]


        public async Task<InternalNuGetCompatibilityResult> CheckCompatibilityAsync(string packageName, string version, string targetFramework, IEnumerable<SourceRepository> internalRepositories)
        {
            if (packageName == null || targetFramework == null || internalRepositories == null)
            {
                var invalidParamNames = new List<string>();
                if (packageName == null)
                {
                    invalidParamNames.Add(nameof(packageName));
                }
                if (targetFramework == null)
                {
                    invalidParamNames.Add(nameof(targetFramework));
                }
                if (internalRepositories == null)
                {
                    invalidParamNames.Add(nameof(internalRepositories));
                }

                throw new ArgumentException($"Invalid parameter(s) found. The following parameters " +
                                            $"cannot be null: {string.Join(", ", invalidParamNames)}");
            }

            string tmpPath = Path.GetTempPath();
            var framework = NuGetFramework.Parse(targetFramework);
            var package = new PackageIdentity(packageName, NuGetVersion.Parse(version));

            // Get package information from Nuget
            SourcePackageDependencyInfo packageSource = null;
            foreach (var sourceRepository in internalRepositories)
            {
                var dependencyInfoResource = await sourceRepository.GetResourceAsync<DependencyInfoResource>();
                packageSource = await dependencyInfoResource.ResolvePackage(
                    package, framework, _cacheContext, NullLogger.Instance, CancellationToken.None);

                if (packageSource != null)
                {
                    break;
                }
            }
            if (packageSource == null)
            {
                var errorMessage = $"Error: No package source found for {package}.";
                _logger.LogError(errorMessage);

                var innerException = new PackageSourceNotFoundException(errorMessage);
                throw new PortingAssistantClientException(ExceptionMessage.PackageSourceNotFound(package), innerException);
            }

            // Download package
            var downloadResource = await packageSource.Source.GetResourceAsync<DownloadResource>();
            var downloadResult = await downloadResource.GetDownloadResourceResultAsync(
                packageSource,
                new PackageDownloadContext(_cacheContext),
                Path.Combine(tmpPath),
                NullLogger.Instance, CancellationToken.None);
            var packageReader = downloadResult.PackageReader;
            var nuspecReader = packageReader.NuspecReader;

            var dependencies = nuspecReader.GetDependencyGroups();
            var dependencyPackages = dependencies
                .SelectMany(d => d.Packages)
                .Select(p => p.Id)
                .ToList();

            // Gather dlls
            var frameworkReducer = new FrameworkReducer();
            var libItems = packageReader.GetLibItems();
            var nearestTargetFrameworks = libItems
                .Select(li =>
                    frameworkReducer.GetNearest(
                        framework,
                        new List<NuGetFramework> { li.TargetFramework }))
                .ToList();

            var isCompatible = libItems.Any() ? nearestTargetFrameworks.Any(nugetFramework => nugetFramework != null)
                : frameworkReducer.GetNearest(framework, packageReader.GetSupportedFrameworks()) != null;

            var compatibleDlls = libItems
                .Where(li => nearestTargetFrameworks.Contains(li.TargetFramework))
                .SelectMany(li => li.Items)
                .Where(s => s.EndsWith("dll", StringComparison.OrdinalIgnoreCase))
                .ToList();
            var incompatibleDlls = libItems
                .SelectMany(li => li.Items)
                .Where(s => !compatibleDlls.Contains(s)
                            && s.EndsWith("dll", StringComparison.OrdinalIgnoreCase))
                .ToList();

            return new InternalNuGetCompatibilityResult
            {
                IncompatibleDlls = incompatibleDlls,
                CompatibleDlls = compatibleDlls,
                IsCompatible = isCompatible,
                DependencyPackages = dependencyPackages,
                Source = packageSource.Source.PackageSource.Name
            };
        }