in src/PortingAssistant.Client.NuGet/PortingAssistantNuGetHandler.cs [54:117]
private async void Process(List<PackageVersionPair> packageVersions, string pathToSolution, bool isIncremental = false, bool incrementalRefresh = false)
{
if (!packageVersions.Any())
{
_logger.LogInformation("No package version compatibilities to process.");
return;
}
var packageVersionsGroupedByPackageIdDict = packageVersions.ToDictionary(t => t.ToString(), t => t);
ConcurrentDictionary<string, PackageVersionPair> packageVersionsGroupedByPackageIdConcurrent = new ConcurrentDictionary<string, PackageVersionPair>(packageVersionsGroupedByPackageIdDict);
var distinctPackageVersions = packageVersions.Distinct().ToList();
var exceptions = new ConcurrentDictionary<PackageVersionPair, Exception>();
foreach (var compatibilityChecker in _compatibilityCheckers)
{
try
{
var compatibilityResults = compatibilityChecker.Check(distinctPackageVersions, pathToSolution, isIncremental, incrementalRefresh);
await Task.WhenAll(compatibilityResults.Select(result =>
{
return result.Value.ContinueWith(task =>
{
if (task.IsCompletedSuccessfully)
{
packageVersionsGroupedByPackageIdConcurrent.TryRemove(result.Key.ToString(), out _);
if (_compatibilityTaskCompletionSources.TryGetValue(result.Key, out var packageVersionPairResult))
{
packageVersionPairResult.TrySetResult(task.Result);
}
else
{
throw new ArgumentNullException($"Package version {result.Key} not found in compatibility tasks.");
}
}
else
{
exceptions.TryAdd(result.Key, task.Exception);
}
});
}).ToList());
}
catch (Exception ex)
{
_logger.LogError("Package compatibility processing failed with error: {0}", ex);
}
}
foreach (var packageVersion in packageVersionsGroupedByPackageIdConcurrent.Select(packageVersionGroup => packageVersionGroup.Value))
{
if (packageVersion != null && _compatibilityTaskCompletionSources.TryGetValue(packageVersion, out var packageVersionPairResult))
{
_logger.LogError($"Cound not find package {packageVersion} in all sources");
var defaultErrorMessage = $"Could not find package {packageVersion}. Compatibility task status: {packageVersionPairResult.Task.Status}.";
var defaultException = new PortingAssistantClientException(ExceptionMessage.PackageNotFound(packageVersion), new PackageNotFoundException(defaultErrorMessage));
var exception = exceptions.GetValueOrDefault(packageVersion, defaultException);
packageVersionPairResult.TrySetException(exception);
}
else
{
_logger.LogInformation($"Attempted to get package {packageVersion} from compatibility tasks but it was not found.");
}
}
}