Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/code/InstallHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
Expand Down
17 changes: 13 additions & 4 deletions src/code/UpdatePSResource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -204,7 +204,7 @@ protected override void ProcessRecord()
nugetVersion: nugetVersion,
versionType: versionType,
versionString: Version,
prerelease: Prerelease,
prerelease: latestInstalledIsPrerelease,
repository: Repository,
acceptLicense: AcceptLicense,
quiet: Quiet,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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<string, PSResourceInfo>(StringComparer.InvariantCultureIgnoreCase);
foreach (var foundResource in _findHelper.FindByResourceName(
Expand All @@ -327,7 +336,7 @@ private string[] ProcessPackageNames(
nugetVersion: nuGetVersion,
versionType: versionType,
version: Version,
prerelease: Prerelease,
prerelease: latestInstalledIsPrerelease,
tag: null,
repository: Repository,
includeDependencies: !SkipDependencyCheck))
Expand Down
18 changes: 18 additions & 0 deletions test/UpdatePSResourceTests/UpdatePSResourceV2Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down