Skip to content

Commit dc22d35

Browse files
authored
Bugfix for V2 server Tag based search with Prerelease returning extra packages (#1405)
1 parent 8aef3c5 commit dc22d35

File tree

2 files changed

+31
-22
lines changed

2 files changed

+31
-22
lines changed

src/code/V2ServerAPICalls.cs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public V2ServerAPICalls (PSRepositoryInfo repository, PSCmdlet cmdletPassedIn, N
6969
/// </summary>
7070
public override FindResults FindAll(bool includePrerelease, ResourceType type, out ErrorRecord errRecord)
7171
{
72-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindAll()");
72+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindAll()");
7373
errRecord = null;
7474
List<string> responses = new List<string>();
7575

@@ -152,11 +152,11 @@ public override FindResults FindAll(bool includePrerelease, ResourceType type, o
152152
/// Find method which allows for searching for packages with tag from a repository and returns latest version for each.
153153
/// Examples: Search -Tag "JSON" -Repository PSGallery
154154
/// API call:
155-
/// - Include prerelease: http://www.powershellgallery.com/api/v2/Search()?$filter=IsAbsoluteLatestVersion&searchTerm=tag:JSON&includePrerelease=true
155+
/// - Include prerelease: https://www.powershellgallery.com/api/v2/Search()?includePrerelease=true&$filter=IsAbsoluteLatestVersion and substringof('PSModule', Tags) eq true and substringof('CrescendoBuilt', Tags) eq true&$orderby=Id desc&$inlinecount=allpages&$skip=0&$top=6000
156156
/// </summary>
157157
public override FindResults FindTags(string[] tags, bool includePrerelease, ResourceType _type, out ErrorRecord errRecord)
158158
{
159-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindTags()");
159+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindTags()");
160160
errRecord = null;
161161
List<string> responses = new List<string>();
162162

@@ -249,7 +249,7 @@ public override FindResults FindTags(string[] tags, bool includePrerelease, Reso
249249
/// </summary>
250250
public override FindResults FindCommandOrDscResource(string[] tags, bool includePrerelease, bool isSearchingForCommands, out ErrorRecord errRecord)
251251
{
252-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindCommandOrDscResource()");
252+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindCommandOrDscResource()");
253253
List<string> responses = new List<string>();
254254
int skip = 0;
255255

@@ -309,7 +309,7 @@ public override FindResults FindCommandOrDscResource(string[] tags, bool include
309309
/// </summary>
310310
public override FindResults FindName(string packageName, bool includePrerelease, ResourceType type, out ErrorRecord errRecord)
311311
{
312-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindName()");
312+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindName()");
313313
// Make sure to include quotations around the package name
314314
var prerelease = includePrerelease ? "IsAbsoluteLatestVersion" : "IsLatestVersion";
315315

@@ -352,7 +352,7 @@ public override FindResults FindName(string packageName, bool includePrerelease,
352352
/// </summary>
353353
public override FindResults FindNameWithTag(string packageName, string[] tags, bool includePrerelease, ResourceType type, out ErrorRecord errRecord)
354354
{
355-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindNameWithTag()");
355+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindNameWithTag()");
356356
// Make sure to include quotations around the package name
357357
var prerelease = includePrerelease ? "IsAbsoluteLatestVersion" : "IsLatestVersion";
358358

@@ -403,7 +403,7 @@ public override FindResults FindNameWithTag(string packageName, string[] tags, b
403403
/// </summary>
404404
public override FindResults FindNameGlobbing(string packageName, bool includePrerelease, ResourceType type, out ErrorRecord errRecord)
405405
{
406-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindNameGlobbing()");
406+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindNameGlobbing()");
407407
List<string> responses = new List<string>();
408408
int skip = 0;
409409

@@ -456,7 +456,7 @@ public override FindResults FindNameGlobbing(string packageName, bool includePre
456456
/// </summary>
457457
public override FindResults FindNameGlobbingWithTag(string packageName, string[] tags, bool includePrerelease, ResourceType type, out ErrorRecord errRecord)
458458
{
459-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindNameGlobbingWithTag()");
459+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindNameGlobbingWithTag()");
460460
List<string> responses = new List<string>();
461461
int skip = 0;
462462

@@ -511,7 +511,7 @@ public override FindResults FindNameGlobbingWithTag(string packageName, string[]
511511
/// </summary>
512512
public override FindResults FindVersionGlobbing(string packageName, VersionRange versionRange, bool includePrerelease, ResourceType type, bool getOnlyLatest, out ErrorRecord errRecord)
513513
{
514-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindVersionGlobbing()");
514+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindVersionGlobbing()");
515515
List<string> responses = new List<string>();
516516
int skip = 0;
517517

@@ -565,7 +565,7 @@ public override FindResults FindVersionGlobbing(string packageName, VersionRange
565565
/// </summary>
566566
public override FindResults FindVersion(string packageName, string version, ResourceType type, out ErrorRecord errRecord)
567567
{
568-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindVersion()");
568+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindVersion()");
569569
// https://www.powershellgallery.com/api/v2/FindPackagesById()?id='blah'&includePrerelease=false&$filter= NormalizedVersion eq '1.1.0' and substringof('PSModule', Tags) eq true
570570
// Quotations around package name and version do not matter, same metadata gets returned.
571571
// We need to explicitly add 'Id eq <packageName>' whenever $filter is used, otherwise arbitrary results are returned.
@@ -607,7 +607,7 @@ public override FindResults FindVersion(string packageName, string version, Reso
607607
/// </summary>
608608
public override FindResults FindVersionWithTag(string packageName, string version, string[] tags, ResourceType type, out ErrorRecord errRecord)
609609
{
610-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindVersionWithTag()");
610+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindVersionWithTag()");
611611
// We need to explicitly add 'Id eq <packageName>' whenever $filter is used, otherwise arbitrary results are returned.
612612
string idFilterPart = $" and Id eq '{packageName}'";
613613
string typeFilterPart = GetTypeFilterForRequest(type);
@@ -656,7 +656,7 @@ public override FindResults FindVersionWithTag(string packageName, string versio
656656
/// </summary>
657657
public override Stream InstallName(string packageName, bool includePrerelease, out ErrorRecord errRecord)
658658
{
659-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::InstallName()");
659+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::InstallName()");
660660
var requestUrlV2 = $"{Repository.Uri}/package/{packageName}";
661661

662662
var response = HttpRequestCallForContent(requestUrlV2, out errRecord);
@@ -675,7 +675,7 @@ public override Stream InstallName(string packageName, bool includePrerelease, o
675675
/// </summary>
676676
public override Stream InstallVersion(string packageName, string version, out ErrorRecord errRecord)
677677
{
678-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::InstallVersion()");
678+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::InstallVersion()");
679679
var requestUrlV2 = $"{Repository.Uri}/package/{packageName}/{version}";
680680
var response = HttpRequestCallForContent(requestUrlV2, out errRecord);
681681
var responseStream = response.ReadAsStreamAsync().Result;
@@ -688,7 +688,7 @@ public override Stream InstallVersion(string packageName, string version, out Er
688688
/// </summary>
689689
private string HttpRequestCall(string requestUrlV2, out ErrorRecord errRecord)
690690
{
691-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::HttpRequestCall()");
691+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::HttpRequestCall()");
692692
errRecord = null;
693693
string response = string.Empty;
694694

@@ -745,7 +745,7 @@ private string HttpRequestCall(string requestUrlV2, out ErrorRecord errRecord)
745745
/// </summary>
746746
private HttpContent HttpRequestCallForContent(string requestUrlV2, out ErrorRecord errRecord)
747747
{
748-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::HttpRequestCallForContent()");
748+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::HttpRequestCallForContent()");
749749
errRecord = null;
750750
HttpContent content = null;
751751

@@ -798,7 +798,7 @@ private HttpContent HttpRequestCallForContent(string requestUrlV2, out ErrorReco
798798
/// </summary>
799799
private string FindAllFromTypeEndPoint(bool includePrerelease, bool isSearchingModule, int skip, out ErrorRecord errRecord)
800800
{
801-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindAllFromTypeEndPoint()");
801+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindAllFromTypeEndPoint()");
802802
string typeEndpoint = isSearchingModule ? String.Empty : "/items/psscript";
803803
string paginationParam = $"&$orderby=Id desc&$inlinecount=allpages&$skip={skip}&$top=6000";
804804
var prereleaseFilter = includePrerelease ? "IsAbsoluteLatestVersion&includePrerelease=true" : "IsLatestVersion";
@@ -812,7 +812,7 @@ private string FindAllFromTypeEndPoint(bool includePrerelease, bool isSearchingM
812812
/// </summary>
813813
private string FindTagFromEndpoint(string[] tags, bool includePrerelease, bool isSearchingModule, int skip, out ErrorRecord errRecord)
814814
{
815-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindTagFromEndpoint()");
815+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindTagFromEndpoint()");
816816
// scenarios with type + tags:
817817
// type: None -> search both endpoints
818818
// type: M -> just search Module endpoint
@@ -821,7 +821,7 @@ private string FindTagFromEndpoint(string[] tags, bool includePrerelease, bool i
821821
// type: Command -> just search Modules
822822
string typeEndpoint = isSearchingModule ? String.Empty : "/items/psscript";
823823
string paginationParam = $"&$orderby=Id desc&$inlinecount=allpages&$skip={skip}&$top=6000";
824-
var prereleaseFilter = includePrerelease ? "$filter=IsAbsoluteLatestVersion&includePrerelease=true" : "$filter=IsLatestVersion";
824+
var prereleaseFilter = includePrerelease ? "includePrerelease=true&$filter=IsAbsoluteLatestVersion" : "$filter=IsLatestVersion";
825825
string typeFilterPart = isSearchingModule ? $" and substringof('PSModule', Tags) eq true" : $" and substringof('PSScript', Tags) eq true";
826826

827827
string tagFilterPart = String.Empty;
@@ -840,7 +840,7 @@ private string FindTagFromEndpoint(string[] tags, bool includePrerelease, bool i
840840
/// </summary>
841841
private string FindCommandOrDscResource(string[] tags, bool includePrerelease, bool isSearchingForCommands, int skip, out ErrorRecord errRecord)
842842
{
843-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindCommandOrDscResource()");
843+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindCommandOrDscResource()");
844844
// can only find from Modules endpoint
845845
string paginationParam = $"&$orderby=Id desc&$inlinecount=allpages&$skip={skip}&$top=6000";
846846
var prereleaseFilter = includePrerelease ? "$filter=IsAbsoluteLatestVersion&includePrerelease=true" : "$filter=IsLatestVersion";
@@ -867,7 +867,7 @@ private string FindCommandOrDscResource(string[] tags, bool includePrerelease, b
867867
/// </summary>
868868
private string FindNameGlobbing(string packageName, ResourceType type, bool includePrerelease, int skip, out ErrorRecord errRecord)
869869
{
870-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindNameGlobbing()");
870+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindNameGlobbing()");
871871
// https://www.powershellgallery.com/api/v2/Search()?$filter=endswith(Id, 'Get') and startswith(Id, 'PowerShell') and IsLatestVersion (stable)
872872
// https://www.powershellgallery.com/api/v2/Search()?$filter=endswith(Id, 'Get') and IsAbsoluteLatestVersion&includePrerelease=true
873873

@@ -935,7 +935,7 @@ private string FindNameGlobbing(string packageName, ResourceType type, bool incl
935935
/// </summary>
936936
private string FindNameGlobbingWithTag(string packageName, string[] tags, ResourceType type, bool includePrerelease, int skip, out ErrorRecord errRecord)
937937
{
938-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindNameGlobbingWithTag()");
938+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindNameGlobbingWithTag()");
939939
// https://www.powershellgallery.com/api/v2/Search()?$filter=endswith(Id, 'Get') and startswith(Id, 'PowerShell') and IsLatestVersion (stable)
940940
// https://www.powershellgallery.com/api/v2/Search()?$filter=endswith(Id, 'Get') and IsAbsoluteLatestVersion&includePrerelease=true
941941

@@ -1009,7 +1009,7 @@ private string FindNameGlobbingWithTag(string packageName, string[] tags, Resour
10091009
/// </summary>
10101010
private string FindVersionGlobbing(string packageName, VersionRange versionRange, bool includePrerelease, ResourceType type, int skip, bool getOnlyLatest, out ErrorRecord errRecord)
10111011
{
1012-
_cmdletPassedIn.WriteDebug("In NuGetServerAPICalls::FindVersionGlobbing()");
1012+
_cmdletPassedIn.WriteDebug("In V2ServerAPICalls::FindVersionGlobbing()");
10131013
//https://www.powershellgallery.com/api/v2//FindPackagesById()?id='blah'&includePrerelease=false&$filter= NormalizedVersion gt '1.0.0' and NormalizedVersion lt '2.2.5' and substringof('PSModule', Tags) eq true
10141014
//https://www.powershellgallery.com/api/v2//FindPackagesById()?id='PowerShellGet'&includePrerelease=false&$filter= NormalizedVersion gt '1.1.1' and NormalizedVersion lt '2.2.5'
10151015
// NormalizedVersion doesn't include trailing zeroes

test/FindPSResourceTests/FindPSResourceV2Server.Tests.ps1

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,15 @@ Describe 'Test HTTP Find-PSResource for V2 Server Protocol' -tags 'CI' {
340340
# $foundTestScript | Should -Be $True
341341
# }
342342

343+
It "find all resources with specified tag given Tag property, with and without Prerelease property" {
344+
$tagToFind = "MyPSTag"
345+
$res = Find-PSResource -Tag $tagToFind -Repository $PSGalleryName
346+
$res | Should -HaveCount 1
347+
348+
$res = Find-PSResource -Tag $tagToFind -Repository $PSGalleryName -Prerelease
349+
$res | Should -HaveCount 2
350+
}
351+
343352
It "find resource given CommandName" {
344353
$res = Find-PSResource -CommandName $commandName -Repository $PSGalleryName
345354
$res | Should -Not -BeNullOrEmpty

0 commit comments

Comments
 (0)