/// <summary> /// Sets the package to be displayed in the detail control. /// </summary> /// <param name="searchResultPackage">The package to be displayed.</param> /// <param name="filter">The current filter. This will used to select the default action.</param> public async virtual Task SetCurrentPackage( PackageItemListViewModel searchResultPackage, ItemFilter filter) { _searchResultPackage = searchResultPackage; _filter = filter; OnPropertyChanged(nameof(Id)); OnPropertyChanged(nameof(IconUrl)); var versions = await searchResultPackage.GetVersionsAsync(); _allPackageVersions = versions.Select(v => v.Version).ToList(); _projectVersionRangeDict = new Dictionary <string, VersionRange>(StringComparer.OrdinalIgnoreCase); // filter project.json based projects since allowedVersion is only applicable to packages.config var packagesConfigProjects = _nugetProjects.Where(project => !(project is INuGetIntegratedProject)); foreach (var project in packagesConfigProjects) { // cache allowed version range for each nuget project for current selected package var packageReference = (await project.GetInstalledPackagesAsync(CancellationToken.None)) .FirstOrDefault(r => StringComparer.OrdinalIgnoreCase.Equals(r.PackageIdentity.Id, searchResultPackage.Id)); _projectVersionRangeDict.Add(project.GetMetadata <string>(NuGetProjectMetadataKeys.Name), packageReference?.AllowedVersions); } // hook event handler for dependency behavior changed Options.SelectedChanged += DependencyBehavior_SelectedChanged; CreateVersions(); OnCurrentPackageChanged(); }
private async Task <IEnumerable <(VersionInfo versionInfo, PackageDeprecationMetadata deprecationMetadata)> > GetVersionsWithDeprecationMetadataAsync() { var versions = await _searchResultPackage.GetVersionsAsync(); return(await Task.WhenAll( versions.Select(async version => { var deprecationMetadata = version != null && version.PackageSearchMetadata != null ? await version.PackageSearchMetadata.GetDeprecationMetadataAsync() : null; return (version, deprecationMetadata); }))); }
/// <summary> /// Returns the list of projects that are selected for the given action /// </summary> //public abstract IEnumerable<NuGetProject> GetSelectedProjects(UserAction action); /// <summary> /// Sets the package to be displayed in the detail control. /// </summary> /// <param name="searchResultPackage">The package to be displayed.</param> /// <param name="filter">The current filter. This will used to select the default action.</param> public async virtual Task SetCurrentPackage( PackageItemListViewModel searchResultPackage) //, // ItemFilter filter) { _searchResultPackage = searchResultPackage; //_filter = filter; //OnPropertyChanged(nameof(Id)); //OnPropertyChanged(nameof(IconUrl)); var versions = await searchResultPackage.GetVersionsAsync(); _allPackageVersions = versions.Select(v => v.Version).ToList(); //CreateVersions(); //OnCurrentPackageChanged(); }
/// <summary> /// Returns the list of projects that are selected for the given action /// </summary> //public abstract IEnumerable<NuGetProject> GetSelectedProjects(UserAction action); /// <summary> /// Sets the package to be displayed in the detail control. /// </summary> /// <param name="searchResultPackage">The package to be displayed.</param> /// <param name="filter">The current filter. This will used to select the default action.</param> public async virtual Task SetCurrentPackage( PackageItemListViewModel searchResultPackage)//, // ItemFilter filter) { _searchResultPackage = searchResultPackage; //_filter = filter; //OnPropertyChanged(nameof(Id)); //OnPropertyChanged(nameof(IconUrl)); var versions = await searchResultPackage.GetVersionsAsync(); _allPackageVersions = versions.Select(v => v.Version).ToList(); //CreateVersions(); //OnCurrentPackageChanged(); }
internal async Task LoadPackageMetadaAsync(IPackageMetadataProvider metadataProvider, CancellationToken token) { var versions = await _searchResultPackage.GetVersionsAsync(); var packages = Enumerable.Empty <IPackageSearchMetadata>(); try { // load up the full details for each version if (metadataProvider != null) { packages = await metadataProvider.GetPackageMetadataListAsync(Id, true, false, token); } } catch (InvalidOperationException) { // Ignore failures. } var uniquePackages = packages .GroupBy(m => m.Identity.Version, (v, ms) => ms.First()); var s = uniquePackages .GroupJoin( versions, m => m.Identity.Version, d => d.Version, (m, d) => new DetailedPackageMetadata(m, d.FirstOrDefault()?.DownloadCount)); _metadataDict = s.ToDictionary(m => m.Version); DetailedPackageMetadata p; if (SelectedVersion != null && _metadataDict.TryGetValue(SelectedVersion.Version, out p)) { PackageMetadata = p; } }
/// <summary> /// Sets the package to be displayed in the detail control. /// </summary> /// <param name="searchResultPackage">The package to be displayed.</param> /// <param name="filter">The current filter. This will used to select the default action.</param> public async virtual Task SetCurrentPackage( PackageItemListViewModel searchResultPackage, ItemFilter filter, Func <PackageItemListViewModel> getPackageItemListViewModel) { _searchResultPackage = searchResultPackage; _filter = filter; OnPropertyChanged(nameof(Id)); OnPropertyChanged(nameof(IconUrl)); var getVersionsTask = searchResultPackage.GetVersionsAsync(); var cacheContext = new DependencyGraphCacheContext(); _projectVersionConstraints = new List <ProjectVersionConstraint>(); // Filter out projects that are not managed by NuGet. var projects = _nugetProjects.Where(project => !(project is ProjectKNuGetProjectBase)).ToArray(); foreach (var project in projects) { if (project is MSBuildNuGetProject) { // cache allowed version range for each nuget project for current selected package var packageReference = (await project.GetInstalledPackagesAsync(CancellationToken.None)) .FirstOrDefault(r => StringComparer.OrdinalIgnoreCase.Equals(r.PackageIdentity.Id, searchResultPackage.Id)); var range = packageReference?.AllowedVersions; if (range != null && !VersionRange.All.Equals(range)) { var constraint = new ProjectVersionConstraint() { ProjectName = project.GetMetadata <string>(NuGetProjectMetadataKeys.Name), VersionRange = range, IsPackagesConfig = true, }; _projectVersionConstraints.Add(constraint); } } else if (project is BuildIntegratedNuGetProject) { var packageReferences = await project.GetInstalledPackagesAsync(CancellationToken.None); // First the lowest auto referenced version of this package. var autoReferenced = packageReferences.Where(e => StringComparer.OrdinalIgnoreCase.Equals(searchResultPackage.Id, e.PackageIdentity.Id) && e.PackageIdentity.Version != null) .Select(e => e as BuildIntegratedPackageReference) .Where(e => e?.Dependency?.AutoReferenced == true) .OrderBy(e => e.PackageIdentity.Version) .FirstOrDefault(); if (autoReferenced != null) { // Add constraint for auto referenced package. var constraint = new ProjectVersionConstraint() { ProjectName = project.GetMetadata <string>(NuGetProjectMetadataKeys.Name), VersionRange = new VersionRange( minVersion: autoReferenced.PackageIdentity.Version, includeMinVersion: true, maxVersion: autoReferenced.PackageIdentity.Version, includeMaxVersion: true), IsAutoReferenced = true, }; _projectVersionConstraints.Add(constraint); } } } // Add Current package version to package versions list. _allPackageVersions = new List <NuGetVersion>() { searchResultPackage.Version }; CreateVersions(); OnCurrentPackageChanged(); var versions = await getVersionsTask; // GetVersionAsync can take long time to finish, user might changed selected package. // Check selected package. if (getPackageItemListViewModel() != searchResultPackage) { return; } _allPackageVersions = versions.Select(v => v.Version).ToList(); // hook event handler for dependency behavior changed Options.SelectedChanged += DependencyBehavior_SelectedChanged; CreateVersions(); OnCurrentPackageChanged(); }
internal async Task LoadPackageMetadaAsync(IPackageMetadataProvider metadataProvider, CancellationToken token) { var versions = await _searchResultPackage.GetVersionsAsync(); // First try to load the metadata from the version info. This will happen if we already fetched metadata // about each version at the same time as fetching the version list (that it, V2). This also acts as a // means to cache version metadata. _metadataDict = versions .Where(v => v.PackageSearchMetadata != null) .ToDictionary( v => v.Version, v => new DetailedPackageMetadata(v.PackageSearchMetadata, v.DownloadCount)); // If we are missing any metadata, go to the metadata provider and fetch all of the data again. if (versions.Select(v => v.Version).Except(_metadataDict.Keys).Any()) { try { // Load up the full details for each version. var packages = await metadataProvider?.GetPackageMetadataListAsync( Id, includePrerelease : true, includeUnlisted : false, cancellationToken : token); var uniquePackages = packages .GroupBy( m => m.Identity.Version, (v, ms) => ms.First()); _metadataDict = uniquePackages .GroupJoin( versions, m => m.Identity.Version, d => d.Version, (m, d) => { var versionInfo = d.OrderByDescending(v => v.DownloadCount).FirstOrDefault(); if (versionInfo != null) { // Save the metadata about this version to the VersionInfo instance. versionInfo.PackageSearchMetadata = m; } return(new DetailedPackageMetadata(m, versionInfo?.DownloadCount)); }) .ToDictionary(m => m.Version); } catch (InvalidOperationException) { // Ignore failures. } } DetailedPackageMetadata p; if (SelectedVersion != null && _metadataDict.TryGetValue(SelectedVersion.Version, out p)) { PackageMetadata = p; } }