/// <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, VersionRange range, NuGetFramework projectTargetFramework, ILogger log, CancellationToken token) { var frameworkComparer = new NuGetFrameworkFullComparer(); var frameworkReducer = new FrameworkReducer(); var dependencies = await GetDependencies(httpClient, registrationUri, range, 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); }
public static async Task <RegistrationInfo> GetRegistrationInfo(HttpClient httpClient, Uri registrationUri, VersionRange range, NuGetFramework projectTargetFramework, ConcurrentDictionary <Uri, JObject> sessionCache = null) { NuGetFrameworkFullComparer frameworkComparer = new NuGetFrameworkFullComparer(); FrameworkReducer frameworkReducer = new FrameworkReducer(); JObject index = await LoadResource(httpClient, registrationUri, sessionCache); if (index == null) { throw new ArgumentException(registrationUri.AbsoluteUri); } VersionRange preFilterRange = Utils.SetIncludePrerelease(range, true); IList <Task <JObject> > rangeTasks = new List <Task <JObject> >(); foreach (JObject item in index["items"]) { NuGetVersion lower = NuGetVersion.Parse(item["lower"].ToString()); NuGetVersion upper = NuGetVersion.Parse(item["upper"].ToString()); if (ResolverMetadataClientUtility.IsItemRangeRequired(preFilterRange, lower, upper)) { JToken items; if (!item.TryGetValue("items", out items)) { Uri rangeUri = item["@id"].ToObject <Uri>(); rangeTasks.Add(LoadResource(httpClient, rangeUri, sessionCache)); } else { rangeTasks.Add(Task.FromResult(item)); } } } await Task.WhenAll(rangeTasks.ToArray()); RegistrationInfo registrationInfo = new RegistrationInfo(); registrationInfo.IncludePrerelease = range.IncludePrerelease; string id = string.Empty; foreach (JObject rangeObj in rangeTasks.Select((t) => t.Result)) { if (rangeObj == null) { throw new InvalidDataException(registrationUri.AbsoluteUri); } foreach (JObject packageObj in rangeObj["items"]) { JObject catalogEntry = (JObject)packageObj["catalogEntry"]; NuGetVersion packageVersion = NuGetVersion.Parse(catalogEntry["version"].ToString()); id = catalogEntry["id"].ToString(); int publishedDate = 0; JToken publishedValue; if (catalogEntry.TryGetValue("published", out publishedValue)) { publishedDate = int.Parse(publishedValue.ToObject <DateTime>().ToString("yyyyMMdd")); } //publishedDate = 0 means the property doesn't exist in index.json //publishedDate = 19000101 means the property exists but the package is unlisted if (range.Satisfies(packageVersion) && (publishedDate != 19000101)) { PackageInfo packageInfo = new PackageInfo(); packageInfo.Version = packageVersion; packageInfo.PackageContent = new Uri(packageObj["packageContent"].ToString()); JArray dependencyGroupsArray = (JArray)catalogEntry["dependencyGroups"]; if (dependencyGroupsArray != null) { // 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 = dependencyGroupsArray.Select(e => GetFramework(e as JObject)); var targetFramework = frameworkReducer.GetNearest(projectTargetFramework, depFrameworks); // If no frameworks are compatible we just ignore them - Should this be an exception? if (targetFramework != null) { foreach (JObject dependencyGroupObj in dependencyGroupsArray) { NuGetFramework currentFramework = GetFramework(dependencyGroupObj); if (frameworkComparer.Equals(currentFramework, targetFramework)) { foreach (JObject dependencyObj in dependencyGroupObj["dependencies"]) { DependencyInfo dependencyInfo = new DependencyInfo(); dependencyInfo.Id = dependencyObj["id"].ToString(); dependencyInfo.Range = Utils.CreateVersionRange((string)dependencyObj["range"], range.IncludePrerelease); dependencyInfo.RegistrationUri = dependencyObj["registration"].ToObject <Uri>(); packageInfo.Dependencies.Add(dependencyInfo); } } } } } registrationInfo.Add(packageInfo); } } registrationInfo.Id = id; } return(registrationInfo); }
public static async Task<RegistrationInfo> GetRegistrationInfo(HttpClient httpClient, Uri registrationUri, VersionRange range, NuGetFramework projectTargetFramework, ConcurrentDictionary<Uri, JObject> sessionCache = null) { NuGetFrameworkFullComparer frameworkComparer = new NuGetFrameworkFullComparer(); FrameworkReducer frameworkReducer = new FrameworkReducer(); JObject index = await LoadResource(httpClient, registrationUri, sessionCache); if (index == null) { throw new ArgumentException(registrationUri.AbsoluteUri); } VersionRange preFilterRange = Utils.SetIncludePrerelease(range, true); IList<Task<JObject>> rangeTasks = new List<Task<JObject>>(); foreach (JObject item in index["items"]) { NuGetVersion lower = NuGetVersion.Parse(item["lower"].ToString()); NuGetVersion upper = NuGetVersion.Parse(item["upper"].ToString()); if (ResolverMetadataClientUtility.IsItemRangeRequired(preFilterRange, lower, upper)) { JToken items; if (!item.TryGetValue("items", out items)) { Uri rangeUri = item["@id"].ToObject<Uri>(); rangeTasks.Add(LoadResource(httpClient, rangeUri, sessionCache)); } else { rangeTasks.Add(Task.FromResult(item)); } } } await Task.WhenAll(rangeTasks.ToArray()); RegistrationInfo registrationInfo = new RegistrationInfo(); registrationInfo.IncludePrerelease = range.IncludePrerelease; string id = string.Empty; foreach (JObject rangeObj in rangeTasks.Select((t) => t.Result)) { if (rangeObj == null) { throw new InvalidDataException(registrationUri.AbsoluteUri); } foreach (JObject packageObj in rangeObj["items"]) { JObject catalogEntry = (JObject)packageObj["catalogEntry"]; NuGetVersion packageVersion = NuGetVersion.Parse(catalogEntry["version"].ToString()); id = catalogEntry["id"].ToString(); int publishedDate = 0; JToken publishedValue; if (catalogEntry.TryGetValue("published", out publishedValue)) { publishedDate = int.Parse(publishedValue.ToObject<DateTime>().ToString("yyyyMMdd")); } //publishedDate = 0 means the property doesn't exist in index.json //publishedDate = 19000101 means the property exists but the package is unlisted if (range.Satisfies(packageVersion) && (publishedDate!= 19000101)) { PackageInfo packageInfo = new PackageInfo(); packageInfo.Version = packageVersion; packageInfo.PackageContent = new Uri(packageObj["packageContent"].ToString()); JArray dependencyGroupsArray = (JArray)catalogEntry["dependencyGroups"]; if (dependencyGroupsArray != null) { // 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 = dependencyGroupsArray.Select(e => GetFramework(e as JObject)); var targetFramework = frameworkReducer.GetNearest(projectTargetFramework, depFrameworks); // If no frameworks are compatible we just ignore them - Should this be an exception? if (targetFramework != null) { foreach (JObject dependencyGroupObj in dependencyGroupsArray) { NuGetFramework currentFramework = GetFramework(dependencyGroupObj); if (frameworkComparer.Equals(currentFramework, targetFramework)) { foreach (JObject dependencyObj in dependencyGroupObj["dependencies"]) { DependencyInfo dependencyInfo = new DependencyInfo(); dependencyInfo.Id = dependencyObj["id"].ToString(); dependencyInfo.Range = Utils.CreateVersionRange((string)dependencyObj["range"], range.IncludePrerelease); dependencyInfo.RegistrationUri = dependencyObj["registration"].ToObject<Uri>(); packageInfo.Dependencies.Add(dependencyInfo); } } } } } registrationInfo.Add(packageInfo); } } registrationInfo.Id = id; } return registrationInfo; }
/// <summary> /// Retrieve a registration blob /// </summary> /// <returns>Returns Null if the package does not exist</returns> public static async Task<RegistrationInfo> GetRegistrationInfo( HttpClient httpClient, Uri registrationUri, VersionRange range, NuGetFramework projectTargetFramework, CancellationToken token) { var frameworkComparer = new NuGetFrameworkFullComparer(); var frameworkReducer = new FrameworkReducer(); var dependencies = await GetDependencies(httpClient, registrationUri, range, token); var registrationInfo = new RegistrationInfo(); registrationInfo.IncludePrerelease = range.IncludePrerelease; 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; }