From 172922ba6173c0a653532f5fb5829a1043dfc2e9 Mon Sep 17 00:00:00 2001 From: Raymond LaRose Date: Tue, 29 Apr 2025 17:18:00 -0400 Subject: [PATCH] Add Get-GiteaReleases function to retrieve releases from a Gitea repository --- PS-GiteaUtilities/PS-GiteaUtilities.psm1 | 140 ++++++++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/PS-GiteaUtilities/PS-GiteaUtilities.psm1 b/PS-GiteaUtilities/PS-GiteaUtilities.psm1 index 1447807..955b1cb 100644 --- a/PS-GiteaUtilities/PS-GiteaUtilities.psm1 +++ b/PS-GiteaUtilities/PS-GiteaUtilities.psm1 @@ -872,4 +872,142 @@ Function Get-GiteaChildItem { } } -Export-ModuleMember -Function Set-GiteaConfiguration, Get-GiteaConfiguration, Get-GiteaFileContent, Invoke-GiteaFileDownload, Get-GiteaChildItem, Get-GiteaLFSFile \ No newline at end of file +function Get-GiteaReleases { + <# + .SYNOPSIS + Retrieves the releases for a Gitea repository. + + .DESCRIPTION + This function retrieves the releases for a Gitea repository using the Gitea API. The function requires the URL of the Gitea server, the owner of the repository, the name of the repository, and a personal access token. + #> + [cmdletbinding()] + param( + [Parameter(ValueFromPipelineByPropertyName)] + [string]$giteaURL = "https://gitea.norwichct.tech", + [Parameter(ValueFromPipelineByPropertyName)] + [string]$repoOwner, + [Parameter(ValueFromPipelineByPropertyName)] + [string]$repoName, + [int]$page, + [int]$limit, + [switch]$includeDrafts, + [switch]$includePreReleases, + [string]$token + ) + + begin { + # Use configuration if parameters aren't provided + if (-not $PSBoundParameters.ContainsKey('giteaURL') -or + -not $PSBoundParameters.ContainsKey('repoOwner') -or + -not $PSBoundParameters.ContainsKey('token')) { + + $config = Get-GiteaConfiguration + if ($config) { + if (-not $PSBoundParameters.ContainsKey('giteaURL')) { $giteaURL = $config.giteaURL } + if (-not $PSBoundParameters.ContainsKey('repoOwner')) { $repoOwner = $config.defaultOwner } + if (-not $PSBoundParameters.ContainsKey('token')) { $token = $config.token } + } + } + + # Validate that we have all required parameters + $missingParams = @() + if (-not $giteaURL) { $missingParams += "giteaURL" } + if (-not $repoOwner) { $missingParams += "repoOwner" } + if (-not $token) { $missingParams += "token" } + + if ($missingParams.Count -gt 0) { + throw "Missing required parameters: $($missingParams -join ', '). Either provide them directly or set them with Set-GiteaConfiguration." + } + + $headers = @{ + "Authorization" = "token $token" + "Accept" = "application/json" + } + } + + process { + Write-Verbose "Parameters:" + Write-Verbose "giteaURL: $giteaURL" + Write-Verbose "repoOwner: $repoOwner" + Write-Verbose "repoName: $repoName" + Write-Verbose "page: $page" + Write-Verbose "limit: $limit" + Write-Verbose "includeDrafts: $includeDrafts" + Write-Verbose "includePreReleases: $includePreReleases" + Write-Debug "Token: $token" + + Write-Verbose "Processing releases for repository: $repoName" + $url = "$giteaURL" + $url += "/api/v1/repos" + $url += "/$repoOwner" + $url += "/$repoName" + $url += "/releases" + if ($includeDrafts -eq $true) { + $url += "?draft=true" + } + else { + $url += "?draft=false" + } + if ($includePreReleases -eq $true) { + $url += "&pre-release=true" + } + if ($page -gt 1) { + $url += "&page=$page" + } + if ($limit -gt 0) { + $url += "&limit=$limit" + } + Write-Verbose "URL: $url" + + try { + $result = Invoke-RestMethod -Uri $url -Method Get -Headers $headers + $releases = foreach ($release in $result) { + # Process each asset into its own object + $assets = foreach ($asset in $release.assets) { + [PSCustomObject]@{ + Id = $asset.id + Name = $asset.name + Size = $asset.size + DownloadCount = $asset.download_count + CreatedAt = [DateTime]$asset.created_at + UUID = $asset.uuid + DownloadURL = $asset.browser_download_url + } + } + + # Create the release object with nested author and assets + [PSCustomObject]@{ + Id = $release.id + TagName = $release.tag_name + TargetCommit = $release.target_commitish + Name = $release.name + Description = $release.body + URL = $release.url + HTMLURL = $release.html_url + TarballURL = $release.tarball_url + ZipballURL = $release.zipball_url + UploadURL = $release.upload_url + IsDraft = $release.draft + IsPrerelease = $release.prerelease + CreatedAt = [DateTime]$release.created_at + PublishedAt = [DateTime]$release.published_at + Author = [PSCustomObject]@{ + Id = $release.author.id + Username = $release.author.username + Email = $release.author.email + AvatarURL = $release.author.avatar_url + HTMLURL = $release.author.html_url + } + Assets = $assets + } + } + + return $releases + } + catch { + Write-Error "Failed to retrieve file '$file' from Gitea: $_" + } + } +} + +Export-ModuleMember -Function Set-GiteaConfiguration, Get-GiteaConfiguration, Get-GiteaFileContent, Invoke-GiteaFileDownload, Get-GiteaChildItem, Get-GiteaLFSFile, Get-GiteaReleases \ No newline at end of file