#!/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/changelog_promote.php * BRIEF: Promote [Unreleased] section in CHANGELOG.md to a versioned entry */ declare(strict_types=1); require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; use MokoEnterprise\CliFramework; class ChangelogPromoteCli extends CliFramework { protected function configure(): void { $this->setDescription('Promote [Unreleased] CHANGELOG section to a versioned entry'); $this->addArgument('--path', 'Repository root path', '.'); $this->addArgument('--version', 'Version string XX.YY.ZZ', ''); $this->addArgument('--date', 'Release date YYYY-MM-DD', date('Y-m-d')); } protected function run(): int { $path = $this->getArgument('--path'); $version = $this->getArgument('--version'); $date = $this->getArgument('--date'); if (empty($version)) { $this->log('ERROR', 'Usage: changelog_promote.php --path . --version XX.YY.ZZ [--date YYYY-MM-DD]'); return 1; } $changelog = realpath($path) . '/CHANGELOG.md'; if (!file_exists($changelog)) { $this->log('ERROR', "No CHANGELOG.md found at {$path}"); return 1; } $content = file_get_contents($changelog); if (!preg_match('/## \[?Unreleased\]?/i', $content)) { $this->log('ERROR', 'No [Unreleased] section found in CHANGELOG.md'); return 1; } // Replace [Unreleased] with versioned entry $content = preg_replace( '/## \[Unreleased\]/i', "## [{$version}] --- {$date}", $content, 1 ); $content = preg_replace( '/## Unreleased/i', "## [{$version}] --- {$date}", $content, 1 ); // Insert new [Unreleased] section after the first heading line $lines = explode("\n", $content); $inserted = false; $result = []; foreach ($lines as $line) { $result[] = $line; if (!$inserted && preg_match('/^# /', $line)) { $result[] = ''; $result[] = '## [Unreleased]'; $result[] = ''; $inserted = true; } } $content = implode("\n", $result); file_put_contents($changelog, $content); $this->success("CHANGELOG promoted: [Unreleased] -> [{$version}] --- {$date}"); return 0; } } $app = new ChangelogPromoteCli(); exit($app->execute());