Skip to content

Commit 4fb660b

Browse files
Enforce namespaced module release decisions
1 parent 59e056c commit 4fb660b

8 files changed

Lines changed: 892 additions & 254 deletions

File tree

.github/actions/Get-PSModuleSettings/src/Get-PSModuleSettings.Helpers.psm1

Lines changed: 101 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ function Resolve-WorkflowEventRouting {
2828
[bool] $IsManualDispatchToDefaultBranch,
2929

3030
[Parameter()]
31-
[bool] $HasImportantChanges,
32-
33-
[Parameter()]
34-
[bool] $HasPrereleaseLabel
31+
[bool] $HasImportantChanges
3532
)
3633

3734
$isPR = $EventName -eq 'pull_request'
@@ -43,7 +40,6 @@ function Resolve-WorkflowEventRouting {
4340
$isClosedPR = $isPR -and $EventAction -eq 'closed'
4441
$isAbandonedPR = $isClosedPR -and -not $PullRequestIsMerged
4542
$isMergedPR = $isClosedPR -and $PullRequestIsMerged
46-
$shouldPrerelease = $isOpenOrLabeledPR -and $HasPrereleaseLabel -and $HasImportantChanges
4743
$shouldRelease = (
4844
($IsPushToDefaultBranch -or $IsManualDispatchToDefaultBranch) -and
4945
$HasImportantChanges
@@ -61,11 +57,8 @@ function Resolve-WorkflowEventRouting {
6157
IsTargetDefaultBranch = $IsTargetDefaultBranch
6258
IsPushToDefaultBranch = $IsPushToDefaultBranch
6359
IsManualDispatchToDefaultBranch = $IsManualDispatchToDefaultBranch
64-
ShouldPrerelease = $shouldPrerelease
6560
ReleaseType = if ($shouldRelease) {
6661
'Release'
67-
} elseif ($shouldPrerelease) {
68-
'Prerelease'
6962
} else {
7063
'None'
7164
}
@@ -149,3 +142,103 @@ function Get-FilesFromGitHubComparison {
149142

150143
$files | Select-Object -ExpandProperty filename
151144
}
145+
146+
function Get-UnsupportedPSModuleReleaseSetting {
147+
<#
148+
.SYNOPSIS
149+
Returns release settings removed from the Process-PSModule v9 contract.
150+
151+
.DESCRIPTION
152+
Inspects a publish-module settings object and returns any setting names that
153+
configured automatic patching or custom release-label aliases before v9.
154+
155+
.OUTPUTS
156+
System.String
157+
158+
.EXAMPLE
159+
Get-UnsupportedPSModuleReleaseSetting -PublishModule $settings.Publish.Module
160+
#>
161+
[CmdletBinding()]
162+
[OutputType([string])]
163+
param(
164+
[Parameter()]
165+
[AllowNull()]
166+
[object] $PublishModule
167+
)
168+
169+
if ($null -eq $PublishModule) {
170+
return
171+
}
172+
173+
$settingNames = if ($PublishModule -is [System.Collections.IDictionary]) {
174+
@($PublishModule.Keys)
175+
} else {
176+
@($PublishModule.PSObject.Properties.Name)
177+
}
178+
$unsupportedSettingNames = @(
179+
'AutoPatching'
180+
'MajorLabels'
181+
'MinorLabels'
182+
'PatchLabels'
183+
'PrereleaseLabels'
184+
'IgnoreLabels'
185+
)
186+
187+
foreach ($settingName in $unsupportedSettingNames) {
188+
if ($settingNames -contains $settingName) {
189+
$settingName
190+
}
191+
}
192+
}
193+
194+
function Resolve-PSModulePublishState {
195+
<#
196+
.SYNOPSIS
197+
Applies the resolved release decision to module and site publication state.
198+
199+
.DESCRIPTION
200+
Updates the runtime settings after Resolve-PSModuleVersion has decided
201+
whether this run publishes a stable release, prerelease, or nothing.
202+
Closed pull requests retain their cleanup-only path.
203+
204+
.OUTPUTS
205+
System.Management.Automation.PSCustomObject
206+
207+
.EXAMPLE
208+
$params = @{
209+
Settings = $settings
210+
ReleaseType = 'None'
211+
ShouldPublish = $false
212+
}
213+
Resolve-PSModulePublishState @params
214+
#>
215+
[CmdletBinding()]
216+
[OutputType([PSCustomObject])]
217+
param(
218+
[Parameter(Mandatory)]
219+
[PSCustomObject] $Settings,
220+
221+
[Parameter(Mandatory)]
222+
[ValidateSet('Release', 'Prerelease', 'None')]
223+
[string] $ReleaseType,
224+
225+
[Parameter(Mandatory)]
226+
[bool] $ShouldPublish
227+
)
228+
229+
$isCleanupOnly = (
230+
$Settings.Context.EventName -eq 'pull_request' -and
231+
$Settings.Context.EventAction -eq 'closed'
232+
)
233+
$cleanupEnabled = $isCleanupOnly -and [bool]$Settings.Publish.Module.AutoCleanup
234+
$moduleEnabled = $ShouldPublish -or $cleanupEnabled
235+
$siteDesired = $ReleaseType -eq 'Release'
236+
237+
$Settings.Publish.Module.ReleaseType = $ReleaseType
238+
$Settings.Publish.Module.Desired = $moduleEnabled
239+
$Settings.Publish.Module.Enabled = $moduleEnabled
240+
$Settings.Publish.Site.Desired = $siteDesired
241+
$Settings.Publish.Site.Enabled = $siteDesired -and -not [bool]$Settings.Publish.Site.Skip
242+
243+
$Settings
244+
}

.github/actions/Get-PSModuleSettings/src/Settings.schema.json

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,6 @@
138138
"type": "boolean",
139139
"description": "When enabled (default: true), automatically cleans up old prerelease tags when merging to main or when a PR is abandoned"
140140
},
141-
"AutoPatching": {
142-
"type": "boolean",
143-
"description": "Automatically apply patches"
144-
},
145141
"IncrementalPrerelease": {
146142
"type": "boolean",
147143
"description": "Use incremental prerelease versioning"
@@ -154,26 +150,6 @@
154150
"type": "string",
155151
"description": "Prefix for version tags"
156152
},
157-
"MajorLabels": {
158-
"type": "string",
159-
"description": "Comma-separated labels that trigger major version bump"
160-
},
161-
"MinorLabels": {
162-
"type": "string",
163-
"description": "Comma-separated labels that trigger minor version bump"
164-
},
165-
"PatchLabels": {
166-
"type": "string",
167-
"description": "Comma-separated labels that trigger patch version bump"
168-
},
169-
"IgnoreLabels": {
170-
"type": "string",
171-
"description": "Comma-separated labels that prevent release"
172-
},
173-
"PrereleaseLabels": {
174-
"type": "string",
175-
"description": "Comma-separated labels that trigger a prerelease"
176-
},
177153
"UsePRTitleAsReleaseName": {
178154
"type": "boolean",
179155
"description": "Use pull request title as the GitHub release name"

.github/actions/Get-PSModuleSettings/src/main.ps1

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,17 @@ if (![string]::IsNullOrEmpty($settingsPath) -and (Test-Path -Path $settingsPath)
7373
$settings = @{}
7474
}
7575

76+
$unsupportedReleaseSettings = @(
77+
Get-UnsupportedPSModuleReleaseSetting -PublishModule $settings.Publish.Module
78+
)
79+
if ($unsupportedReleaseSettings.Count -gt 0) {
80+
throw (
81+
"Unsupported Process-PSModule v9 release settings: [$($unsupportedReleaseSettings -join ', ')]. " +
82+
'Remove these settings. Release decisions now use only release:patch, release:minor, ' +
83+
'release:major, release:pre-release, and release:skip.'
84+
)
85+
}
86+
7687
LogGroup 'Name' {
7788
[pscustomobject]@{
7889
InputName = $name
@@ -190,15 +201,9 @@ $settings = [pscustomobject]@{
190201
Module = [pscustomobject]@{
191202
Skip = $settings.Publish.Module.Skip ?? $false
192203
AutoCleanup = $settings.Publish.Module.AutoCleanup ?? $true
193-
AutoPatching = $settings.Publish.Module.AutoPatching ?? $true
194204
IncrementalPrerelease = $settings.Publish.Module.IncrementalPrerelease ?? $true
195205
DatePrereleaseFormat = $settings.Publish.Module.DatePrereleaseFormat ?? ''
196206
VersionPrefix = $settings.Publish.Module.VersionPrefix ?? 'v'
197-
MajorLabels = $settings.Publish.Module.MajorLabels ?? 'major, breaking'
198-
MinorLabels = $settings.Publish.Module.MinorLabels ?? 'minor, feature'
199-
PatchLabels = $settings.Publish.Module.PatchLabels ?? 'patch, fix'
200-
IgnoreLabels = $settings.Publish.Module.IgnoreLabels ?? 'NoRelease'
201-
PrereleaseLabels = $settings.Publish.Module.PrereleaseLabels ?? 'prerelease'
202207
UsePRTitleAsReleaseName = $settings.Publish.Module.UsePRTitleAsReleaseName ?? $false
203208
UsePRBodyAsReleaseNotes = $settings.Publish.Module.UsePRBodyAsReleaseNotes ?? $true
204209
UsePRTitleAsNotesHeading = $settings.Publish.Module.UsePRTitleAsNotesHeading ?? $true
@@ -319,11 +324,6 @@ LogGroup 'Calculate Job Run Conditions:' {
319324
AssociatedPullRequest = $pullRequestContext.Number
320325
} | Format-List | Out-String
321326

322-
# Check if a prerelease label exists on the PR
323-
$prereleaseLabels = $settings.Publish.Module.PrereleaseLabels -split ',' | ForEach-Object { $_.Trim() }
324-
$prLabels = @($pullRequestContext.Labels)
325-
$hasPrereleaseLabel = ($prLabels | Where-Object { $prereleaseLabels -contains $_ }).Count -gt 0
326-
327327
# Check if important files have changed in the PR
328328
# Important files are determined by the configured ImportantFilePatterns setting
329329
$hasImportantChanges = $false
@@ -449,8 +449,7 @@ If you believe this is incorrect, please verify that your changes are in the cor
449449
-IsTargetDefaultBranch $isTargetDefaultBranch `
450450
-IsPushToDefaultBranch $isPushToDefaultBranch `
451451
-IsManualDispatchToDefaultBranch $isManualDispatchToDefaultBranch `
452-
-HasImportantChanges $hasImportantChanges `
453-
-HasPrereleaseLabel $hasPrereleaseLabel
452+
-HasImportantChanges $hasImportantChanges
454453
$releaseType = $routing.ReleaseType
455454

456455
[pscustomobject]@{
@@ -464,8 +463,6 @@ If you believe this is incorrect, please verify that your changes are in the cor
464463
isManualDispatch = $routing.IsManualDispatch
465464
isPushToDefaultBranch = $routing.IsPushToDefaultBranch
466465
isTargetDefaultBranch = $routing.IsTargetDefaultBranch
467-
hasPrereleaseLabel = $hasPrereleaseLabel
468-
shouldPrerelease = $routing.ShouldPrerelease
469466
ReleaseType = $releaseType
470467
HasImportantChanges = $hasImportantChanges
471468
} | Format-List | Out-String

0 commit comments

Comments
 (0)