param ( [string]$Token, [string]$GiteaUrl = "https://gitea.pansi.eu", [string]$Owner = "harald", [string]$Repo = "sanctum" ) $ErrorActionPreference = "Stop" $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $ProjectRoot = Split-Path -Parent $ScriptDir $CargoToml = Get-Content (Join-Path $ProjectRoot "Cargo.toml") -Raw if ($CargoToml -match 'version\s*=\s*"([^"]+)"') { $Version = $matches[1] } else { Write-Error "Version nicht gefunden." exit 1 } $TagName = "v$Version" $DistDir = Join-Path $ProjectRoot "dist" $ZipFile = Join-Path $DistDir "sanctum-$TagName-windows-x86_64.zip" $ChecksumFile = Join-Path $DistDir "SHA256SUMS.txt" if (-not (Test-Path $ZipFile)) { Write-Host "Dist-Paket existiert noch nicht. Baue Paket..." -ForegroundColor Yellow & (Join-Path $ScriptDir "package-release.ps1") } # Token ermitteln (Parameter -> Environment -> Prompt) if (-not $Token) { if ($env:GITEA_TOKEN) { $Token = $env:GITEA_TOKEN } else { $SecureToken = Read-Host "Gitea Personal Access Token (mit 'repo'-Scope)" -AsSecureString $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureToken) $Token = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) } } if (-not $Token -or $Token.Trim().Length -eq 0) { Write-Error "Kein Token angegeben. Abgebrochen." exit 1 } Write-Host "============================================================" -ForegroundColor Cyan Write-Host " Veroeffentliche Release $TagName auf Gitea" -ForegroundColor Cyan Write-Host " Repository: $Owner/$Repo ($GiteaUrl)" -ForegroundColor Cyan Write-Host "============================================================" -ForegroundColor Cyan $Headers = @{ "Authorization" = "token $Token" "Accept" = "application/json" } # Pruefen ob Release bereits existiert $ExistingReleases = try { Invoke-RestMethod -Uri "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases" -Headers $Headers -Method Get } catch { @() } $Release = $ExistingReleases | Where-Object { $_.tag_name -eq $TagName } if (-not $Release) { $Changelog = Get-Content (Join-Path $ProjectRoot "CHANGELOG.md") -Raw $Body = @{ tag_name = $TagName name = "Sanctum $TagName (Windows x86_64)" body = $Changelog draft = $false prerelease = $false } | ConvertTo-Json $Release = Invoke-RestMethod -Uri "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases" -Headers $Headers -Method Post -Body $Body -ContentType "application/json; charset=utf-8" Write-Host "[OK] Release $TagName auf Gitea angelegt (ID: $($Release.id))." -ForegroundColor Green } else { Write-Host "[INFO] Release $TagName existiert bereits (ID: $($Release.id))." -ForegroundColor Yellow } $UploadUrl = "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases/$($Release.id)/assets" # ZIP Asset hochladen Write-Host "Lade sanctum-$TagName-windows-x86_64.zip hoch..." -ForegroundColor Cyan $ZipResult = & curl.exe -s -X POST "$UploadUrl?name=sanctum-$TagName-windows-x86_64.zip" ` -H "Authorization: token $Token" ` -H "Content-Type: multipart/form-data" ` -F "attachment=@$ZipFile" Write-Host "[OK] sanctum-$TagName-windows-x86_64.zip hochgeladen." -ForegroundColor Green # SHA256SUMS.txt hochladen Write-Host "Lade SHA256SUMS.txt hoch..." -ForegroundColor Cyan $SumResult = & curl.exe -s -X POST "$UploadUrl?name=SHA256SUMS.txt" ` -H "Authorization: token $Token" ` -H "Content-Type: multipart/form-data" ` -F "attachment=@$ChecksumFile" Write-Host "[OK] SHA256SUMS.txt hochgeladen." -ForegroundColor Green Write-Host "`n============================================================" -ForegroundColor Green Write-Host " Release $TagName erfolgreich auf Gitea veroeffentlicht!" -ForegroundColor Green Write-Host "============================================================" -ForegroundColor Green Write-Host " URL: $GiteaUrl/$Owner/$Repo/releases/tag/$TagName`n"