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") } # .env-Datei laden falls vorhanden (ist in .gitignore) $EnvFile = Join-Path $ProjectRoot ".env" if (Test-Path $EnvFile) { Get-Content $EnvFile | ForEach-Object { if ($_ -match '^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$') { $val = $matches[2].Trim('"', "'") [System.Environment]::SetEnvironmentVariable($matches[1], $val, "Process") } } } # 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) { $Utf8NoBom = New-Object System.Text.UTF8Encoding($false) $Changelog = [System.IO.File]::ReadAllText((Join-Path $ProjectRoot "CHANGELOG.md"), $Utf8NoBom) $PayloadPath = Join-Path $DistDir "release_req.json" $Payload = @{ tag_name = $TagName name = "Sanctum $TagName (Windows x86_64)" body = $Changelog draft = $false prerelease = $false } | ConvertTo-Json -Depth 5 [System.IO.File]::WriteAllText($PayloadPath, $Payload, $Utf8NoBom) $CreateResp = & curl.exe -s -X POST "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases" ` -H "Authorization: token $Token" ` -H "Content-Type: application/json; charset=utf-8" ` --data-binary "@$PayloadPath" Remove-Item $PayloadPath -Force -ErrorAction SilentlyContinue $Release = $CreateResp | ConvertFrom-Json if (-not $Release.id) { Write-Error "Fehler beim Erstellen des Releases: $CreateResp" exit 1 } 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" $AuthHeader = "Authorization: token $Token" # ZIP Asset hochladen Write-Host "Lade sanctum-$TagName-windows-x86_64.zip hoch..." -ForegroundColor Cyan $ZipPathNorm = $ZipFile.Replace('\', '/') $ZipUrl = "$UploadUrl?name=sanctum-$TagName-windows-x86_64.zip" $ZipResult = & curl.exe -s -X POST $ZipUrl -H $AuthHeader -F "attachment=@$ZipPathNorm" Write-Host "[OK] sanctum-$TagName-windows-x86_64.zip hochgeladen." -ForegroundColor Green # SHA256SUMS.txt hochladen Write-Host "Lade SHA256SUMS.txt hoch..." -ForegroundColor Cyan $SumPathNorm = $ChecksumFile.Replace('\', '/') $SumUrl = "$UploadUrl?name=SHA256SUMS.txt" $SumResult = & curl.exe -s -X POST $SumUrl -H $AuthHeader -F "attachment=@$SumPathNorm" Write-Host "[OK] SHA256SUMS.txt hochgeladen." -ForegroundColor Green # Standalone EXE hochladen $ExeFile = Join-Path $ProjectRoot "target\release\sanctum.exe" if (Test-Path $ExeFile) { Write-Host "Lade sanctum.exe hoch..." -ForegroundColor Cyan $ExePathNorm = $ExeFile.Replace('\', '/') $ExeUrl = "$UploadUrl?name=sanctum.exe" $ExeResult = & curl.exe -s -X POST $ExeUrl -H $AuthHeader -F "attachment=@$ExePathNorm" Write-Host "[OK] sanctum.exe 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"