Skip to content

Commit 9062483

Browse files
committed
Dependency filtering using DependencyInfoResource.
1 parent 5e516ef commit 9062483

File tree

10 files changed

+85
-46
lines changed

10 files changed

+85
-46
lines changed

src/PackageManager.NuGet/Services/INuGetPackageFilter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Text;
6+
using System.Threading;
67
using System.Threading.Tasks;
78

89
namespace PackageManager.Services
910
{
1011
public interface INuGetPackageFilter
1112
{
12-
NuGetPackageFilterResult IsPassed(IPackageSearchMetadata package);
13+
Task<NuGetPackageFilterResult> IsPassedAsync(SourceRepository repository, IPackageSearchMetadata package, CancellationToken cancellationToken);
1314
}
1415
}

src/PackageManager.NuGet/Services/NuGetInstallService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ await ReadPackageConfig(
182182
{
183183
log.Debug($"Package '{package.PackageIdentity}' was found.");
184184

185-
NuGetPackageFilterResult filterResult = packageFilter.IsPassed(metadata);
185+
NuGetPackageFilterResult filterResult = await packageFilter.IsPassedAsync(repository, metadata, cancellationToken);
186186
result.Add(new NuGetInstalledPackage(
187187
new NuGetPackage(metadata, repository, contentService, versionService),
188188
filterResult == NuGetPackageFilterResult.Ok

src/PackageManager.NuGet/Services/NuGetPackageVersionService.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public async Task<IReadOnlyList<IPackage>> GetListAsync(int resultCount, IPackag
4545
try
4646
{
4747
List<IPackage> result = new List<IPackage>();
48-
if (await SearchOlderVersionsDirectly(result, resultCount, package, repository, versionFilter))
48+
if (await SearchOlderVersionsDirectly(result, resultCount, package, repository, versionFilter, cancellationToken))
4949
return result;
5050

5151
if (await SearchOlderVersionsUsingMetadataResource(result, resultCount, package, repository, versionFilter, isPrereleaseIncluded, cancellationToken))
@@ -60,7 +60,7 @@ public async Task<IReadOnlyList<IPackage>> GetListAsync(int resultCount, IPackag
6060
}
6161
}
6262

63-
private async Task<bool> SearchOlderVersionsDirectly(List<IPackage> result, int resultCount, IPackageSearchMetadata package, SourceRepository repository, Func<IPackageSearchMetadata, IPackageSearchMetadata, bool> versionFilter)
63+
private async Task<bool> SearchOlderVersionsDirectly(List<IPackage> result, int resultCount, IPackageSearchMetadata package, SourceRepository repository, Func<IPackageSearchMetadata, IPackageSearchMetadata, bool> versionFilter, CancellationToken cancellationToken)
6464
{
6565
bool isSuccess = false;
6666
IEnumerable<VersionInfo> versions = null;
@@ -81,7 +81,7 @@ private async Task<bool> SearchOlderVersionsDirectly(List<IPackage> result, int
8181
// TODO: Filter prelease on V2 feed.
8282
if (version.PackageSearchMetadata != null && versionFilter(package, version.PackageSearchMetadata))
8383
{
84-
IPackage item = ProcessOlderVersion(repository, version.PackageSearchMetadata);
84+
IPackage item = await ProcessOlderVersionAsync(repository, version.PackageSearchMetadata, cancellationToken);
8585
if (item != null)
8686
{
8787
result.Add(item);
@@ -118,7 +118,7 @@ private async Task<bool> SearchOlderVersionsUsingMetadataResource(List<IPackage>
118118
{
119119
if (versionFilter(package, version))
120120
{
121-
IPackage item = ProcessOlderVersion(repository, version);
121+
IPackage item = await ProcessOlderVersionAsync(repository, version, cancellationToken);
122122
if (item != null)
123123
{
124124
result.Add(item);
@@ -132,11 +132,11 @@ private async Task<bool> SearchOlderVersionsUsingMetadataResource(List<IPackage>
132132
return true;
133133
}
134134

135-
private IPackage ProcessOlderVersion(SourceRepository repository, IPackageSearchMetadata version)
135+
private async Task<IPackage> ProcessOlderVersionAsync(SourceRepository repository, IPackageSearchMetadata version, CancellationToken cancellationToken)
136136
{
137137
log.Debug($"Found '{version.Identity}'.");
138138

139-
NuGetPackageFilterResult filterResult = filter.IsPassed(version);
139+
NuGetPackageFilterResult filterResult = await filter.IsPassedAsync(repository, version, cancellationToken);
140140
switch (filterResult)
141141
{
142142
case NuGetPackageFilterResult.Ok:

src/PackageManager.NuGet/Services/NuGetSearchService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
102102
if (result.Count >= options.PageSize)
103103
break;
104104

105-
await AddPackage(result, repository, package, options.IsPrereleaseIncluded, cancellationToken);
105+
await AddPackageAsync(result, repository, package, options.IsPrereleaseIncluded, cancellationToken);
106106
sourceSearchPackageCount++;
107107
}
108108

@@ -128,9 +128,9 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
128128
return result;
129129
}
130130

131-
private async Task AddPackage(List<IPackage> result, SourceRepository repository, IPackageSearchMetadata package, bool isPrereleaseIncluded, CancellationToken cancellationToken)
131+
private async Task AddPackageAsync(List<IPackage> result, SourceRepository repository, IPackageSearchMetadata package, bool isPrereleaseIncluded, CancellationToken cancellationToken)
132132
{
133-
NuGetPackageFilterResult filterResult = filter.IsPassed(package);
133+
NuGetPackageFilterResult filterResult = await filter.IsPassedAsync(repository, package, cancellationToken);
134134
switch (filterResult)
135135
{
136136
case NuGetPackageFilterResult.Ok:

src/PackageManager.NuGet/Services/OkNuGetPackageFilter.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using System.Threading;
56
using System.Threading.Tasks;
67
using NuGet.Protocol.Core.Types;
78

89
namespace PackageManager.Services
910
{
1011
public class OkNuGetPackageFilter : INuGetPackageFilter
1112
{
12-
public NuGetPackageFilterResult IsPassed(IPackageSearchMetadata package)
13-
=> NuGetPackageFilterResult.Ok;
13+
public Task<NuGetPackageFilterResult> IsPassedAsync(SourceRepository repository, IPackageSearchMetadata package, CancellationToken cancellationToken)
14+
=> Task.FromResult(NuGetPackageFilterResult.Ok);
1415

1516
#region Singleton
1617

src/PackageManager.UI/App.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected override void OnStartup(StartupEventArgs e)
6969
NuGetSourceRepositoryFactory repositoryFactory = new NuGetSourceRepositoryFactory();
7070
INuGetPackageFilter packageFilter = null;
7171
if (Args.Dependencies.Any())
72-
packageFilter = new DependencyNuGetPackageFilter(Args.Dependencies, frameworks);
72+
packageFilter = new DependencyNuGetPackageFilter(LogFactory.Scope("Filter"), Args.Dependencies, frameworks);
7373

7474
NuGetPackageContent.IFrameworkFilter frameworkFilter = null;
7575
if (Args.Monikers.Any())

src/PackageManager.UI/Services/DependencyNuGetPackageFilter.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,75 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using System.Threading;
56
using System.Threading.Tasks;
67
using Neptuo;
8+
using Neptuo.Logging;
9+
using NuGet.Common;
710
using NuGet.Frameworks;
811
using NuGet.Packaging.Core;
912
using NuGet.Protocol.Core.Types;
1013
using NuGet.Versioning;
14+
using PackageManager.Logging;
1115

1216
namespace PackageManager.Services
1317
{
1418
public class DependencyNuGetPackageFilter : INuGetPackageFilter
1519
{
20+
private readonly ILog log;
21+
private readonly NuGetLogger nuGetLogger;
1622
private readonly IReadOnlyCollection<Args.Dependency> dependencies;
1723
private readonly IReadOnlyCollection<NuGetFramework> frameworks;
1824

19-
public DependencyNuGetPackageFilter(IReadOnlyCollection<Args.Dependency> dependencies, IReadOnlyCollection<NuGetFramework> frameworks)
25+
public DependencyNuGetPackageFilter(ILog log, IReadOnlyCollection<Args.Dependency> dependencies, IReadOnlyCollection<NuGetFramework> frameworks)
2026
{
27+
Ensure.NotNull(log, "log");
2128
Ensure.NotNull(dependencies, "dependencies");
2229
Ensure.NotNull(frameworks, "frameworks");
30+
this.log = log;
2331
this.dependencies = dependencies;
2432
this.frameworks = frameworks;
33+
34+
nuGetLogger = new NuGetLogger(log);
2535
}
2636

27-
public NuGetPackageFilterResult IsPassed(IPackageSearchMetadata package)
37+
public async Task<NuGetPackageFilterResult> IsPassedAsync(SourceRepository repository, IPackageSearchMetadata package, CancellationToken cancellationToken)
2838
{
2939
if (!dependencies.Any())
3040
return NuGetPackageFilterResult.Ok;
3141

32-
foreach (var group in package.DependencySets)
42+
DependencyInfoResource resource = await repository.GetResourceAsync<DependencyInfoResource>();
43+
if (resource == null)
44+
return NuGetPackageFilterResult.NotCompatible;
45+
46+
NuGetPackageFilterResult result = NuGetPackageFilterResult.Ok;
47+
foreach (NuGetFramework framework in frameworks)
3348
{
34-
if (frameworks.Contains(group.TargetFramework))
49+
SourcePackageDependencyInfo dependencyInfo = await resource.ResolvePackage(package.Identity, framework, new SourceCacheContext(), nuGetLogger, cancellationToken);
50+
if (dependencyInfo != null)
3551
{
36-
NuGetPackageFilterResult result = NuGetPackageFilterResult.Ok;
37-
3852
// Dependency filtering:
3953
// - When incompatible dependency version is found there is a chance that previous version has the right one.
4054
// - When all dependencies are missing, don't even try previous versions.
4155
foreach (var dependency in dependencies)
4256
{
43-
PackageDependency packageDependency = group.Packages.FirstOrDefault(p => p.Id == dependency.Id);
57+
PackageDependency packageDependency = dependencyInfo.Dependencies.FirstOrDefault(p => p.Id == dependency.Id);
4458
if (packageDependency == null)
59+
{
60+
log.Info($"Package '{package.Identity}' skipped: missing dependency '{dependency.Id}'.");
4561
result = NuGetPackageFilterResult.NotCompatible;
62+
}
4663

4764
if (dependency.Version != null && !packageDependency.VersionRange.Satisfies(new NuGetVersion(dependency.Version)))
65+
{
66+
log.Info($"Package '{package.Identity}' skipped: not compatible version '{dependency.Version}' on dependency '{dependency.Id}'.");
4867
return NuGetPackageFilterResult.NotCompatibleVersion;
68+
}
4969
}
5070

5171
return result;
5272
}
73+
5374
}
5475

5576
return NuGetPackageFilterResult.NotCompatible;

src/PackageManager/ViewModels/PackageSourceSelectorViewModel.cs

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ public string SelectedName
4848

4949
selectedSources = null;
5050

51-
if (value == null)
52-
service.MarkAsPrimary(null);
53-
else
54-
service.MarkAsPrimary(service.All.FirstOrDefault(s => s.Name == value));
51+
if (!isServiceUpdating)
52+
{
53+
if (value == null)
54+
service.MarkAsPrimary(null);
55+
else
56+
service.MarkAsPrimary(service.All.FirstOrDefault(s => s.Name == value));
57+
}
5558
}
5659
}
5760
}
@@ -68,32 +71,43 @@ public PackageSourceSelectorViewModel(IPackageSourceCollection service)
6871

6972
private void OnServiceChanged()
7073
{
71-
string selectedName = SelectedName;
72-
SourceNames.Clear();
73-
74-
bool isSelectedNameContained = false;
75-
void Add(string name)
74+
try
7675
{
77-
if (!isSelectedNameContained)
78-
isSelectedNameContained = name == selectedName;
76+
isServiceUpdating = true;
7977

80-
SourceNames.Add(name);
81-
}
78+
string selectedName = SelectedName;
79+
SourceNames.Clear();
8280

83-
if (service.All.Count > 1)
84-
Add(AllFeedName);
81+
bool isSelectedNameContained = false;
82+
void Add(string name)
83+
{
84+
if (!isSelectedNameContained)
85+
isSelectedNameContained = name == selectedName;
86+
87+
SourceNames.Add(name);
88+
}
8589

86-
foreach (IPackageSource source in service.All)
87-
Add(source.Name);
90+
if (service.All.Count > 1)
91+
Add(AllFeedName);
8892

89-
if (isSelectedNameContained)
90-
SelectedName = selectedName;
91-
else if(service.Primary != null)
92-
SelectedName = SourceNames.FirstOrDefault(s => s == service.Primary.Name);
93-
else
94-
SelectedName = SourceNames.FirstOrDefault();
93+
foreach (IPackageSource source in service.All)
94+
Add(source.Name);
95+
96+
if (isSelectedNameContained)
97+
SelectedName = selectedName;
98+
else if (service.Primary != null)
99+
SelectedName = SourceNames.FirstOrDefault(s => s == service.Primary.Name);
100+
else
101+
SelectedName = SourceNames.FirstOrDefault();
102+
}
103+
finally
104+
{
105+
isServiceUpdating = false;
106+
}
95107
}
96108

109+
private bool isServiceUpdating = false;
110+
97111
public void Dispose()
98112
{
99113
service.Changed -= OnServiceChanged;

test/PackageManager.NuGet.Tests/Services/InstallService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public static IInstallService Create(string extractPath)
2828

2929
var frameworkFilter = new NuGetFrameworkFilter(frameworks);
3030
var packageFilter = new DependencyNuGetPackageFilter(
31+
new DefaultLog(),
3132
new List<Args.Dependency>()
3233
{
3334
new Args.Dependency("GitExtensions.Extensibility", null)

test/PackageManager.NuGet.Tests/Services/SearchService.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public static (ISearchService search, IPackageSourceCollection sources) Create(s
2828

2929
var frameworkFilter = new NuGetFrameworkFilter(frameworks);
3030
var packageFilter = new DependencyNuGetPackageFilter(
31+
new DefaultLog(),
3132
new List<Args.Dependency>()
3233
{
3334
new Args.Dependency("GitExtensions.Extensibility", null)
@@ -45,10 +46,10 @@ public static (ISearchService search, IPackageSourceCollection sources) Create(s
4546
frameworkFilter
4647
),
4748
new DependencyNuGetPackageFilter(
49+
new DefaultLog(),
4850
new List<Args.Dependency>() { new Args.Dependency("GitExtensions.Extensibility", null) },
4951
frameworks
50-
),
51-
new NuGetFrameworkFilter(frameworks)
52+
)
5253
);
5354

5455
EnsureConfigDeleted(configFilePath);

0 commit comments

Comments
 (0)