async Task <IEnumerable <IPackageSearchMetadata> > GetPackagesWithUpdatesAsync(string searchText, SearchFilter searchFilter, CancellationToken cancellationToken) { if (_context != null) { _installedPackages = await _context.GetInstalledPackagesAsync(); _context = null; } var packages = _installedPackages .GetEarliest() .Where(p => p.Id.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) != -1) .OrderBy(p => p.Id); var latestItems = await TaskCombinators.ThrottledAsync( packages, (p, t) => _metadataProvider.GetLatestPackageMetadataAsync(p, searchFilter.IncludePrerelease, t), cancellationToken); var packagesWithUpdates = packages .Join(latestItems.Where(i => i != null), p => p.Id, m => m.Identity.Id, (p, m) => new { cv = p.Version, m = m }, StringComparer.OrdinalIgnoreCase) .Where(j => VersionComparer.VersionRelease.Compare(j.cv, j.m.Identity.Version) < 0) .Select(j => j.m); return(packagesWithUpdates); }
private async Task UpdateStateAndReportAsync(SearchResult <IPackageSearchMetadata> searchResult, IProgress <IItemLoaderState> progress) { // cache installed packages here for future use _installedPackages = await _context.GetInstalledPackagesAsync(); var state = new PackageFeedSearchState(searchResult); _state = state; progress?.Report(state); }
private static async Task <IPackageFeed> CreatePackageFeedAsync(PackageLoadContext context, ItemFilter filter, INuGetUILogger uiLogger) { // Go off the UI thread to perform non-UI operations await TaskScheduler.Default; var logger = new VisualStudioActivityLogger(); if (filter == ItemFilter.All) { return(new MultiSourcePackageFeed(context.SourceRepositories, uiLogger)); } var metadataProvider = CreatePackageMetadataProvider(context); var installedPackages = await context.GetInstalledPackagesAsync(); if (filter == ItemFilter.Installed) { return(new InstalledPackageFeed(installedPackages, metadataProvider, logger)); } if (filter == ItemFilter.Consolidate) { return(new ConsolidatePackageFeed(installedPackages, metadataProvider, logger)); } // Search all / updates available cannot work without a source repo if (context.SourceRepositories == null) { return(null); } if (filter == ItemFilter.UpdatesAvailable) { return(new UpdatePackageFeed( installedPackages, metadataProvider, context.Projects, context.CachedPackages, logger)); } throw new InvalidOperationException("Unsupported feed type"); }
public async Task UpdateStateAndReportAsync(SearchResult <IPackageSearchMetadata> searchResult, IProgress <IItemLoaderState> progress, CancellationToken cancellationToken) { // cache installed packages here for future use _installedPackages = await _context.GetInstalledPackagesAsync(); // fetch package references from all the projects and cache locally // for solution view, we'll always show the highest available version // but for project view, get the allowed version range and pass it to package item view model to choose the latest version based on that if (_packageReferences == null && !_context.IsSolution) { var tasks = _context.Projects .Select(project => project.GetInstalledPackagesAsync(cancellationToken).AsTask()); _packageReferences = (await Task.WhenAll(tasks)).SelectMany(p => p).Where(p => p != null); } var state = new PackageFeedSearchState(searchResult); _state = state; progress?.Report(state); }
public override async Task <SearchResult <IPackageSearchMetadata> > ContinueSearchAsync(ContinuationToken continuationToken, CancellationToken cancellationToken) { var searchToken = continuationToken as FeedSearchContinuationToken; if (searchToken == null) { throw new InvalidOperationException("Invalid token"); } if (_context != null) { _installedPackages = await _context.GetInstalledPackagesAsync(); _context = null; } var packagesNeedingConsolidation = _installedPackages .GroupById() .Where(g => g.Count() > 1) .Select(g => new PackageIdentity(g.Key, g.Max())) .ToArray(); var packages = packagesNeedingConsolidation .Where(p => p.Id.IndexOf(searchToken.SearchString, StringComparison.OrdinalIgnoreCase) != -1) .OrderBy(p => p.Id) .Skip(searchToken.StartIndex) .Take(PageSize + 1) .ToArray(); var hasMoreItems = packages.Length > PageSize; if (hasMoreItems) { packages = packages.Take(packages.Length - 1).ToArray(); } var items = await TaskCombinators.ThrottledAsync( packages, (p, t) => _metadataProvider.GetPackageMetadataAsync(p, searchToken.SearchFilter.IncludePrerelease, t), cancellationToken); var result = SearchResult.FromItems(items.ToArray()); var loadingStatus = hasMoreItems ? LoadingStatus.Ready : packages.Length == 0 ? LoadingStatus.NoItemsFound : LoadingStatus.NoMoreItems; result.SourceSearchStatus = new Dictionary <string, LoadingStatus> { { "Consolidate", loadingStatus } }; if (hasMoreItems) { result.NextToken = new FeedSearchContinuationToken { SearchString = searchToken.SearchString, SearchFilter = searchToken.SearchFilter, StartIndex = searchToken.StartIndex + packages.Length }; } return(result); }
public override async Task <SearchResult <IPackageSearchMetadata> > ContinueSearchAsync(ContinuationToken continuationToken, CancellationToken cancellationToken) { var searchToken = continuationToken as FeedSearchContinuationToken; if (searchToken == null) { throw new InvalidOperationException("Invalid token"); } if (_context != null) { _installedPackages = await _context.GetInstalledPackagesAsync(); _context = null; } var packages = _installedPackages .GetLatest() .Where(p => p.Id.IndexOf(searchToken.SearchString, StringComparison.OrdinalIgnoreCase) != -1) .OrderBy(p => p.Id) .Skip(searchToken.StartIndex) .Take(PageSize + 1) .ToArray(); var hasMoreItems = packages.Length > PageSize; if (hasMoreItems) { packages = packages.Take(packages.Length - 1).ToArray(); } var items = await TaskCombinators.ThrottledAsync( packages, (p, t) => GetPackageMetadataAsync (p, searchToken.SearchFilter.IncludePrerelease, t), cancellationToken); // The packages were originally sorted which is important because we Skip and Take based on that sort // however the asynchronous execution has randomly reordered the set. So we need to resort. var result = SearchResult.FromItems(items.OrderBy(p => p.Identity.Id).ToArray()); var loadingStatus = hasMoreItems ? LoadingStatus.Ready : packages.Length == 0 ? LoadingStatus.NoItemsFound : LoadingStatus.NoMoreItems; result.SourceSearchStatus = new Dictionary <string, LoadingStatus> { { "Installed", loadingStatus } }; if (hasMoreItems) { result.NextToken = new FeedSearchContinuationToken { SearchString = searchToken.SearchString, SearchFilter = searchToken.SearchFilter, StartIndex = searchToken.StartIndex + packages.Length }; } return(result); }