private static async Task <Tuple <LibraryRange, RemoteMatch> > ResolvePackageLibraryMatchAsync(LibraryRange libraryRange, RemoteWalkContext remoteWalkContext, CancellationToken cancellationToken) { IList <IRemoteDependencyProvider> remoteDependencyProviders = remoteWalkContext.FilterDependencyProvidersForLibrary(libraryRange); if (libraryRange.TypeConstraintAllows(LibraryDependencyTarget.Package)) { LogIfPackageSourceMappingIsEnabled(libraryRange.Name, remoteWalkContext, remoteDependencyProviders); } var match = await FindPackageLibraryMatchAsync(libraryRange, NuGetFramework.AnyFramework, remoteDependencyProviders, remoteWalkContext.LocalLibraryProviders, remoteWalkContext.CacheContext, remoteWalkContext.Logger, cancellationToken); if (match == null) { match = CreateUnresolvedMatch(libraryRange); } return(new Tuple <LibraryRange, RemoteMatch>(libraryRange, match)); }
public static async Task <GraphItem <RemoteResolveResult> > FindLibraryEntryAsync( LibraryRange libraryRange, NuGetFramework framework, string runtimeIdentifier, RemoteWalkContext context, CancellationToken cancellationToken) { GraphItem <RemoteResolveResult> graphItem = null; var currentCacheContext = context.CacheContext; IList <IRemoteDependencyProvider> remoteDependencyProviders = context.FilterDependencyProvidersForLibrary(libraryRange); if (libraryRange.TypeConstraintAllows(LibraryDependencyTarget.Package)) { LogIfPackageSourceMappingIsEnabled(libraryRange.Name, context, remoteDependencyProviders); } // Try up to two times to get the package. The second // retry will refresh the cache if a package is listed // but fails to download. This can happen if the feed prunes // the package. for (var i = 0; i < 2 && graphItem == null; i++) { var match = await FindLibraryMatchAsync( libraryRange, framework, runtimeIdentifier, remoteDependencyProviders, context.LocalLibraryProviders, context.ProjectLibraryProviders, context.LockFileLibraries, currentCacheContext, context.Logger, cancellationToken); if (match == null) { return(CreateUnresolvedResult(libraryRange)); } try { graphItem = await CreateGraphItemAsync(match, framework, currentCacheContext, context.Logger, cancellationToken); } catch (InvalidCacheProtocolException) when(i == 0) { // 1st failure, invalidate the cache and try again. // Clear the on disk and memory caches during the next request. currentCacheContext = currentCacheContext.WithRefreshCacheTrue(); } catch (PackageNotFoundProtocolException ex) when(match.Provider.IsHttp && match.Provider.Source != null) { // 2nd failure, the feed is likely corrupt or removing packages too fast to keep up with. var message = string.Format(CultureInfo.CurrentCulture, Strings.Error_PackageNotFoundWhenExpected, match.Provider.Source, ex.PackageIdentity.ToString()); throw new FatalProtocolException(message, ex); } } return(graphItem); }