lib/rules/releases/release_should_be_published/release_should_be_published.ps1
|
############################################################################# # Rule: release_should_be_published # Category: releases # Priority: 11 ############################################################################# # Load shared release helpers . "$PSScriptRoot/../ReleaseRulesHelper.ps1" $Rule_ReleaseShouldBePublished = [ValidationRule]@{ Name = "release_should_be_published" Description = "Draft releases for patch versions should be published when check-releases or check-release-immutability is enabled" Priority = 11 Category = "releases" Condition = { param([RepositoryState]$State, [hashtable]$Config) # Apply when either check-releases OR check-release-immutability is enabled # When check-releases is enabled, draft releases should be published to complete the release # When check-release-immutability is enabled, draft releases should be published to become immutable $checkReleases = $Config.'check-releases' $checkImmutability = $Config.'check-release-immutability' $releasesEnabled = ($checkReleases -eq 'error' -or $checkReleases -eq 'warning') $immutabilityEnabled = ($checkImmutability -eq 'error' -or $checkImmutability -eq 'warning') if (-not $releasesEnabled -and -not $immutabilityEnabled) { return @() } # Find all draft releases for patch versions $draftReleases = $State.Releases | Where-Object { $_.IsDraft -and -not $_.IsIgnored } # Filter to only patch versions $patchDraftReleases = $draftReleases | Where-Object { # Parse version to check if it's a patch (vX.Y.Z) $tagName = $_.TagName if ($tagName -match '^v(\d+)\.(\d+)\.(\d+)') { return $true } return $false } # Exclude draft releases that are duplicates and will be deleted by duplicate_release rule $duplicateDrafts = Get-DuplicateDraftRelease -State $State $duplicateReleaseIds = $duplicateDrafts.Id # Filter out duplicates that will be deleted $patchDraftReleases = $patchDraftReleases | Where-Object { $_.Id -notin $duplicateReleaseIds } return $patchDraftReleases } Check = { param([ReleaseInfo]$ReleaseInfo, [RepositoryState]$State, [hashtable]$Config) # If we got here from Condition, it's a draft that should be published return $false } CreateIssue = { param([ReleaseInfo]$ReleaseInfo, [RepositoryState]$State, [hashtable]$Config) $version = $ReleaseInfo.TagName # Determine severity based on which check is enabled (most severe wins) $checkReleases = $Config.'check-releases' $checkImmutability = $Config.'check-release-immutability' # Most severe level wins: error > warning $severity = 'warning' if ($checkImmutability -eq 'error' -or $checkReleases -eq 'error') { $severity = 'error' } $issue = [ValidationIssue]::new( "draft_release", $severity, "Release $version is still in draft status and should be published" ) $issue.Version = $version # PublishReleaseAction constructor: tagName, releaseId $action = [PublishReleaseAction]::new($version, $ReleaseInfo.Id) # Determine if this release should become "latest" when published # Only set MakeLatest=false explicitly if it should NOT be latest # to prevent overwriting a correct latest release $shouldBeLatest = Test-ShouldBeLatestRelease -State $State -Version $version -ReleaseInfo $ReleaseInfo if (-not $shouldBeLatest) { $action.MakeLatest = $false } $issue.RemediationAction = $action return $issue } } # Export the rule $Rule_ReleaseShouldBePublished |