Skip to content

Commit 16be307

Browse files
committed
When feed is a local folder, search for all packages and than apply all filters in app.
1 parent 916efd5 commit 16be307

File tree

2 files changed

+79
-5
lines changed

2 files changed

+79
-5
lines changed

src/PackageManager.NuGet/Services/NuGetSearchService.cs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Neptuo.Activators;
99
using Neptuo.Logging;
1010
using NuGet.Common;
11+
using NuGet.Protocol;
1112
using NuGet.Protocol.Core.Types;
1213
using NuGet.Versioning;
1314
using PackageManager.Logging;
@@ -71,11 +72,16 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
7172
queryTransformer.Transform(term);
7273
term.Id.Remove(searchText);
7374

74-
bool isLateIdSearch = false;
75+
NuGetSearchTerm lateTerm = null;
7576
if (term.IsEmpty())
77+
{
7678
term.Id.Add(searchText);
79+
}
7780
else
78-
isLateIdSearch = true;
81+
{
82+
lateTerm = term.Clone();
83+
lateTerm.Id.Add(searchText);
84+
}
7985

8086
log.Debug($"Searching - user text:'{searchText}'; target query:'{term}'.");
8187

@@ -103,6 +109,21 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
103109
continue;
104110
}
105111

112+
NuGetSearchTerm localTerm = null;
113+
bool clearLateTerm = false;
114+
if (search is LocalPackageSearchResource)
115+
{
116+
// Searching a feed from folder.
117+
localTerm = term;
118+
term = new NuGetSearchTerm();
119+
120+
if (lateTerm == null)
121+
{
122+
lateTerm = localTerm;
123+
clearLateTerm = true;
124+
}
125+
}
126+
106127
int sourceSearchPackageCount = 0;
107128
foreach (IPackageSearchMetadata package in await SearchAsync(search, term.ToString(), options, cancellationToken))
108129
{
@@ -112,8 +133,11 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
112133
if (result.Count >= options.PageSize)
113134
break;
114135

115-
if (isLateIdSearch && package.Identity.Id.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) == -1)
136+
if (lateTerm != null && !lateTerm.IsMatched(package))
137+
{
138+
log.Debug($"Package skipped by late search term '{lateTerm}'.");
116139
continue;
140+
}
117141

118142
await AddPackageAsync(result, repository, package, options.IsPrereleaseIncluded, cancellationToken);
119143
sourceSearchPackageCount++;
@@ -122,6 +146,15 @@ public async Task<IEnumerable<IPackage>> SearchAsync(IEnumerable<IPackageSource>
122146
// If package source reached end, skip it from next probing.
123147
if (sourceSearchPackageCount < options.PageSize)
124148
sourcesToSkip.Add(packageSource);
149+
150+
if (localTerm != null)
151+
{
152+
term = localTerm;
153+
localTerm = null;
154+
155+
if (clearLateTerm)
156+
lateTerm = null;
157+
}
125158
}
126159

127160
if (!hasItems)

src/PackageManager.NuGet/Services/NuGetSearchTerm.cs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System;
1+
using Neptuo;
2+
using NuGet.Protocol.Core.Types;
3+
using System;
24
using System.Collections.Generic;
35
using System.IO;
46
using System.Linq;
@@ -7,7 +9,7 @@
79

810
namespace PackageManager.Services
911
{
10-
public class NuGetSearchTerm
12+
public class NuGetSearchTerm : ICloneable<NuGetSearchTerm>
1113
{
1214
public List<string> Id { get; } = new List<string>();
1315
public List<string> Version { get; } = new List<string>();
@@ -55,5 +57,44 @@ private bool IsEmpty(List<string> values)
5557

5658
return false;
5759
}
60+
61+
public bool IsMatched(IPackageSearchMetadata package)
62+
=> IsMatched(package.Identity.Id, Id)
63+
&& IsMatched(package.Identity.Version.OriginalVersion, Version)
64+
&& IsMatched(package.Title, Title)
65+
&& IsMatched(package.Tags, Tags)
66+
&& IsMatched(package.Description, Description)
67+
&& IsMatched(package.Summary, Summary)
68+
&& IsMatched(package.Owners, Owner);
69+
70+
private bool IsMatched(string packageValue, List<string> values)
71+
{
72+
bool result = true;
73+
foreach (var value in values)
74+
{
75+
if (String.IsNullOrEmpty(value))
76+
continue;
77+
78+
if (packageValue.IndexOf(value, StringComparison.InvariantCultureIgnoreCase) != -1)
79+
return true;
80+
81+
result = false;
82+
}
83+
84+
return result;
85+
}
86+
87+
public NuGetSearchTerm Clone()
88+
{
89+
var clone = new NuGetSearchTerm();
90+
clone.Id.AddRange(Id);
91+
clone.Version.AddRange(Version);
92+
clone.Title.AddRange(Title);
93+
clone.Tags.AddRange(Tags);
94+
clone.Description.AddRange(Description);
95+
clone.Summary.AddRange(Summary);
96+
clone.Owner.AddRange(Owner);
97+
return clone;
98+
}
5899
}
59100
}

0 commit comments

Comments
 (0)