Private/Resolve-ForgeConfiguration.ps1
|
function Resolve-ForgeConfiguration { <# .SYNOPSIS Enriches a Forge configuration object with GitHub release versions and source package information. .DESCRIPTION Takes a configuration object from Read-ForgeConfiguration, fetches all releases from the specified GitHub repository, expands them by all flavors, and queries package information for each source. Adds a 'versions' property containing all expanded releases to the configuration object. For each source, adds published and missing version information, as well as API key and publishing status details. Returns the enriched configuration object. .PARAMETER Configuration The configuration object returned by Read-ForgeConfiguration. This object is enriched with a 'versions' property and updated 'sources' information. .EXAMPLE $config = Read-ForgeConfiguration -Path 'Samples/firebird.forge.yaml' $resolved = Resolve-ForgeConfiguration -Configuration $config Enriches the configuration with release and source package information. .OUTPUTS PSCustomObject The enriched configuration object, including expanded releases and source publishing information. #> [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [object]$Configuration ) Write-VerboseMark -Message 'Starting Resolve-ForgeConfiguration.' # Parse GitHub repo owner/name from releases.source $sourceUrl = $Configuration.releases.source if ($sourceUrl -notmatch '^https://github.com/(?<owner>[^/]+)/(?<repo>[^/]+)') { throw 'Invalid GitHub repository URL in releases.source.' } $repoOwner = $Matches['owner'] $repoName = $Matches['repo'] Write-VerboseMark -Message "Repository: $($repoOwner)/$($repoName)" # Get all releases from GitHub $releases = Find-GitHubReleases -RepositoryOwner $repoOwner -RepositoryName $repoName Write-VerboseMark -Message "Fetched $($releases.Count) releases from GitHub." # Expand all flavors and collect versions $allVersions = @() foreach ($flavorName in $Configuration.releases.flavors.Keys) { $flavor = $Configuration.releases.flavors[$flavorName] # If assetsPattern has a named capture group, transpose by it $resolveParameters = @{ InputObject = $releases VersionPattern = $flavor.versionPattern AssetPattern = $flavor.assetsPattern } if ($flavor.assetsPattern -match '\(\?<([a-zA-Z_][a-zA-Z0-9_]*)>') { $resolveParameters['TransposeProperty'] = $Matches[1] } if ($flavor.minimumVersion) { $resolveParameters['MinimumVersion'] = $flavor.minimumVersion } $versions = Resolve-GitHubReleases @resolveParameters # Apply revision overrides from flavor configuration if ($flavor.revisions) { foreach ($ver in $versions) { $versionKey = "$($ver.version.Major).$($ver.version.Minor).$($ver.version.Build)" if ($flavor.revisions.Contains($versionKey)) { $rev = [int]$flavor.revisions[$versionKey] $newVersion = [version]::new($ver.version.Major, $ver.version.Minor, $ver.version.Build, $rev) $ver | Add-Member -NotePropertyName 'version' -NotePropertyValue $newVersion -Force Write-VerboseMark "Applied revision override: $versionKey -> $newVersion" } } } $allVersions += $versions | Add-Member -MemberType NoteProperty -Name 'flavor' -Value $flavorName -PassThru } # Flatten, sort by version descending and add to configuration $allVersions = $allVersions | Sort-Object -Property version -Descending $Configuration | Add-Member -NotePropertyName 'versions' -NotePropertyValue $allVersions -Force Write-VerboseMark -Message "Added $($allVersions.Count) versions to configuration." # Query all chocolatey sources foreach ($sourceName in $Configuration.sources.Keys) { $source = $Configuration.sources[$sourceName] $findArguments = @{ PackageName = $Configuration.package SourceUrl = $source.url } $credentials = Resolve-SourceCredentials -Source $source -SourceName $sourceName $findArguments += $credentials $source.publishedVersions = Find-ChocolateyPublishedVersions @findArguments if ($null -eq $source.publishedVersions) { $source.publishedVersions = @() } # Find missing versions: those in allVersions but not in publishedVersions $source.missingVersions = @(Compare-PublishedVersions -ReleaseVersions @($allVersions.version) -PublishedVersions @($source.publishedVersions)) Write-VerboseMark -Message "Queried source '$sourceName' for package info. Found $($source.publishedVersions.Count) published versions, $($source.missingVersions.Count) missing versions." # Resolve API key and publishing status Resolve-SourcePublishingStatus -Source $source -SourceName $sourceName } Write-VerboseMark -Message 'Resolve-ForgeConfiguration completed.' return $Configuration } |