From d36473e2b3d60547dbae20d100849fb3d825d145 Mon Sep 17 00:00:00 2001 From: alerickson <25858831+alerickson@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:02:51 -0700 Subject: [PATCH 1/3] Allow prerelease versions to update to higher prerelease versions --- src/code/UpdatePSResource.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/code/UpdatePSResource.cs b/src/code/UpdatePSResource.cs index f3d329936..da0942522 100644 --- a/src/code/UpdatePSResource.cs +++ b/src/code/UpdatePSResource.cs @@ -185,7 +185,7 @@ protected override void ProcessRecord() return; } - var namesToUpdate = ProcessPackageNames(Name, versionRange, nugetVersion, versionType); + var namesToUpdate = ProcessPackageNames(Name, versionRange, nugetVersion, versionType, out bool latestInstalledIsPrerelease); if (namesToUpdate.Length == 0) { @@ -204,7 +204,7 @@ protected override void ProcessRecord() nugetVersion: nugetVersion, versionType: versionType, versionString: Version, - prerelease: Prerelease, + prerelease: latestInstalledIsPrerelease, repository: Repository, acceptLicense: AcceptLicense, quiet: Quiet, @@ -259,8 +259,11 @@ private string[] ProcessPackageNames( string[] namesToProcess, VersionRange versionRange, NuGetVersion nuGetVersion, - VersionType versionType) + VersionType versionType, + out bool latestInstalledIsPrerelease) { + latestInstalledIsPrerelease = false; + namesToProcess = Utils.ProcessNameWildcards( pkgNames: namesToProcess, removeWildcardEntries:false, @@ -318,6 +321,12 @@ private string[] ProcessPackageNames( return Utils.EmptyStrArray; } + // if the latest installed version is a prerelease version, automatically include prerelease versions when updating. + if (!string.IsNullOrWhiteSpace(installedPackages.First().Value.Prerelease)) + { + latestInstalledIsPrerelease = true; + } + // Find all packages selected for updating in provided repositories. var repositoryPackages = new Dictionary(StringComparer.InvariantCultureIgnoreCase); foreach (var foundResource in _findHelper.FindByResourceName( @@ -327,7 +336,7 @@ private string[] ProcessPackageNames( nugetVersion: nuGetVersion, versionType: versionType, version: Version, - prerelease: Prerelease, + prerelease: latestInstalledIsPrerelease, tag: null, repository: Repository, includeDependencies: !SkipDependencyCheck)) From ff1b71321528d8f438255148c06b29735646c683 Mon Sep 17 00:00:00 2001 From: alerickson <25858831+alerickson@users.noreply.github.com> Date: Mon, 10 Jul 2023 23:26:15 -0700 Subject: [PATCH 2/3] add test --- src/code/InstallHelper.cs | 2 +- .../UpdatePSResourceV2Tests.ps1 | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/code/InstallHelper.cs b/src/code/InstallHelper.cs index f2dfbeb73..8ede5fd39 100644 --- a/src/code/InstallHelper.cs +++ b/src/code/InstallHelper.cs @@ -626,7 +626,7 @@ private Hashtable InstallPackage( break; } - PSResourceResult currentResult = currentResponseUtil.ConvertToPSResourceResult(responseResults: responses).First(); + PSResourceResult currentResult = currentResponseUtil.ConvertToPSResourceResult(responseResults: responses).FirstOrDefault(); if (currentResult.exception != null && !currentResult.exception.Message.Equals(string.Empty)) { diff --git a/test/UpdatePSResourceTests/UpdatePSResourceV2Tests.ps1 b/test/UpdatePSResourceTests/UpdatePSResourceV2Tests.ps1 index 9f4919019..4bc2683f4 100644 --- a/test/UpdatePSResourceTests/UpdatePSResourceV2Tests.ps1 +++ b/test/UpdatePSResourceTests/UpdatePSResourceV2Tests.ps1 @@ -172,6 +172,24 @@ Describe 'Test HTTP Update-PSResource for V2 Server Protocol' -tags 'CI' { $isPkgUpdated | Should -Be $true } + It "Update prerelease version to a higher prerelease version not using -Prerelease parameter" { + Install-PSResource -Name $testModuleName3 -Version "0.0.99-beta1" -Repository $PSGalleryName -TrustRepository + Update-PSResource -Name $testModuleName3 -Repository $PSGalleryName -TrustRepository + $res = Get-InstalledPSResource -Name $testModuleName3 + $res | Should -Not -BeNullOrEmpty + $isPkgUpdated = $false + foreach ($pkg in $res) + { + if ([System.Version]$pkg.Version -ge [System.Version]"1.0.0") + { + $pkg.Prerelease | Should -Be "beta2" + $isPkgUpdated = $true + } + } + + $isPkgUpdated | Should -Be $true + } + # Windows only It "update resource under CurrentUser scope" -skip:(!($IsWindows -and (Test-IsAdmin))) { # TODO: perhaps also install TestModule with the highest version (the one above 1.2.0.0) to the AllUsers path too From 10539534daea2f57fda84a7d4c741089ece3f514 Mon Sep 17 00:00:00 2001 From: alerickson <25858831+alerickson@users.noreply.github.com> Date: Tue, 11 Jul 2023 13:39:31 -0700 Subject: [PATCH 3/3] Change 'Prerelease' check to 'IsPrerelease' Check --- src/code/UpdatePSResource.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/UpdatePSResource.cs b/src/code/UpdatePSResource.cs index da0942522..f699f101e 100644 --- a/src/code/UpdatePSResource.cs +++ b/src/code/UpdatePSResource.cs @@ -322,7 +322,7 @@ private string[] ProcessPackageNames( } // if the latest installed version is a prerelease version, automatically include prerelease versions when updating. - if (!string.IsNullOrWhiteSpace(installedPackages.First().Value.Prerelease)) + if (installedPackages.First().Value.IsPrerelease) { latestInstalledIsPrerelease = true; }