Skip to content

Commit d52d450

Browse files
Accept an empty or missing releases list when resolving the module version
A repository with no GitHub releases returned $null from the releases lookup, and the Mandatory [array] parameters rejected both $null and an empty collection before any logic could run. The releases list is now optional throughout the action and normalised to an array at the source, so a brand-new repository resolves to a 0.0.0 baseline. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent b11b310 commit d52d450

2 files changed

Lines changed: 60 additions & 22 deletions

File tree

.github/actions/Resolve-PSModuleVersion/src/Resolve-PSModuleVersion.Helpers.psm1

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,12 @@ function Get-GitHubRelease {
282282
.SYNOPSIS
283283
Retrieves all releases from the current GitHub repository.
284284
285+
.DESCRIPTION
286+
Lists the releases of the current repository. A repository that has no releases yet
287+
returns an empty array rather than $null, so callers can treat the result uniformly.
288+
285289
.OUTPUTS
286-
Array of release objects.
290+
Array of release objects. Empty when the repository has no releases.
287291
288292
.EXAMPLE
289293
$releases = Get-GitHubRelease
@@ -298,14 +302,16 @@ function Get-GitHubRelease {
298302
Write-Error 'Failed to list releases for the repo.'
299303
exit $LASTEXITCODE
300304
}
301-
$releases = $releasesJson | ConvertFrom-Json
305+
$releases = @($releasesJson | ConvertFrom-Json)
302306

303307
Write-Host '-------------------------------------------------'
308+
Write-Host "Found [$($releases.Count)] releases."
304309
Write-Host ($releases | Select-Object -Property name, isPrerelease, isLatest, publishedAt |
305310
Format-Table | Out-String)
306311
Write-Host '-------------------------------------------------'
307312

308-
$releases
313+
# -NoEnumerate keeps an empty or single-element result an array through the pipeline.
314+
Write-Output -NoEnumerate $releases
309315
}
310316
}
311317

@@ -314,6 +320,11 @@ function Get-LatestGitHubVersion {
314320
.SYNOPSIS
315321
Extracts the latest stable version from a GitHub releases list.
316322
323+
.DESCRIPTION
324+
Returns the version of the release marked as latest. A repository that has no releases
325+
yet - or that has releases but none marked as latest - resolves to '0.0.0' so a brand-new
326+
module can still be versioned before its first release exists.
327+
317328
.OUTPUTS
318329
PSSemVer representing the latest GitHub release version.
319330
@@ -325,9 +336,11 @@ function Get-LatestGitHubVersion {
325336
[CmdletBinding()]
326337
[OutputType([object])]
327338
param(
328-
# The GitHub releases array to search.
329-
[Parameter(Mandatory)]
330-
[array] $Releases
339+
# The GitHub releases array to search. Empty or null when the repository has no releases.
340+
[Parameter()]
341+
[AllowNull()]
342+
[AllowEmptyCollection()]
343+
[array] $Releases = @()
331344
)
332345

333346
LogGroup 'Get latest version - GitHub' {
@@ -409,6 +422,11 @@ function Get-LatestPublishedVersion {
409422
.SYNOPSIS
410423
Returns the highest version between GitHub and the PowerShell Gallery.
411424
425+
.DESCRIPTION
426+
Compares the two known published versions and returns the highest one. A missing
427+
(null) version is treated as '0.0.0', so a module that has never been released to
428+
GitHub or published to the PowerShell Gallery resolves to a '0.0.0' baseline.
429+
412430
.OUTPUTS
413431
PSSemVer representing the highest known published version.
414432
@@ -420,19 +438,27 @@ function Get-LatestPublishedVersion {
420438
[CmdletBinding()]
421439
[OutputType([object])]
422440
param(
423-
# The latest version found in GitHub releases.
424-
[Parameter(Mandatory)]
441+
# The latest version found in GitHub releases. Null when the repository has no releases.
442+
[Parameter()]
443+
[AllowNull()]
425444
[object] $GitHubVersion,
426445

427-
# The latest version found in the PowerShell Gallery.
428-
[Parameter(Mandatory)]
446+
# The latest version found in the PowerShell Gallery. Null when the module is unpublished.
447+
[Parameter()]
448+
[AllowNull()]
429449
[object] $PSGalleryVersion
430450
)
431451

432452
LogGroup 'Latest version' {
433-
$latestVersion = New-PSSemVer -Version (
434-
$PSGalleryVersion, $GitHubVersion | Sort-Object -Descending | Select-Object -First 1
435-
)
453+
$candidates = @($PSGalleryVersion, $GitHubVersion) |
454+
Where-Object { $null -ne $_ -and -not [string]::IsNullOrWhiteSpace([string]$_) }
455+
456+
$latestVersion = if ($candidates.Count -gt 0) {
457+
New-PSSemVer -Version ($candidates | Sort-Object -Descending | Select-Object -First 1)
458+
} else {
459+
Write-Warning "No published version found in GitHub or the PowerShell Gallery. Using '0.0.0'."
460+
New-PSSemVer -Version '0.0.0'
461+
}
436462
Write-Host "Latest version: [$($latestVersion.ToString())]"
437463
$latestVersion
438464
}
@@ -472,9 +498,11 @@ function Get-NextPrereleaseNumber {
472498
[ValidateNotNullOrEmpty()]
473499
[string] $PrereleaseName,
474500

475-
# The GitHub releases list.
476-
[Parameter(Mandatory)]
477-
[array] $Releases
501+
# The GitHub releases list. Empty or null when the repository has no releases.
502+
[Parameter()]
503+
[AllowNull()]
504+
[AllowEmptyCollection()]
505+
[array] $Releases = @()
478506
)
479507

480508
$params = @{
@@ -532,8 +560,9 @@ function Get-NextModuleVersion {
532560
[CmdletBinding()]
533561
[OutputType([object])]
534562
param(
535-
# The current latest published version.
536-
[Parameter(Mandatory)]
563+
# The current latest published version. Null resolves to a '0.0.0' baseline.
564+
[Parameter()]
565+
[AllowNull()]
537566
[object] $LatestVersion,
538567

539568
# The release decision object.
@@ -550,12 +579,21 @@ function Get-NextModuleVersion {
550579
[string] $ModuleName,
551580

552581
# The GitHub releases list, used for incremental prerelease calculation.
553-
[Parameter(Mandatory)]
554-
[array] $Releases
582+
# Empty or null when the repository has no releases.
583+
[Parameter()]
584+
[AllowNull()]
585+
[AllowEmptyCollection()]
586+
[array] $Releases = @()
555587
)
556588

557589
LogGroup 'Calculate new version' {
558-
$newVersion = New-PSSemVer -Version $LatestVersion
590+
$baseVersion = if ($null -eq $LatestVersion -or [string]::IsNullOrWhiteSpace([string]$LatestVersion)) {
591+
Write-Warning "No latest version was resolved. Using '0.0.0' as the baseline."
592+
'0.0.0'
593+
} else {
594+
$LatestVersion
595+
}
596+
$newVersion = New-PSSemVer -Version $baseVersion
559597
$newVersion.Prefix = $Configuration.VersionPrefix
560598

561599
if ($Decision.MajorRelease) {

.github/actions/Resolve-PSModuleVersion/src/main.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ $decision = if ($null -eq $pullRequest) {
2828
Resolve-ReleaseDecision -Configuration $config -PullRequest $pullRequest
2929
}
3030

31-
$releases = Get-GitHubRelease
31+
$releases = @(Get-GitHubRelease)
3232
$ghVersion = Get-LatestGitHubVersion -Releases $releases
3333
$psGalleryVersion = Get-LatestPSGalleryVersion -ModuleName $actionInput.Name
3434
$latestVersion = Get-LatestPublishedVersion -GitHubVersion $ghVersion -PSGalleryVersion $psGalleryVersion

0 commit comments

Comments
 (0)