Skip to content

Commit

Permalink
Merge pull request #1700 from glopesdev/issue-1524
Browse files Browse the repository at this point in the history
Allow filtering package updates
  • Loading branch information
glopesdev authored Mar 1, 2024
2 parents 63e6234 + 4fedb4e commit 27c527a
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 41 deletions.
2 changes: 1 addition & 1 deletion Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<TargetFramework>net472</TargetFramework>
<VersionPrefix>2.8.0</VersionPrefix>
<VersionPrefix>2.8.1</VersionPrefix>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Bonsai.Design\Bonsai.Design.csproj" />
Expand Down
11 changes: 4 additions & 7 deletions Bonsai.NuGet.Design/PackageViewController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Bonsai.Design;
using Bonsai.Design;
using Bonsai.NuGet.Design.Properties;
using NuGet.Configuration;
using NuGet.Frameworks;
Expand Down Expand Up @@ -209,12 +209,9 @@ QueryContinuation<IEnumerable<IPackageSearchMetadata>> GetPackageQuery(string se

QueryContinuation<IEnumerable<IPackageSearchMetadata>> GetPackageQuery(SourceRepository repository, string searchTerm, int pageSize, bool includePrerelease, bool updateFeed)
{
if (updateFeed)
{
var localPackages = PackageManager.LocalRepository.GetLocalPackages();
return new UpdateQuery(repository, localPackages, includePrerelease);
}
else return new SearchQuery(repository, searchTerm, pageSize, includePrerelease, packageTypes);
return updateFeed
? new UpdateQuery(repository, PackageManager.LocalRepository, searchTerm, includePrerelease, packageTypes)
: new SearchQuery(repository, searchTerm, pageSize, includePrerelease, packageTypes);
}

static Bitmap ResizeImage(Image image, Size newSize)
Expand Down
2 changes: 1 addition & 1 deletion Bonsai.NuGet/Bonsai.NuGet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
<VersionPrefix>2.8.0</VersionPrefix>
<VersionPrefix>2.8.1</VersionPrefix>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
<PackageReference Include="Rx-Main" Version="2.2.5" />
Expand Down
17 changes: 17 additions & 0 deletions Bonsai.NuGet/QueryHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet
{
static class QueryHelper
{
public static SearchFilter CreateSearchFilter(bool includePrerelease, IEnumerable<string> packageTypes)
{
var searchFilterType = includePrerelease ? SearchFilterType.IsAbsoluteLatestVersion : SearchFilterType.IsLatestVersion;
return new SearchFilter(includePrerelease, searchFilterType)
{
PackageTypes = packageTypes
};
}
}
}
31 changes: 20 additions & 11 deletions Bonsai.NuGet/SearchQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,23 @@ namespace Bonsai.NuGet
{
public class SearchQuery : QueryContinuation<IEnumerable<IPackageSearchMetadata>>
{
public SearchQuery(SourceRepository repository, string searchTerm, int pageSize, bool includePrerelease, IEnumerable<string> packageTypes = default)
public SearchQuery(
SourceRepository repository,
string searchTerm,
int pageSize,
bool includePrerelease,
IEnumerable<string> packageTypes = default)
: this(repository, searchTerm, 0, pageSize, includePrerelease, packageTypes)
{
}

private SearchQuery(SourceRepository repository, string searchTerm, int pageIndex, int pageSize, bool includePrerelease, IEnumerable<string> packageTypes)
private SearchQuery(
SourceRepository repository,
string searchTerm,
int pageIndex,
int pageSize,
bool includePrerelease,
IEnumerable<string> packageTypes)
{
Repository = repository;
SearchTerm = searchTerm;
Expand All @@ -25,23 +36,21 @@ private SearchQuery(SourceRepository repository, string searchTerm, int pageInde
PackageTypes = packageTypes;
}

public SourceRepository Repository { get; private set; }
public SourceRepository Repository { get; }

public string SearchTerm { get; private set; }
public string SearchTerm { get; }

public int PageIndex { get; private set; }
public int PageIndex { get; }

public int PageSize { get; private set; }
public int PageSize { get; }

public bool IncludePrerelease { get; private set; }
public bool IncludePrerelease { get; }

public IEnumerable<string> PackageTypes { get; private set; }
public IEnumerable<string> PackageTypes { get; }

public override async Task<QueryResult<IEnumerable<IPackageSearchMetadata>>> GetResultAsync(CancellationToken token = default)
{
var searchFilterType = IncludePrerelease ? SearchFilterType.IsAbsoluteLatestVersion : SearchFilterType.IsLatestVersion;
var searchFilter = new SearchFilter(IncludePrerelease, searchFilterType);
searchFilter.PackageTypes = PackageTypes;
var searchFilter = QueryHelper.CreateSearchFilter(IncludePrerelease, PackageTypes);
try
{
var result = (await Repository.SearchAsync(SearchTerm, searchFilter, PageIndex * PageSize, PageSize + 1, token)).ToList();
Expand Down
28 changes: 17 additions & 11 deletions Bonsai.NuGet/SourceRepositoryExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,27 @@ public static async Task<IEnumerable<IPackageSearchMetadata>> GetMetadataAsync(t
return await packageMetadataResource.GetMetadataAsync(id, includePrerelease, includeUnlisted: false, cacheContext, NullLogger.Instance, token);
}

public static async Task<IEnumerable<IPackageSearchMetadata>> GetUpdatesAsync(this SourceRepository repository, IEnumerable<LocalPackageInfo> localPackages, bool includePrerelease, CancellationToken token = default)
public static Task<IEnumerable<IPackageSearchMetadata>> GetUpdatesAsync(this SourceRepository repository, IEnumerable<IPackageSearchMetadata> localPackages, bool includePrerelease, CancellationToken token = default)
{
return GetUpdatesAsync(repository, localPackages.Select(package => package.Identity), includePrerelease, token);
}

public static Task<IEnumerable<IPackageSearchMetadata>> GetUpdatesAsync(this SourceRepository repository, IEnumerable<LocalPackageInfo> localPackages, bool includePrerelease, CancellationToken token = default)
{
return GetUpdatesAsync(repository, localPackages.Select(package => package.Identity), includePrerelease, token);
}

public static async Task<IEnumerable<IPackageSearchMetadata>> GetUpdatesAsync(this SourceRepository repository, IEnumerable<PackageIdentity> packages, bool includePrerelease, CancellationToken token = default)
{
var updatePackages = new List<IPackageSearchMetadata>();
using var cacheContext = new SourceCacheContext { MaxAge = DateTimeOffset.UtcNow };
foreach (var package in localPackages)
var tasks = packages.Select(package =>
{
var updateRange = new VersionRange(package.Identity.Version, includeMinVersion: false);
var latestPackage = await GetLatestMetadataAsync(repository, package.Identity.Id, updateRange, includePrerelease, cacheContext, token);
if (latestPackage != null)
{
updatePackages.Add(latestPackage);
}
}
var updateRange = new VersionRange(package.Version, includeMinVersion: false);
return GetLatestMetadataAsync(repository, package.Id, updateRange, includePrerelease, cacheContext, token);
}).ToArray();

return updatePackages;
var packageUpdates = await Task.WhenAll(tasks);
return packageUpdates.Where(package => package != null).ToList();
}

public static async Task<IPackageSearchMetadata> GetMetadataAsync(this SourceRepository repository, PackageIdentity identity, SourceCacheContext cacheContext, CancellationToken token = default)
Expand Down
35 changes: 25 additions & 10 deletions Bonsai.NuGet/UpdateQuery.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Protocol.Core.Types;
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
Expand All @@ -10,25 +9,41 @@ namespace Bonsai.NuGet
{
public class UpdateQuery : QueryContinuation<IEnumerable<IPackageSearchMetadata>>
{
public UpdateQuery(SourceRepository repository, IEnumerable<LocalPackageInfo> localPackages, bool includePrerelease)
public UpdateQuery(
SourceRepository remoteRepository,
SourceRepository localRepository,
string searchTerm,
bool includePrerelease,
IEnumerable<string> packageTypes = default)
{
Repository = repository;
LocalPackages = localPackages;
RemoteRepository = remoteRepository;
LocalRepository = localRepository;
SearchTerm = searchTerm;
IncludePrerelease = includePrerelease;
PackageTypes = packageTypes;
}

public SourceRepository Repository { get; private set; }
public SourceRepository RemoteRepository { get; }

public IEnumerable<LocalPackageInfo> LocalPackages { get; private set; }
public SourceRepository LocalRepository { get; }

public bool IncludePrerelease { get; private set; }
public string SearchTerm { get; }

public bool IncludePrerelease { get; }

public IEnumerable<string> PackageTypes { get; }

public override async Task<QueryResult<IEnumerable<IPackageSearchMetadata>>> GetResultAsync(CancellationToken token = default)
{
try { return QueryResult.Create(await Repository.GetUpdatesAsync(LocalPackages, IncludePrerelease, token)); }
try
{
var searchFilter = QueryHelper.CreateSearchFilter(IncludePrerelease, PackageTypes);
var localPackages = await LocalRepository.SearchAsync(SearchTerm, searchFilter, 0, int.MaxValue, token);
return QueryResult.Create(await RemoteRepository.GetUpdatesAsync(localPackages, IncludePrerelease, token));
}
catch (NuGetProtocolException ex)
{
var exception = new InvalidOperationException($"There was an error accessing the repository '{Repository}'.", ex);
var exception = new InvalidOperationException($"There was an error accessing the repository '{RemoteRepository}'.", ex);
return QueryResult.Create(Observable.Throw<IPackageSearchMetadata>(exception).ToEnumerable());
}
}
Expand Down

0 comments on commit 27c527a

Please sign in to comment.