ae2860c3b5
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (push) Blocked by required conditions
Platform: moko-platform CI / CI Summary (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (push) Blocked by required conditions
Platform: moko-platform CI / CI Summary (push) Blocked by required conditions
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Successful in 6s
Generic: Repo Health / Access control (push) Successful in 9s
Universal: PR Check / Validate PR (pull_request) Failing after 10s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 22s
Universal: Auto Version Bump / Version Bump (push) Failing after 23s
Platform: moko-platform CI / Gate 1: Code Quality (push) Failing after 1m13s
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Failing after 1m17s
Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
182 lines
7.2 KiB
PHP
182 lines
7.2 KiB
PHP
#!/usr/bin/env php
|
|
<?php
|
|
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
*
|
|
* 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/version_auto_bump.php
|
|
* VERSION: 09.22.00
|
|
* BRIEF: Auto patch-bump, set stability suffix, and commit — single CLI replacing inline workflow bash
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
|
|
|
use MokoEnterprise\CliFramework;
|
|
|
|
class VersionAutoBumpCli extends CliFramework
|
|
{
|
|
protected function configure(): void
|
|
{
|
|
$this->setDescription('Auto patch-bump, set stability suffix, and commit');
|
|
$this->addArgument('--path', 'Repository root path', '.');
|
|
$this->addArgument('--branch', 'Git branch name', '');
|
|
$this->addArgument('--token', 'API token for push', '');
|
|
$this->addArgument('--repo-url', 'Repository URL for git remote', '');
|
|
$this->addArgument('--watch-path', 'Path to watch for changes', '');
|
|
}
|
|
|
|
protected function run(): int
|
|
{
|
|
$path = $this->getArgument('--path');
|
|
$branch = $this->getArgument('--branch');
|
|
$token = $this->getArgument('--token');
|
|
$repoUrl = $this->getArgument('--repo-url');
|
|
$watchPath = $this->getArgument('--watch-path');
|
|
|
|
// Auto-detect branch from git or CI env
|
|
if ($branch === '') {
|
|
$branch = getenv('GITHUB_REF_NAME') ?: trim((string) @shell_exec('git rev-parse --abbrev-ref HEAD 2>/dev/null'));
|
|
if (empty($branch) || $branch === 'HEAD') {
|
|
$this->log('ERROR', 'Cannot detect branch — pass --branch');
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// Map branch to stability suffix
|
|
$stabilityMap = [
|
|
'dev' => 'dev',
|
|
'alpha' => 'alpha',
|
|
'beta' => 'beta',
|
|
'rc' => 'rc',
|
|
];
|
|
|
|
if (array_key_exists($branch, $stabilityMap)) {
|
|
$stability = $stabilityMap[$branch];
|
|
} elseif (str_starts_with($branch, 'feature/') || str_starts_with($branch, 'patch/')) {
|
|
$stability = 'dev';
|
|
} else {
|
|
$stability = 'dev';
|
|
}
|
|
|
|
$cli = __DIR__;
|
|
$php = '"' . PHP_BINARY . '"';
|
|
|
|
// Auto-detect watch path from manifest.xml if not provided
|
|
if (empty($watchPath)) {
|
|
$manifestFile = realpath($path) . '/.mokogitea/manifest.xml';
|
|
if (file_exists($manifestFile)) {
|
|
$xml = @simplexml_load_file($manifestFile);
|
|
if ($xml && isset($xml->build->{'entry-point'})) {
|
|
$watchPath = (string) $xml->build->{'entry-point'};
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check if code files actually changed (skip bump for docs/config-only changes)
|
|
$shouldBump = true;
|
|
if (!empty($watchPath)) {
|
|
$root = realpath($path) ?: $path;
|
|
$diffOutput = trim((string) @shell_exec(
|
|
(PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git diff --name-only HEAD~1 HEAD -- " . escapeshellarg($watchPath) . " 2>/dev/null"
|
|
));
|
|
if (empty($diffOutput)) {
|
|
echo "No changes in {$watchPath} — skipping version bump\n";
|
|
$shouldBump = false;
|
|
} else {
|
|
echo "Changes detected in {$watchPath}:\n{$diffOutput}\n";
|
|
}
|
|
}
|
|
|
|
if (!$shouldBump) {
|
|
echo "No code changes — nothing to do\n";
|
|
return 0;
|
|
}
|
|
|
|
// Step 1: Patch bump
|
|
$bumpOutput = [];
|
|
exec("{$php} {$cli}/version_bump.php --path " . escapeshellarg($path) . " 2>&1", $bumpOutput, $bumpRc);
|
|
foreach ($bumpOutput as $line) {
|
|
echo "{$line}\n";
|
|
}
|
|
|
|
// Step 2: Read version
|
|
$versionOutput = [];
|
|
exec("{$php} {$cli}/version_read.php --path " . escapeshellarg($path) . " 2>&1", $versionOutput, $versionRc);
|
|
$version = trim($versionOutput[0] ?? '');
|
|
|
|
if (empty($version)) {
|
|
echo "No version found — skipping\n";
|
|
return 0;
|
|
}
|
|
|
|
echo "Version: {$version} | Branch: {$branch} | Stability: {$stability}\n";
|
|
|
|
// Step 3: Set platform version with stability suffix
|
|
$setPlatOutput = [];
|
|
exec("{$php} {$cli}/version_set_platform.php --path " . escapeshellarg($path)
|
|
. " --version " . escapeshellarg($version)
|
|
. " --branch " . escapeshellarg($branch)
|
|
. " --stability " . escapeshellarg($stability) . " 2>&1", $setPlatOutput);
|
|
foreach ($setPlatOutput as $line) {
|
|
echo "{$line}\n";
|
|
}
|
|
|
|
// Step 4: Version consistency check and fix
|
|
exec("{$php} {$cli}/version_check.php --path " . escapeshellarg($path) . " --fix 2>&1", $checkOutput);
|
|
|
|
// Re-read version (now includes suffix from version_set_platform)
|
|
$suffixMap = [
|
|
'dev' => '-dev',
|
|
'alpha' => '-alpha',
|
|
'beta' => '-beta',
|
|
'rc' => '-rc',
|
|
];
|
|
$displayVersion = preg_replace('/(-(dev|alpha|beta|rc))+$/', '', $version) . ($suffixMap[$stability] ?? '');
|
|
|
|
if ($this->dryRun) {
|
|
echo "[DRY-RUN] Would commit and push {$displayVersion} to {$branch}\n";
|
|
return 0;
|
|
}
|
|
|
|
// Step 5: Git commit and push
|
|
$root = realpath($path) ?: $path;
|
|
|
|
// Check if anything changed
|
|
$diffStatus = trim((string) @shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git diff --quiet && git diff --cached --quiet 2>&1 && echo clean || echo dirty"));
|
|
if ($diffStatus === 'clean') {
|
|
echo "No version changes to commit\n";
|
|
return 0;
|
|
}
|
|
|
|
// Configure git
|
|
@shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git config --local user.email \"gitea-actions[bot]@mokoconsulting.tech\"");
|
|
@shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git config --local user.name \"gitea-actions[bot]\"");
|
|
|
|
if (!empty($repoUrl)) {
|
|
@shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git remote set-url origin " . escapeshellarg($repoUrl));
|
|
}
|
|
|
|
@shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git add -A");
|
|
$commitMsg = $shouldBump
|
|
? "chore(version): auto-bump patch {$displayVersion} [skip ci]"
|
|
: "chore(version): set {$stability} suffix {$displayVersion} [skip ci]";
|
|
@shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git commit -m " . escapeshellarg($commitMsg)
|
|
. " --author=\"gitea-actions[bot] <gitea-actions[bot]@mokoconsulting.tech>\"");
|
|
|
|
$pushResult = @shell_exec((PHP_OS_FAMILY === 'Windows' ? "cd /d " : "cd ") . escapeshellarg($root) . " && git push origin " . escapeshellarg($branch) . " 2>&1");
|
|
echo $pushResult ?? '';
|
|
|
|
echo "Bumped to {$displayVersion}\n";
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
$app = new VersionAutoBumpCli();
|
|
exit($app->execute());
|