#!/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/manifest_element.php * BRIEF: Extract element name, type, type prefix, and ZIP name from manifest */ declare(strict_types=1); require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; use MokoEnterprise\CliFramework; class ManifestElementCli extends CliFramework { protected function configure(): void { $this->setDescription('Extract element name, type, type prefix, and ZIP name from manifest'); $this->addArgument('--path', 'Repository root', '.'); $this->addArgument('--version', 'Version string', null); $this->addArgument('--stability', 'Stability level', 'stable'); $this->addArgument('--repo', 'Repository name', ''); $this->addArgument('--github-output', 'Export results to $GITHUB_OUTPUT', false); } protected function run(): int { $path = $this->getArgument('--path'); $version = $this->getArgument('--version'); $stability = $this->getArgument('--stability'); $repoName = $this->getArgument('--repo'); $githubOutput = (bool) $this->getArgument('--github-output'); $root = realpath($path) ?: $path; $platform = 'generic'; $manifestXml = "{$root}/.mokogitea/manifest.xml"; if (file_exists($manifestXml)) { $content = file_get_contents($manifestXml); if (preg_match('/([^<]+)<\/platform>/', $content, $pm)) { $platform = trim($pm[1]); } } $extManifest = null; $manifestFiles = array_merge(glob("{$root}/src/pkg_*.xml") ?: [], glob("{$root}/src/*.xml") ?: [], glob("{$root}/*.xml") ?: []); foreach ($manifestFiles as $file) { $c = file_get_contents($file); if (strpos($c, '([^<]+)<\/element>/', $xml, $em)) { $extElement = $em[1]; } if (empty($extElement) && preg_match('/module="([^"]*)"/', $xml, $mm)) { $extElement = $mm[1]; } if (empty($extElement) && preg_match('/plugin="([^"]*)"/', $xml, $pm2)) { $extElement = $pm2[1]; } if ($extType === 'package' && preg_match('/([^<]+)<\/packagename>/', $xml, $pn)) { $extElement = $pn[1]; } if (empty($extElement)) { $extElement = strtolower(basename($extManifest, '.xml')); if (in_array($extElement, ['templatedetails', 'manifest'], true)) { $extElement = strtolower(str_replace([' ', '-'], '', $repoName ?: basename($root))); } } if (preg_match('/([^<]+)<\/name>/', $xml, $nm)) { $extName = trim($nm[1]); } break; case in_array($platform, ['dolibarr', 'crm-module'], true) && $modFile !== null: $extType = 'dolibarr-module'; $modBasename = basename($modFile, '.class.php'); $extElement = strtolower(preg_replace('/^mod/', '', $modBasename)); $modContent = file_get_contents($modFile); if (preg_match('/\$this->name\s*=\s*[\'"]([^\'"]+)[\'"]/', $modContent, $nm)) { $extName = $nm[1]; } break; default: $extElement = strtolower(str_replace([' ', '-'], '', $repoName ?: basename($root))); $extType = 'generic'; break; } $extElement = preg_replace('/^(pkg_|com_|mod_|plg_[a-z]+_|tpl_|lib_)/', '', $extElement); $typePrefix = ''; switch ($extType) { case 'plugin': $typePrefix = "plg_{$extFolder}_"; break; case 'module': $typePrefix = 'mod_'; break; case 'component': $typePrefix = 'com_'; break; case 'template': $typePrefix = 'tpl_'; break; case 'library': $typePrefix = 'lib_'; break; case 'package': $typePrefix = 'pkg_'; break; } $suffixMap = [ 'development' => '-dev', 'dev' => '-dev', 'alpha' => '-alpha', 'beta' => '-beta', 'rc' => '-rc', 'release-candidate' => '-rc', 'stable' => '', ]; $suffix = $suffixMap[$stability] ?? ''; $zipName = ''; if ($version !== null) { $zipName = "{$typePrefix}{$extElement}-{$version}{$suffix}.zip"; } if (empty($extName)) { $extName = $repoName ?: basename($root); } $outputs = [ 'platform' => $platform, 'ext_element' => $extElement, 'ext_type' => $extType, 'ext_folder' => $extFolder, 'ext_name' => $extName, 'type_prefix' => $typePrefix, 'zip_name' => $zipName, ]; if ($githubOutput) { $ghOutput = getenv('GITHUB_OUTPUT'); $lines = []; foreach ($outputs as $key => $value) { $lines[] = "{$key}={$value}"; } if ($ghOutput) { file_put_contents($ghOutput, implode("\n", $lines) . "\n", FILE_APPEND); } else { foreach ($outputs as $key => $value) { echo "::set-output name={$key}::{$value}\n"; } } } else { foreach ($outputs as $key => $value) { echo "{$key}={$value}\n"; } } return 0; } } $app = new ManifestElementCli(); exit($app->execute());