/// <summary> /// Retrieve a registration blob /// </summary> /// <returns>Returns Null if the package does not exist</returns> public static async Task <RegistrationInfo> GetRegistrationInfo( HttpSource httpClient, Uri registrationUri, string packageId, VersionRange range, SourceCacheContext cacheContext, NuGetFramework projectTargetFramework, ILogger log, CancellationToken token) { var frameworkComparer = new NuGetFrameworkFullComparer(); var frameworkReducer = new FrameworkReducer(); var dependencies = await GetDependencies(httpClient, registrationUri, packageId, range, cacheContext, log, token); var result = new HashSet <RegistrationInfo>(); var registrationInfo = new RegistrationInfo(); registrationInfo.IncludePrerelease = true; foreach (var item in dependencies) { var packageInfo = new PackageInfo { Listed = item.Listed, Version = item.Identity.Version, PackageContent = new Uri(item.ContentUri) }; // only one target framework group will be used at install time, which means // we can filter down to that group now by using the project target framework var depFrameworks = item.DependencyGroups.Select(e => e.TargetFramework); var targetFramework = frameworkReducer.GetNearest(projectTargetFramework, depFrameworks); // If no frameworks are compatible we just ignore them - Should this be an exception? if (targetFramework != null) { var dependencyGroup = item.DependencyGroups.FirstOrDefault(d => frameworkComparer.Equals(targetFramework, d.TargetFramework)); if (dependencyGroup != null) { foreach (var dependency in dependencyGroup.Packages) { var dependencyInfo = new DependencyInfo { Id = dependency.Id, Range = dependency.VersionRange }; packageInfo.Dependencies.Add(dependencyInfo); } } } registrationInfo.Add(packageInfo); registrationInfo.Id = item.Identity.Id; } return(registrationInfo); }
private static void Execute(RegistrationInfo registrationInfo, KeyValuePair <string, VersionRange> allowedVersion) { Pass1(registrationInfo, allowedVersion); var updated = true; while (updated) { updated = false; Pass2(registrationInfo, ref updated); } }
private static void Pass1(RegistrationInfo registrationInfo, KeyValuePair <string, VersionRange> allowedVersion) { if (registrationInfo.Id == allowedVersion.Key) { IList <PackageInfo> packagesToRemove = registrationInfo.Packages.Where(p => !allowedVersion.Value.Satisfies(p.Version)).ToList(); foreach (var packageToRemove in packagesToRemove) { registrationInfo.Packages.Remove(packageToRemove); } } foreach (var child in registrationInfo.Packages) { Pass1(child, allowedVersion); } }
/// <summary> /// Retrieve dependency info from a registration blob /// </summary> private IEnumerable <SourcePackageDependencyInfo> GetPackagesFromRegistration( RegistrationInfo registration, CancellationToken token) { foreach (var pkgInfo in registration.Packages) { var dependencies = pkgInfo.Dependencies.Select(dep => new PackageDependency(dep.Id, dep.Range)); yield return(new SourcePackageDependencyInfo( registration.Id, pkgInfo.Version, dependencies, pkgInfo.Listed, _source, pkgInfo.PackageContent, packageHash: null)); } yield break; }
private static void Pass2(RegistrationInfo registrationInfo, ref bool updated) { IList <PackageInfo> packagesToRemove = new List <PackageInfo>(); foreach (var package in registrationInfo.Packages) { if (!CheckDependenciesExists(package)) { packagesToRemove.Add(package); } } foreach (var packageToRemove in packagesToRemove) { registrationInfo.Packages.Remove(packageToRemove); updated = true; } foreach (var child in registrationInfo.Packages) { Pass2(child, ref updated); } }