in src/PortingAssistant.Client.NuGet/Checkers/ExternalCompatibilityChecker.cs [79:183]
private async void ProcessCompatibility(IEnumerable<PackageVersionPair> packageVersions,
Dictionary<PackageVersionPair, TaskCompletionSource<PackageDetails>> compatibilityTaskCompletionSources,
string pathToSolution, bool isIncremental, bool incrementalRefresh)
{
var packageVersionsFound = new HashSet<PackageVersionPair>();
var packageVersionsWithErrors = new HashSet<PackageVersionPair>();
var packageVersionsGroupedByPackageId = packageVersions
.GroupBy(pv => pv.PackageId)
.ToDictionary(pvGroup => pvGroup.Key, pvGroup => pvGroup.ToList());
foreach (var groupedPackageVersions in packageVersionsGroupedByPackageId)
{
var packageToDownload = groupedPackageVersions.Key.ToLower();
var fileToDownload = GetDownloadFilePath(CompatibilityCheckerType, packageToDownload);
try
{
string tempDirectoryPath = GetTempDirectory(pathToSolution);
PackageDetails packageDetails = null;
if (isIncremental)
{
if (incrementalRefresh || !IsPackageInFile(fileToDownload, tempDirectoryPath))
{
_logger.LogInformation("Downloading {0} from {1}", fileToDownload, CompatibilityCheckerType);
packageDetails = await GetPackageDetailFromS3(fileToDownload, _httpService);
_logger.LogInformation("Caching {0} from {1} to Temp", fileToDownload, CompatibilityCheckerType);
CachePackageDetailsToFile(fileToDownload, packageDetails, tempDirectoryPath);
}
else
{
_logger.LogInformation("Fetching {0} from {1} from Temp", fileToDownload, CompatibilityCheckerType);
packageDetails = GetPackageDetailFromFile(fileToDownload, tempDirectoryPath);
}
}
else
packageDetails = await GetPackageDetailFromS3(fileToDownload, _httpService);
if (packageDetails.Name == null || !string.Equals(packageDetails.Name.Trim().ToLower(),
packageToDownload.Trim().ToLower(), StringComparison.OrdinalIgnoreCase))
{
throw new PackageDownloadMismatchException(
actualPackage: packageDetails.Name,
expectedPackage: packageToDownload);
}
foreach (var packageVersion in groupedPackageVersions.Value)
{
if (compatibilityTaskCompletionSources.TryGetValue(packageVersion, out var taskCompletionSource))
{
taskCompletionSource.SetResult(packageDetails);
packageVersionsFound.Add(packageVersion);
}
}
}
catch (OutOfMemoryException ex)
{
_logger.LogError("Failed when downloading and parsing {0} from {1}, {2}", fileToDownload, CompatibilityCheckerType, ex);
MemoryUtils.LogSolutiontSize(_logger, pathToSolution);
MemoryUtils.LogMemoryConsumption(_logger);
}
catch (Exception ex)
{
if (ex.Message.Contains("404"))
{
_logger.LogInformation($"Encountered {ex.GetType()} while downloading and parsing {fileToDownload} " +
$"from {CompatibilityCheckerType}, but it was ignored. " +
$"ErrorMessage: {ex.Message}.");
// filter all 404 errors
ex = null;
}
else
{
_logger.LogError("Failed when downloading and parsing {0} from {1}, {2}", fileToDownload, CompatibilityCheckerType, ex);
}
foreach (var packageVersion in groupedPackageVersions.Value)
{
if (compatibilityTaskCompletionSources.TryGetValue(packageVersion, out var taskCompletionSource))
{
taskCompletionSource.SetException(new PortingAssistantClientException(ExceptionMessage.PackageNotFound(packageVersion), ex));
packageVersionsWithErrors.Add(packageVersion);
}
}
}
}
foreach (var packageVersion in packageVersions)
{
if (packageVersionsFound.Contains(packageVersion) || packageVersionsWithErrors.Contains(packageVersion))
{
continue;
}
if (compatibilityTaskCompletionSources.TryGetValue(packageVersion, out var taskCompletionSource))
{
var errorMessage = $"Could not find package {packageVersion} in external source; try checking an internal source.";
_logger.LogInformation(errorMessage);
var innerException = new PackageNotFoundException(errorMessage);
taskCompletionSource.TrySetException(new PortingAssistantClientException(ExceptionMessage.PackageNotFound(packageVersion), innerException));
}
}
}