From a862b8086da97ac20028a09a3b210857404330b2 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Fri, 10 Jul 2026 22:49:35 +0200 Subject: [PATCH 1/2] Always evaluate version-bump labels regardless of ReleaseType The major/minor/patch label evaluation was gated behind ShouldPublish, so on a pull_request event (ReleaseType None) the resolver ignored the labels and always previewed a patch prerelease. Now the bump labels are always evaluated, so the resolved version reflects what WOULD be created; ReleaseType (and the prerelease label that drives it) only controls whether and how we publish. Adds ReleaseDecision + EndToEnd tests for None + minor/major previews. All existing cases are unchanged (152/152 pass). --- scripts/Resolve-PSModuleVersion.Helpers.psm1 | 43 ++++++++-------- ...ve-PSModuleVersion.Helpers.Tests.Data.psd1 | 49 +++++++++++++++++++ 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/scripts/Resolve-PSModuleVersion.Helpers.psm1 b/scripts/Resolve-PSModuleVersion.Helpers.psm1 index 5a70e97..25a3121 100644 --- a/scripts/Resolve-PSModuleVersion.Helpers.psm1 +++ b/scripts/Resolve-PSModuleVersion.Helpers.psm1 @@ -222,30 +222,29 @@ function Resolve-ReleaseDecision { $shouldPublish = $false } - # Defaults: always produce a prerelease patch version. - $majorRelease = $false - $minorRelease = $false - $patchRelease = $true - $hasVersionBump = $true - if (-not $shouldPublish) { - $createPrerelease = $true + # Always evaluate the version-bump labels so the resolved version reflects what WOULD be + # created, regardless of whether this run publishes. ReleaseType (and the prerelease label + # that drives it) only controls whether and how we publish - never the version increment. + $majorRelease = ($labels | Where-Object { $Configuration.MajorLabels -contains $_ }).Count -gt 0 + $minorRelease = ($labels | Where-Object { $Configuration.MinorLabels -contains $_ }).Count -gt 0 -and -not $majorRelease + $patchRelease = ( + (($labels | Where-Object { $Configuration.PatchLabels -contains $_ }).Count -gt 0) -or $Configuration.AutoPatching + ) -and -not $majorRelease -and -not $minorRelease + + $hasVersionBump = $majorRelease -or $minorRelease -or $patchRelease + if (-not $hasVersionBump) { + # No explicit bump label and no AutoPatching: still resolve a patch version so the run + # can preview what it would create, but do not publish a full release for an unlabeled change. + Write-Host 'No version bump label and AutoPatching disabled; previewing a patch version without publishing.' + $patchRelease = $true + $hasVersionBump = $true + $shouldPublish = $false } - if ($shouldPublish) { - $majorRelease = ($labels | Where-Object { $Configuration.MajorLabels -contains $_ }).Count -gt 0 - $minorRelease = ($labels | Where-Object { $Configuration.MinorLabels -contains $_ }).Count -gt 0 -and -not $majorRelease - $patchRelease = ( - (($labels | Where-Object { $Configuration.PatchLabels -contains $_ }).Count -gt 0) -or $Configuration.AutoPatching - ) -and -not $majorRelease -and -not $minorRelease - - $hasVersionBump = $majorRelease -or $minorRelease -or $patchRelease - if (-not $hasVersionBump) { - Write-Host 'No version bump label found and AutoPatching is disabled. No release will be created.' - $shouldPublish = $false - $createPrerelease = $true - $patchRelease = $true - $hasVersionBump = $true - } + # Anything that is not a published full release is surfaced as a prerelease - either a + # published prerelease (ShouldPublish) or a non-published preview. + if (-not $shouldPublish) { + $createPrerelease = $true } Write-Host '-------------------------------------------------' diff --git a/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 b/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 index 0e1e2d5..464dedf 100644 --- a/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 +++ b/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 @@ -102,6 +102,40 @@ PrereleaseName = 'feattestnone' } } + @{ + Name = 'ReleaseType None with a minor label previews a minor bump' + ReleaseType = 'None' + AutoPatching = $false + HeadRef = 'feat/none-minor' + Labels = @('minor') + Expected = @{ + ShouldPublish = $false + CreateRelease = $false + CreatePrerelease = $true + MajorRelease = $false + MinorRelease = $true + PatchRelease = $false + HasVersionBump = $true + PrereleaseName = 'featnoneminor' + } + } + @{ + Name = 'ReleaseType None with a major label previews a major bump' + ReleaseType = 'None' + AutoPatching = $false + HeadRef = 'feat/none-major' + Labels = @('major') + Expected = @{ + ShouldPublish = $false + CreateRelease = $false + CreatePrerelease = $true + MajorRelease = $true + MinorRelease = $false + PatchRelease = $false + HasVersionBump = $true + PrereleaseName = 'featnonemajor' + } + } @{ Name = 'ReleaseType Prerelease with minor label' ReleaseType = 'Prerelease' @@ -412,6 +446,21 @@ ExpectedPrerelease = 'feattestnone001' ExpectedFullVersion = 'v1.0.2-feattestnone001' } + @{ + Name = 'ReleaseType None with a minor label previews a minor prerelease' + LatestVersion = '1.0.1' + ReleaseType = 'None' + AutoPatching = $false + IncrementalPrerelease = $false + VersionPrefix = 'v' + HeadRef = 'feat/none-minor' + Labels = @('minor') + ExpectedShouldPublish = $false + ExpectedReleaseType = 'None' + ExpectedVersion = '1.1.0' + ExpectedPrerelease = 'featnoneminor001' + ExpectedFullVersion = 'v1.1.0-featnoneminor001' + } @{ Name = 'Prerelease type with incremental counter' LatestVersion = '1.0.1' From 421a170a6f41b825402dd966171f4321d2dd3ac7 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Fri, 10 Jul 2026 23:22:13 +0200 Subject: [PATCH 2/2] test: add None + major EndToEnd case to match PR description Copilot review noted the description claims a None+major EndToEnd/NextModuleVersion case but only None+minor was present. Adds the missing major preview case (1.0.1 -> v2.0.0-featnonemajor001, ShouldPublish=false) so the new label-always-evaluated behavior is covered end-to-end for major bumps too. --- ...esolve-PSModuleVersion.Helpers.Tests.Data.psd1 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 b/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 index 464dedf..c08c11e 100644 --- a/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 +++ b/tests/Resolve-PSModuleVersion.Helpers.Tests.Data.psd1 @@ -461,6 +461,21 @@ ExpectedPrerelease = 'featnoneminor001' ExpectedFullVersion = 'v1.1.0-featnoneminor001' } + @{ + Name = 'ReleaseType None with a major label previews a major prerelease' + LatestVersion = '1.0.1' + ReleaseType = 'None' + AutoPatching = $false + IncrementalPrerelease = $false + VersionPrefix = 'v' + HeadRef = 'feat/none-major' + Labels = @('major') + ExpectedShouldPublish = $false + ExpectedReleaseType = 'None' + ExpectedVersion = '2.0.0' + ExpectedPrerelease = 'featnonemajor001' + ExpectedFullVersion = 'v2.0.0-featnonemajor001' + } @{ Name = 'Prerelease type with incremental counter' LatestVersion = '1.0.1'