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/src/code/UpdatePSResource.cs b/src/code/UpdatePSResource.cs index f3d329936..f699f101e 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 (installedPackages.First().Value.IsPrerelease) + { + 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)) 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