Skip to content

Commit 2ee751a

Browse files
author
Christy Henriksson
authored
Merge pull request #57 from NuGet/dev
[ReleasePrep 2018-02-26]Merge dev into master
2 parents bf717c1 + 5a354c6 commit 2ee751a

5 files changed

Lines changed: 145 additions & 16 deletions

File tree

src/NuGet.Server.Core/Infrastructure/IServerPackageRepository.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ Task<IEnumerable<IServerPackage>> SearchAsync(
2222
ClientCompatibility compatibility,
2323
CancellationToken token);
2424

25+
Task<IEnumerable<IServerPackage>> SearchAsync(
26+
string searchTerm,
27+
IEnumerable<string> targetFrameworks,
28+
bool allowPrereleaseVersions,
29+
bool allowUnlistedVersions,
30+
ClientCompatibility compatibility,
31+
CancellationToken token);
32+
2533
Task ClearCacheAsync(CancellationToken token);
2634

2735
Task RemovePackageAsync(string packageId, SemanticVersion version, CancellationToken token);

src/NuGet.Server.Core/Infrastructure/ServerPackageRepository.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,25 @@ public async Task<IEnumerable<IServerPackage>> SearchAsync(
214214
bool allowPrereleaseVersions,
215215
ClientCompatibility compatibility,
216216
CancellationToken token)
217+
{
218+
return await SearchAsync(searchTerm, targetFrameworks, allowPrereleaseVersions, false, compatibility, token);
219+
}
220+
221+
public async Task<IEnumerable<IServerPackage>> SearchAsync(
222+
string searchTerm,
223+
IEnumerable<string> targetFrameworks,
224+
bool allowPrereleaseVersions,
225+
bool allowUnlistedVersions,
226+
ClientCompatibility compatibility,
227+
CancellationToken token)
217228
{
218229
var cache = await GetPackagesAsync(compatibility, token);
219230

220231
var packages = cache
221232
.Find(searchTerm)
222233
.FilterByPrerelease(allowPrereleaseVersions);
223234

224-
if (EnableDelisting)
235+
if (EnableDelisting && !allowUnlistedVersions)
225236
{
226237
packages = packages.Where(p => p.Listed);
227238
}
@@ -496,7 +507,7 @@ private async Task<HashSet<ServerPackage>> ReadPackagesFromDiskWithoutLockingAsy
496507
throw;
497508
}
498509
}
499-
510+
500511
/// <summary>
501512
/// Sets the current cache to null so it will be regenerated next time.
502513
/// </summary>
@@ -605,7 +616,7 @@ private async void FileSystemChangedAsync(object sender, FileSystemEventArgs e)
605616
return;
606617
}
607618

608-
changedDirectory = Path.GetFullPath(changedDirectory);
619+
changedDirectory = Path.GetFullPath(changedDirectory);
609620

610621
// 1) If a .nupkg is dropped in the root, add it as a package
611622
if (string.Equals(changedDirectory, _watchDirectory, StringComparison.OrdinalIgnoreCase)

src/NuGet.Server.Core/Infrastructure/ServerPackageRepositoryExtensions.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ public static async Task<IEnumerable<IServerPackage>> SearchAsync(
3838
token);
3939
}
4040

41+
public static async Task<IEnumerable<IServerPackage>> SearchAsync(
42+
this IServerPackageRepository repository,
43+
string searchTerm,
44+
bool allowPrereleaseVersions,
45+
bool allowUnlistedVersions,
46+
ClientCompatibility compatibility,
47+
CancellationToken token)
48+
{
49+
return await repository.SearchAsync(
50+
searchTerm,
51+
Enumerable.Empty<string>(),
52+
allowPrereleaseVersions,
53+
allowUnlistedVersions,
54+
compatibility,
55+
token);
56+
}
57+
4158
public static async Task<IServerPackage> FindPackageAsync(
4259
this IServerPackageRepository repository,
4360
string id,

src/NuGet.Server.V2/Controllers/NuGetODataController.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ protected NuGetODataController(
4444
_serverRepository = repository ?? throw new ArgumentNullException(nameof(repository));
4545
_authenticationService = authenticationService;
4646
}
47-
47+
4848
// GET /Packages
4949
[HttpGet]
5050
public virtual async Task<IHttpActionResult> Get(
@@ -129,8 +129,8 @@ public virtual IHttpActionResult GetPropertyFromPackages(string propertyName, st
129129
[HttpPost]
130130
public virtual async Task<IHttpActionResult> Search(
131131
ODataQueryOptions<ODataPackage> options,
132-
[FromODataUri] string searchTerm = "",
133-
[FromODataUri] string targetFramework = "",
132+
[FromODataUri] string searchTerm = "",
133+
[FromODataUri] string targetFramework = "",
134134
[FromODataUri] bool includePrerelease = false,
135135
[FromODataUri] bool includeDelisted = false,
136136
[FromUri] string semVerLevel = "",
@@ -144,6 +144,7 @@ public virtual async Task<IHttpActionResult> Search(
144144
searchTerm,
145145
targetFrameworks,
146146
includePrerelease,
147+
includeDelisted,
147148
clientCompatibility,
148149
token);
149150

@@ -203,8 +204,8 @@ public virtual async Task<IHttpActionResult> GetUpdates(
203204

204205
var idValues = packageIds.Trim().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
205206
var versionValues = versions.Trim().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
206-
var targetFrameworkValues = String.IsNullOrEmpty(targetFrameworks)
207-
? null
207+
var targetFrameworkValues = String.IsNullOrEmpty(targetFrameworks)
208+
? null
208209
: targetFrameworks.Split('|').Select(VersionUtility.ParseFrameworkName).ToList();
209210
var versionConstraintValues = (String.IsNullOrEmpty(versionConstraints)
210211
? new string[idValues.Length]
@@ -219,7 +220,7 @@ public virtual async Task<IHttpActionResult> GetUpdates(
219220
var packagesToUpdate = new List<IPackageMetadata>();
220221
for (var i = 0; i < idValues.Length; i++)
221222
{
222-
if(SemanticVersion.TryParse(versionValues[i], out var semVersion))
223+
if (SemanticVersion.TryParse(versionValues[i], out var semVersion))
223224
{
224225
packagesToUpdate.Add(new PackageBuilder { Id = idValues[i], Version = semVersion });
225226
}
@@ -365,7 +366,7 @@ public virtual async Task<HttpResponseMessage> DeletePackage(
365366
}
366367
else
367368
{
368-
return CreateStringResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}', version '{1}'.", requestedPackage.Id,version));
369+
return CreateStringResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}', version '{1}'.", requestedPackage.Id, version));
369370
}
370371
}
371372

@@ -416,7 +417,7 @@ public virtual async Task<HttpResponseMessage> UploadPackage(CancellationToken t
416417
File.Delete(temporaryFile);
417418
}
418419
catch (Exception)
419-
{
420+
{
420421
retValue = CreateStringResponse(HttpStatusCode.InternalServerError, "Could not remove temporary upload file.");
421422
}
422423

@@ -436,7 +437,7 @@ private string GetApiKeyFromHeader()
436437
{
437438
apiKey = values.FirstOrDefault();
438439
}
439-
440+
440441
return apiKey;
441442
}
442443

test/NuGet.Server.Core.Tests/ServerPackageRepositoryTest.cs

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ public async Task ServerPackageRepositoryAddsPackagesFromDropFolderOnStart(bool
106106
foreach (var packageToAddToDropFolder in packagesToAddToDropFolder)
107107
{
108108
var package = packages.FirstOrDefault(
109-
p => p.Id == packageToAddToDropFolder.Value.Id
109+
p => p.Id == packageToAddToDropFolder.Value.Id
110110
&& p.Version == packageToAddToDropFolder.Value.Version);
111111

112112
// check the package from drop folder has been added
113-
Assert.NotNull(package);
113+
Assert.NotNull(package);
114114

115115
// check the package in the drop folder has been removed
116116
Assert.False(File.Exists(Path.Combine(temporaryDirectory.Path, packageToAddToDropFolder.Key)));
@@ -356,6 +356,98 @@ public async Task ServerPackageRepositorySearchUnlisted()
356356
}
357357
}
358358

359+
[Fact]
360+
public async Task ServerPackageRepositorySearchUnlistingDisabledAndExclude()
361+
{
362+
await ServerPackageRepositorySearchUnlistedWithOptions(
363+
enableUnlisting: false,
364+
allowUnlistedVersions: false,
365+
searchable: false,
366+
gettable: false);
367+
}
368+
369+
[Fact]
370+
public async Task ServerPackageRepositorySearchUnlistingDisabledAndInclude()
371+
{
372+
await ServerPackageRepositorySearchUnlistedWithOptions(
373+
enableUnlisting: false,
374+
allowUnlistedVersions: true,
375+
searchable: false,
376+
gettable: false);
377+
}
378+
379+
[Fact]
380+
public async Task ServerPackageRepositorySearchUnlistingEnabledAndExclude()
381+
{
382+
await ServerPackageRepositorySearchUnlistedWithOptions(
383+
enableUnlisting: true,
384+
allowUnlistedVersions: false,
385+
searchable: false,
386+
gettable: true);
387+
}
388+
389+
[Fact]
390+
public async Task ServerPackageRepositorySearchUnlistingEnabledAndInclude()
391+
{
392+
await ServerPackageRepositorySearchUnlistedWithOptions(
393+
enableUnlisting: true,
394+
allowUnlistedVersions: true,
395+
searchable: true,
396+
gettable: true);
397+
}
398+
399+
private async Task ServerPackageRepositorySearchUnlistedWithOptions(
400+
bool enableUnlisting, bool allowUnlistedVersions, bool searchable, bool gettable)
401+
{
402+
using (var temporaryDirectory = new TemporaryDirectory())
403+
{
404+
// Arrange
405+
var getSetting = enableUnlisting ? EnableDelisting : (Func<string, object, object>)null;
406+
var serverRepository = await CreateServerPackageRepositoryAsync(temporaryDirectory.Path, repository =>
407+
{
408+
repository.AddPackage(CreatePackage("test1", "1.0"));
409+
}, getSetting);
410+
411+
// Remove the package
412+
await serverRepository.RemovePackageAsync("test1", new SemanticVersion("1.0"), Token);
413+
414+
// Verify that the package is not returned by search
415+
var packages = (await serverRepository.SearchAsync(
416+
"test1",
417+
allowPrereleaseVersions: true,
418+
allowUnlistedVersions: allowUnlistedVersions,
419+
compatibility: ClientCompatibility.Max,
420+
token: Token)).ToList();
421+
if (searchable)
422+
{
423+
Assert.Equal(1, packages.Count);
424+
Assert.Equal("test1", packages[0].Id);
425+
Assert.Equal("1.0", packages[0].Version.ToString());
426+
Assert.False(packages[0].Listed);
427+
}
428+
else
429+
{
430+
Assert.Equal(0, packages.Count);
431+
}
432+
433+
// Act: search with includeDelisted=true
434+
packages = (await serverRepository.GetPackagesAsync(ClientCompatibility.Max, Token)).ToList();
435+
436+
// Assert
437+
if (gettable)
438+
{
439+
Assert.Equal(1, packages.Count);
440+
Assert.Equal("test1", packages[0].Id);
441+
Assert.Equal("1.0", packages[0].Version.ToString());
442+
Assert.False(packages[0].Listed);
443+
}
444+
else
445+
{
446+
Assert.Equal(0, packages.Count);
447+
}
448+
}
449+
}
450+
359451
[Fact]
360452
public async Task ServerPackageRepositoryFindPackageById()
361453
{
@@ -463,7 +555,7 @@ public async Task ServerPackageRepositoryFindPackage()
463555
new SemanticVersion("1.0.0-alpha"),
464556
Token);
465557
var invalidPreRel = await serverRepository.FindPackageAsync(
466-
"test3",
558+
"test3",
467559
new SemanticVersion("1.0.0"),
468560
Token);
469561
var invalid = await serverRepository.FindPackageAsync("bad", new SemanticVersion("1.0"), Token);
@@ -586,7 +678,7 @@ public async Task ServerPackageRepositoryIsLatestOnlyPreRel()
586678
repository.AddPackage(CreatePackage("test", "2.1-alpha"));
587679
repository.AddPackage(CreatePackage("test", "2.2-beta+tagged"));
588680
});
589-
681+
590682
// Act
591683
var packages = await serverRepository.GetPackagesAsync(ClientCompatibility.Max, Token);
592684

0 commit comments

Comments
 (0)