#!/usr/bin/env php * * SPDX-License-Identifier: GPL-3.0-or-later * * FILE INFORMATION * DEFGROUP: moko-platform.CLI * INGROUP: moko-platform * REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform * PATH: /cli/release_body_update.php * BRIEF: Update Gitea release body with changelog extract and checksums */ declare(strict_types=1); require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; use MokoEnterprise\CliFramework; class ReleaseBodyUpdateCli extends CliFramework { protected function configure(): void { $this->setDescription('Update Gitea release body with changelog extract and checksums'); $this->addArgument('--path', 'Repo root for CHANGELOG.md', '.'); $this->addArgument('--version', 'Version string', ''); $this->addArgument('--release-tag', 'Gitea release tag', ''); $this->addArgument('--token', 'Gitea API token', ''); $this->addArgument('--api-base', 'Gitea API base URL', ''); $this->addArgument('--zip-name', 'ZIP filename for checksum table', ''); $this->addArgument('--tar-name', 'tar.gz filename for checksum table', ''); $this->addArgument('--zip-sha', 'SHA256 of ZIP', ''); $this->addArgument('--tar-sha', 'SHA256 of tar.gz', ''); $this->addArgument('--output-summary', 'Write to $GITHUB_STEP_SUMMARY', false); } protected function run(): int { $path = $this->getArgument('--path'); $version = $this->getArgument('--version'); $releaseTag = $this->getArgument('--release-tag'); $token = $this->getArgument('--token'); $apiBase = $this->getArgument('--api-base'); $zipName = $this->getArgument('--zip-name'); $tarName = $this->getArgument('--tar-name'); $zipSha = $this->getArgument('--zip-sha'); $tarSha = $this->getArgument('--tar-sha'); $outputSummary = $this->getArgument('--output-summary'); if (empty($token)) { $token = getenv('MOKOGITEA_TOKEN') ?: getenv('GITEA_TOKEN') ?: ''; } if (empty($version) || empty($releaseTag) || empty($token) || empty($apiBase)) { $this->log('ERROR', 'Usage: release_body_update.php --version VER --release-tag TAG --token TOKEN --api-base URL'); return 1; } $root = realpath($path) ?: $path; // Extract changelog section for this version $changelog = ''; $clFile = "{$root}/CHANGELOG.md"; if (file_exists($clFile)) { $lines = file($clFile, FILE_IGNORE_NEW_LINES); $capturing = false; $clLines = []; foreach ($lines as $line) { if (preg_match('/^##\s.*' . preg_quote($version, '/') . '/', $line)) { $capturing = true; continue; } if ($capturing && preg_match('/^## /', $line)) { break; } if ($capturing) { $clLines[] = $line; } } $changelog = trim(implode("\n", $clLines)); } // Build release body $body = "## {$version} (" . date('Y-m-d') . ")\n\n"; if (!empty($changelog)) { $body .= "{$changelog}\n\n"; } if (!empty($zipSha) || !empty($tarSha)) { $body .= "---\n\n### Checksums\n\n| File | SHA-256 |\n|------|--------|\n"; if (!empty($zipName) && !empty($zipSha)) { $body .= "| `{$zipName}` | `{$zipSha}` |\n"; } if (!empty($tarName) && !empty($tarSha)) { $body .= "| `{$tarName}` | `{$tarSha}` |\n"; } } // Get release ID by tag $ch = curl_init("{$apiBase}/releases/tags/{$releaseTag}"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: token {$token}"], CURLOPT_TIMEOUT => 30, ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200 || empty($response)) { $this->log('ERROR', "Failed to get release for tag '{$releaseTag}' (HTTP {$httpCode})"); return 1; } $release = json_decode($response, true); $releaseId = $release['id'] ?? null; if ($releaseId === null) { $this->log('ERROR', "No release ID found for tag '{$releaseTag}'"); return 1; } // PATCH release body $payload = json_encode(['body' => $body]); $ch = curl_init("{$apiBase}/releases/{$releaseId}"); curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: token {$token}", "Content-Type: application/json"], CURLOPT_POSTFIELDS => $payload, CURLOPT_TIMEOUT => 30, ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { $this->log('ERROR', "Failed to update release body (HTTP {$httpCode})"); return 1; } echo "Release body updated for {$releaseTag} (release #{$releaseId})\n"; if ($outputSummary) { $summaryFile = getenv('GITHUB_STEP_SUMMARY'); if ($summaryFile) { file_put_contents($summaryFile, "Release body updated with changelog + checksums\n", FILE_APPEND); } } return 0; } } $app = new ReleaseBodyUpdateCli(); exit($app->execute());