/// <summary> /// Helper for finding all versions of a package and all dependencies. /// </summary> private async Task <IEnumerable <PackageDependencyInfo> > GetPackagesFromRegistration(string packageId, VersionRange range, NuGetFramework projectFramework, CancellationToken token) { HashSet <PackageDependencyInfo> results = new HashSet <PackageDependencyInfo>(PackageIdentity.Comparer); Uri uri = _regResource.GetUri(packageId); try { var regInfo = await ResolverMetadataClient.GetRegistrationInfo(_client, uri, range, projectFramework, _cache); var result = await ResolverMetadataClient.GetTree(_client, regInfo, projectFramework, _cache); foreach (var curPkg in GetPackagesFromRegistration(result, token)) { results.Add(curPkg); } } catch (ArgumentException) { // ignore missing packages // TODO: add an exception type for missing packages to be thrown in the metadata client } return(results); }
/// <summary> /// Retrieve dependency info for a single package. /// </summary> /// <param name="package">package id and version</param> /// <param name="projectFramework">project target framework. This is used for finding the dependency group</param> /// <param name="token">cancellation token</param> /// <returns> /// Returns dependency info for the given package if it exists. If the package is not found null is /// returned. /// </returns> public override async Task <SourcePackageDependencyInfo> ResolvePackage(PackageIdentity package, NuGetFramework projectFramework, Common.ILogger log, CancellationToken token) { try { SourcePackageDependencyInfo result = null; // Construct the registration index url var uri = _regResource.GetUri(package.Id); // Retrieve the registration blob var singleVersion = new VersionRange(minVersion: package.Version, includeMinVersion: true, maxVersion: package.Version, includeMaxVersion: true); var regInfo = await ResolverMetadataClient.GetRegistrationInfo(_client, uri, singleVersion, projectFramework, log, token); // regInfo is null if the server returns a 404 for the package to indicate that it does not exist if (regInfo != null) { // Parse package and dependeny info from the blob result = GetPackagesFromRegistration(regInfo, token).FirstOrDefault(); } return(result); } catch (Exception ex) { // Wrap exceptions coming from the server with a user friendly message var error = String.Format(CultureInfo.CurrentUICulture, Strings.Protocol_PackageMetadataError, package, _source); throw new FatalProtocolException(error, ex); } }
/// <summary> /// Retrieve the available packages and their dependencies. /// </summary> /// <remarks>Includes prerelease packages</remarks> /// <param name="packageId">package Id to search</param> /// <param name="projectFramework">project target framework. This is used for finding the dependency group</param> /// <param name="token">cancellation token</param> /// <returns>available packages and their dependencies</returns> public override async Task <IEnumerable <SourcePackageDependencyInfo> > ResolvePackages(string packageId, NuGetFramework projectFramework, Common.ILogger log, CancellationToken token) { try { var results = new List <SourcePackageDependencyInfo>(); // Construct the registration index url var uri = _regResource.GetUri(packageId); // Retrieve the registration blob var regInfo = await ResolverMetadataClient.GetRegistrationInfo(_client, uri, VersionRange.All, projectFramework, log, token); // regInfo is null if the server returns a 404 for the package to indicate that it does not exist if (regInfo != null) { // Parse package and dependeny info from the blob var packages = GetPackagesFromRegistration(regInfo, token); // Filter on prerelease results.AddRange(packages); } return(results); } catch (Exception ex) { // Wrap exceptions coming from the server with a user friendly message var error = string.Format(CultureInfo.CurrentUICulture, Strings.Protocol_PackageMetadataError, packageId, _source); throw new FatalProtocolException(error, ex); } }
/// <summary> /// Retrieve the available packages and their dependencies. /// </summary> /// <remarks>Includes prerelease packages</remarks> /// <param name="packageId">package Id to search</param> /// <param name="token">cancellation token</param> /// <returns>available packages and their dependencies</returns> public override Task <IEnumerable <RemoteSourceDependencyInfo> > ResolvePackages(string packageId, Common.ILogger log, CancellationToken token) { try { // Construct the registration index url var uri = _regResource.GetUri(packageId); // Retrieve the registration blob return(ResolverMetadataClient.GetDependencies(_client, uri, VersionRange.All, log, token)); } catch (Exception ex) { // Wrap exceptions coming from the server with a user friendly message var error = string.Format(CultureInfo.CurrentUICulture, Strings.Protocol_PackageMetadataError, packageId, _source); throw new FatalProtocolException(error, ex); } }