diff --git a/Directory.Build.props b/Directory.Build.props
index 18d4fe03c..ae8e5964c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -3,6 +3,7 @@
2.86.0
+ 5.9.1
4.4.5-dev-4633971
diff --git a/src/NuGet.Protocol.Catalog/NuGet.Protocol.Catalog.csproj b/src/NuGet.Protocol.Catalog/NuGet.Protocol.Catalog.csproj
index 9b42553bf..b1b005d7d 100644
--- a/src/NuGet.Protocol.Catalog/NuGet.Protocol.Catalog.csproj
+++ b/src/NuGet.Protocol.Catalog/NuGet.Protocol.Catalog.csproj
@@ -15,7 +15,7 @@
9.0.1
- 5.9.0
+ $(NuGetClientPackageVersion)
diff --git a/src/NuGet.Services.AzureSearch/Auxiliary2AzureSearch/UpdateDownloadsCommand.cs b/src/NuGet.Services.AzureSearch/Auxiliary2AzureSearch/UpdateDownloadsCommand.cs
index ba78bad2e..c609f7845 100644
--- a/src/NuGet.Services.AzureSearch/Auxiliary2AzureSearch/UpdateDownloadsCommand.cs
+++ b/src/NuGet.Services.AzureSearch/Auxiliary2AzureSearch/UpdateDownloadsCommand.cs
@@ -391,7 +391,7 @@ private void CleanDownloadData(DownloadData data)
foreach (var id in data.Keys.ToList())
{
var isValidId = id.Length <= PackageIdValidator.MaxPackageIdLength
- && PackageIdValidator.IsValidPackageIdWithTimeout(id);
+ && PackageIdValidator.IsValidPackageId(id);
if (!isValidId)
{
invalidIdCount++;
diff --git a/src/NuGet.Services.AzureSearch/PackageIdValidator.cs b/src/NuGet.Services.AzureSearch/PackageIdValidator.cs
deleted file mode 100644
index 7be01789c..000000000
--- a/src/NuGet.Services.AzureSearch/PackageIdValidator.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Globalization;
-using System.Text.RegularExpressions;
-
-namespace NuGet.Services.AzureSearch
-{
- // TODO: Delete this copy of the PackageIdValidator.
- // Tracked by: https://github.com/NuGet/Engineering/issues/3669
- // Forked from: https://github.com/NuGet/NuGet.Client/blob/18863da5be3dc8c7315f4416df1bc9ef96cb7446/src/NuGet.Core/NuGet.Packaging/PackageCreation/Utility/PackageIdValidator.cs
- public static class PackageIdValidator
- {
- public const int MaxPackageIdLength = 100;
- private static readonly Regex IdRegex = new Regex(pattern: @"^\w+([.-]\w+)*$",
- options: RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant,
- matchTimeout: TimeSpan.FromSeconds(15));
-
- public static bool IsValidPackageIdWithTimeout(string packageId)
- {
- if (packageId == null)
- {
- throw new ArgumentNullException(nameof(packageId));
- }
- return IdRegex.IsMatch(packageId);
- }
- }
-}
diff --git a/src/NuGet.Services.AzureSearch/SearchService/IndexOperationBuilder.cs b/src/NuGet.Services.AzureSearch/SearchService/IndexOperationBuilder.cs
index c739233a2..4e897e425 100644
--- a/src/NuGet.Services.AzureSearch/SearchService/IndexOperationBuilder.cs
+++ b/src/NuGet.Services.AzureSearch/SearchService/IndexOperationBuilder.cs
@@ -150,7 +150,7 @@ private bool TryGetSinglePackageId(
{
packageId = terms.First();
if (packageId.Length <= PackageIdValidator.MaxPackageIdLength
- && PackageIdValidator.IsValidPackageIdWithTimeout(packageId))
+ && PackageIdValidator.IsValidPackageId(packageId))
{
return true;
}
@@ -183,7 +183,7 @@ private static bool HasInvalidParameters(SearchRequest request, string packageTy
// Requests with bad parameters yield no results. For the package type case, by specification a package type
// valid characters are the same as a package ID.
return request.Skip > MaximumSkip
- || (packageType != null && !PackageIdValidator.IsValidPackageIdWithTimeout(packageType));
+ || (packageType != null && !PackageIdValidator.IsValidPackageId(packageType));
}
private static bool PagedToFirstItem(SearchRequest request)
diff --git a/src/NuGet.Services.AzureSearch/SearchService/Models/V3SearchPackage.cs b/src/NuGet.Services.AzureSearch/SearchService/Models/V3SearchPackage.cs
index 523a2d4ab..3186b653c 100644
--- a/src/NuGet.Services.AzureSearch/SearchService/Models/V3SearchPackage.cs
+++ b/src/NuGet.Services.AzureSearch/SearchService/Models/V3SearchPackage.cs
@@ -64,6 +64,10 @@ public class V3SearchPackage
[JsonPropertyName("authors")]
public string[] Authors { get; set; }
+ [JsonProperty("owners")]
+ [JsonPropertyName("owners")]
+ public string[] Owners { get; set; }
+
[JsonProperty("totalDownloads")]
[JsonPropertyName("totalDownloads")]
public long TotalDownloads { get; set; }
diff --git a/src/NuGet.Services.AzureSearch/SearchService/SearchParametersBuilder.cs b/src/NuGet.Services.AzureSearch/SearchService/SearchParametersBuilder.cs
index 3fe91d36b..23555e924 100644
--- a/src/NuGet.Services.AzureSearch/SearchService/SearchParametersBuilder.cs
+++ b/src/NuGet.Services.AzureSearch/SearchService/SearchParametersBuilder.cs
@@ -35,7 +35,7 @@ public class SearchParametersBuilder : ISearchParametersBuilder
private static readonly List CreatedAsc = new List { IndexFields.Created + Asc }; // Newest first
private static readonly List CreatedDesc = new List { IndexFields.Created + Desc }; // Oldest first
private static readonly List TotalDownloadsAsc = new List { IndexFields.Search.TotalDownloadCount + Asc, IndexFields.Created + Asc }; // Least downloads first, then oldest
- private static readonly List TotalDownloadsDesc = new List { IndexFields.Search.TotalDownloadCount + Desc, IndexFields.Created + Desc}; // Most downloads first, then newest
+ private static readonly List TotalDownloadsDesc = new List { IndexFields.Search.TotalDownloadCount + Desc, IndexFields.Created + Desc }; // Most downloads first, then newest
public SearchParameters LastCommitTimestamp()
{
@@ -104,7 +104,7 @@ public SearchParameters Autocomplete(AutocompleteRequest request, bool isDefault
searchParameters.Select = PackageIdsAutocompleteSelect;
ApplyPaging(searchParameters, request);
break;
-
+
// Package version autocomplete should only match a single document
// regardless of the request's parameters.
case AutocompleteRequestType.PackageVersions:
@@ -153,7 +153,7 @@ private void ApplySearchIndexFilter(
// Verify that the package type only has valid package ID characters so we don't need to worry about
// escaping quotes and such.
- if (packageType != null && PackageIdValidator.IsValidPackageIdWithTimeout(packageType))
+ if (packageType != null && PackageIdValidator.IsValidPackageId(packageType))
{
filterString += $" and {IndexFields.Search.FilterablePackageTypes}/any(p: p eq '{packageType.ToLowerInvariant()}')";
}
diff --git a/src/NuGet.Services.AzureSearch/SearchService/SearchResponseBuilder.cs b/src/NuGet.Services.AzureSearch/SearchService/SearchResponseBuilder.cs
index 9fa620a21..bd767ba13 100644
--- a/src/NuGet.Services.AzureSearch/SearchService/SearchResponseBuilder.cs
+++ b/src/NuGet.Services.AzureSearch/SearchService/SearchResponseBuilder.cs
@@ -377,6 +377,7 @@ private V3SearchPackage ToV3SearchPackage(SearchDocument.Full result, string reg
ProjectUrl = result.ProjectUrl,
Tags = result.Tags ?? Array.Empty(),
Authors = new[] { result.Authors ?? string.Empty },
+ Owners = result.Owners ?? Array.Empty(),
TotalDownloads = AuxiliaryData.GetTotalDownloadCount(result.PackageId),
Verified = AuxiliaryData.IsVerified(result.PackageId),
PackageTypes = GetV3SearchPackageTypes(result),
diff --git a/src/NuGet.Services.AzureSearch/SearchService/SearchTextBuilder.cs b/src/NuGet.Services.AzureSearch/SearchService/SearchTextBuilder.cs
index 145eaa5b3..f7b1a68b9 100644
--- a/src/NuGet.Services.AzureSearch/SearchService/SearchTextBuilder.cs
+++ b/src/NuGet.Services.AzureSearch/SearchService/SearchTextBuilder.cs
@@ -314,7 +314,7 @@ private static IEnumerable ProcessFieldValues(QueryField field, IEnumera
private static bool IsId(string query)
{
return query.Length <= PackageIdValidator.MaxPackageIdLength
- && PackageIdValidator.IsValidPackageIdWithTimeout(query);
+ && PackageIdValidator.IsValidPackageId(query);
}
private static bool IsIdWithSeparator(string query)
diff --git a/src/Stats.CreateAzureCdnWarehouseReports/Stats.CreateAzureCdnWarehouseReports.csproj b/src/Stats.CreateAzureCdnWarehouseReports/Stats.CreateAzureCdnWarehouseReports.csproj
index 3099693e7..018a3144b 100644
--- a/src/Stats.CreateAzureCdnWarehouseReports/Stats.CreateAzureCdnWarehouseReports.csproj
+++ b/src/Stats.CreateAzureCdnWarehouseReports/Stats.CreateAzureCdnWarehouseReports.csproj
@@ -82,7 +82,7 @@
5.8.4
- 5.9.0
+ $(NuGetClientPackageVersion)
0.3.0
diff --git a/src/Stats.ImportAzureCdnStatistics/Stats.ImportAzureCdnStatistics.csproj b/src/Stats.ImportAzureCdnStatistics/Stats.ImportAzureCdnStatistics.csproj
index a0894374c..94b442fa6 100644
--- a/src/Stats.ImportAzureCdnStatistics/Stats.ImportAzureCdnStatistics.csproj
+++ b/src/Stats.ImportAzureCdnStatistics/Stats.ImportAzureCdnStatistics.csproj
@@ -105,7 +105,7 @@
5.8.4
- 5.9.0
+ $(NuGetClientPackageVersion)
0.3.0
diff --git a/src/Stats.LogInterpretation/Stats.LogInterpretation.csproj b/src/Stats.LogInterpretation/Stats.LogInterpretation.csproj
index ecbfd8fde..a9a8b2438 100644
--- a/src/Stats.LogInterpretation/Stats.LogInterpretation.csproj
+++ b/src/Stats.LogInterpretation/Stats.LogInterpretation.csproj
@@ -20,7 +20,7 @@
11.0.2
- 5.9.0
+ $(NuGetClientPackageVersion)
3.1.44
diff --git a/src/Validation.Common.Job/Validation.Common.Job.csproj b/src/Validation.Common.Job/Validation.Common.Job.csproj
index bc2b88a6b..ed452adad 100644
--- a/src/Validation.Common.Job/Validation.Common.Job.csproj
+++ b/src/Validation.Common.Job/Validation.Common.Job.csproj
@@ -34,7 +34,7 @@
2.2.0
- 5.9.0
+ $(NuGetClientPackageVersion)
$(NuGetGalleryPackageVersion)
diff --git a/tests/NuGet.Services.AzureSearch.FunctionalTests/NuGet.Services.AzureSearch.FunctionalTests.csproj b/tests/NuGet.Services.AzureSearch.FunctionalTests/NuGet.Services.AzureSearch.FunctionalTests.csproj
index 82513a3fc..712ac22d1 100644
--- a/tests/NuGet.Services.AzureSearch.FunctionalTests/NuGet.Services.AzureSearch.FunctionalTests.csproj
+++ b/tests/NuGet.Services.AzureSearch.FunctionalTests/NuGet.Services.AzureSearch.FunctionalTests.csproj
@@ -80,7 +80,7 @@
$(ServerCommonPackageVersion)
- 5.9.0
+ $(NuGetClientPackageVersion)
2.4.1
diff --git a/tests/NuGet.Services.AzureSearch.Tests/NuGet.Services.AzureSearch.Tests.csproj b/tests/NuGet.Services.AzureSearch.Tests/NuGet.Services.AzureSearch.Tests.csproj
index fe31d850e..b55fefaa8 100644
--- a/tests/NuGet.Services.AzureSearch.Tests/NuGet.Services.AzureSearch.Tests.csproj
+++ b/tests/NuGet.Services.AzureSearch.Tests/NuGet.Services.AzureSearch.Tests.csproj
@@ -69,7 +69,6 @@
-
diff --git a/tests/NuGet.Services.AzureSearch.Tests/PackageIdValidatorFacts.cs b/tests/NuGet.Services.AzureSearch.Tests/PackageIdValidatorFacts.cs
deleted file mode 100644
index 5eeced260..000000000
--- a/tests/NuGet.Services.AzureSearch.Tests/PackageIdValidatorFacts.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Xunit;
-
-namespace NuGet.Services.AzureSearch
-{
- // TODO: Delete this copy of the PackageIdValidator.
- // Tracked by: https://github.com/NuGet/Engineering/issues/3669
- // Forked from: https://github.com/NuGet/NuGet.Client/blob/18863da5be3dc8c7315f4416df1bc9ef96cb7446/test/NuGet.Core.Tests/NuGet.Packaging.Test/PackageIdValidatorTest.cs#L8
- public class PackageIdValidatorTest
- {
- [Fact]
- public void EmptyIsNotValid()
- {
- // Arrange
- string packageId = "";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void NullThrowsException()
- {
- // Arrange
- string packageId = null;
-
- // Act & Assert
- Assert.Throws(paramName: "packageId",
- testCode: () => PackageIdValidator.IsValidPackageIdWithTimeout(packageId));
- }
-
- [Fact]
- public void AlphaNumericIsValid()
- {
- // Arrange
- string packageId = "42This1Is4You";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.True(isValid);
- }
-
- [Fact]
- public void MultipleDotSeparatorsAllowed()
- {
- // Arrange
- string packageId = "I.Like.Writing.Unit.Tests";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.True(isValid);
- }
-
- [Fact]
- public void NumbersAndWordsDotSeparatedAllowd()
- {
- // Arrange
- string packageId = "1.2.3.4.Uno.Dos.Tres.Cuatro";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.True(isValid);
- }
-
- [Fact]
- public void UnderscoreDotAndDashSeparatorsAreValid()
- {
- // Arrange
- string packageId = "Nu_Get.Core-IsCool";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.True(isValid);
- }
-
- [Fact]
- public void NonAlphaNumericUnderscoreDotDashIsInvalid()
- {
- // Arrange
- string packageId = "ILike*Asterisks";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void ConsecutiveSeparatorsNotAllowed()
- {
- // Arrange
- string packageId = "I_.Like.-Separators";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void StartingWithSeparatorsNotAllowed()
- {
- // Arrange
- string packageId = "-StartWithSeparator";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void EndingWithSeparatorsNotAllowed()
- {
- // Arrange
- string packageId = "StartWithSeparator.";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void DotToolsIsNotAllowed()
- {
- // Arrange
- string packageId = ".tools";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.False(isValid);
- }
-
- [Fact]
- public void IsValidPackageId_PackageIdWithTwoUnderscores_Success()
- {
- // Arrange
- string packageId = "Hello__World";
-
- // Act
- bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);
-
- // Assert
- Assert.True(isValid);
- }
- }
-}
diff --git a/tests/NuGet.Services.AzureSearch.Tests/SearchService/SearchResponseBuilderFacts.cs b/tests/NuGet.Services.AzureSearch.Tests/SearchService/SearchResponseBuilderFacts.cs
index b531521cf..dc209e479 100644
--- a/tests/NuGet.Services.AzureSearch.Tests/SearchService/SearchResponseBuilderFacts.cs
+++ b/tests/NuGet.Services.AzureSearch.Tests/SearchService/SearchResponseBuilderFacts.cs
@@ -682,6 +682,7 @@ public void CoalescesSomeNullFields()
doc.Summary = null;
doc.Tags = null;
doc.Authors = null;
+ doc.Owners = null;
var response = Target.V3FromSearch(
_v3Request,
@@ -695,6 +696,7 @@ public void CoalescesSomeNullFields()
Assert.Equal(string.Empty, result.Summary);
Assert.Empty(result.Tags);
Assert.Equal(string.Empty, Assert.Single(result.Authors));
+ Assert.Empty(result.Owners);
}
[Fact]
@@ -884,6 +886,10 @@ public void ProducesExpectedResponse(bool useNewtonsoftJson)
""authors"": [
""Microsoft""
],
+ ""owners"": [
+ ""Microsoft"",
+ ""azure-sdk""
+ ],
""totalDownloads"": 1001,
""verified"": true,
""packageTypes"": [
@@ -1058,6 +1064,10 @@ public void ProducesExpectedResponse(bool useNewtonsoftJson)
""authors"": [
""Microsoft""
],
+ ""owners"": [
+ ""Microsoft"",
+ ""azure-sdk""
+ ],
""totalDownloads"": 1001,
""verified"": true,
""packageTypes"": [