Tasks/SetReleaseState.ps1

<#
    .SYNOPSIS
    Determines whether the current module version should be released.

    .DESCRIPTION
    Reads the module manifest version and checks for an existing git tag. In CI,
    an existing version tag makes the release pipeline a clean no-op. Outside
    CI, an existing tag is treated as an error.
#>

if ($script:_loadedPlumberReleaseSetReleaseState) { return }
$script:_loadedPlumberReleaseSetReleaseState = $true

Add-BuildTask -Name SetReleaseState -Jobs {
    $config = $script:PlumberReleaseConfig
    $manifest = Test-ModuleManifest -Path $config.ModuleManifest
    $version = $manifest.Version.ToString()
    $tagName = "v$version"

    $existingLocalTag = git tag --list $tagName
    $existingRemoteTag = git ls-remote --tags $config.GitRemote "refs/tags/$tagName"

    $script:PlumberReleaseState = [pscustomobject]@{
        Version       = $version
        TagName       = $tagName
        ShouldRelease = -not ($existingLocalTag -or $existingRemoteTag)
    }

    if ($script:PlumberReleaseState.ShouldRelease) {
        Write-Build White "Release tag available: $tagName"
        return
    }

    if ($env:CI -eq 'true') {
        Write-Build Yellow "Release tag already exists: $tagName. Skipping release."
        return
    }

    Write-Error "Git tag already exists: $tagName"
}