async Task <ArtifactAvailableInstances> GetAvailable(MetadataResource meta, NuGetLoggerAdapter logger, string name) { var v = new ArtifactAvailableInstances(this, name); var latest = await meta.GetVersions(name, true, false, _feed.Client.SourceCache, logger, CancellationToken.None); foreach (var nugetVersion in latest) { var vText = nugetVersion.ToNormalizedString(); var sV = SVersion.TryParse(vText); if (!sV.IsValid) { logger.Monitor.Warn($"Unable to parse version '{vText}' for '{name}': {sV.ErrorMessage}"); } else { v = v.WithVersion(sV); } } return(v); }
internal async Task InstallInternalAsync( Project project, List <Packaging.Core.PackageDependency> packages, ISourceRepositoryProvider repoProvider, bool skipAssemblyReferences, bool ignoreDependencies, CancellationToken token) { foreach (var group in packages.GroupBy(e => e.Id, StringComparer.OrdinalIgnoreCase)) { if (group.Count() > 1) { // throw if a package id appears more than once throw new InvalidOperationException(VsResources.InvalidPackageList); } } // find the latest package List <MetadataResource> metadataResources = new List <MetadataResource>(); // create the resources for looking up the latest version foreach (var repo in repoProvider.GetRepositories()) { MetadataResource resource = await repo.GetResourceAsync <MetadataResource>(); if (resource != null) { metadataResources.Add(resource); } } // find the highest version within the ranges var idToIdentity = new Dictionary <string, PackageIdentity>(StringComparer.OrdinalIgnoreCase); foreach (var dep in packages) { NuGetVersion highestVersion = null; if (dep.VersionRange != null && VersionComparer.Default.Equals(dep.VersionRange.MinVersion, dep.VersionRange.MaxVersion) && dep.VersionRange.MinVersion != null) { // this is a single version, not a range highestVersion = dep.VersionRange.MinVersion; } else { var tasks = new List <Task <IEnumerable <NuGetVersion> > >(); foreach (var resource in metadataResources) { tasks.Add(resource.GetVersions(dep.Id, NullLogger.Instance, token)); } var versions = await Task.WhenAll(tasks.ToArray()); highestVersion = versions.SelectMany(v => v).Where(v => dep.VersionRange.Satisfies(v)).Max(); } if (highestVersion == null) { throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, VsResources.UnknownPackage, dep.Id)); } if (!idToIdentity.ContainsKey(dep.Id)) { idToIdentity.Add(dep.Id, new PackageIdentity(dep.Id, highestVersion)); } } // Skip assembly references and disable binding redirections should be done together bool disableBindingRedirects = skipAssemblyReferences; VSAPIProjectContext projectContext = new VSAPIProjectContext(skipAssemblyReferences, disableBindingRedirects); await InstallInternalAsync( project, idToIdentity.Values.ToList(), repoProvider, projectContext, includePrerelease : false, ignoreDependencies : ignoreDependencies, token : token); }