From 3c57e87066d8abf1bf7aa0085b682dd5048c49dd Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 9 Jun 2026 14:35:58 -0500 Subject: [PATCH] feat: detect display_name, target_version, php_minimum in manifest_detect These fields are now required by MokoGitea's update feed generator which reads them from the manifest API (#592). - display_name: from XML with type prefix detection - target_version: from or default (5|6) - php_minimum: from tag --- cli/manifest_detect.php | 53 +++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/cli/manifest_detect.php b/cli/manifest_detect.php index c3251d3..c0e5e57 100644 --- a/cli/manifest_detect.php +++ b/cli/manifest_detect.php @@ -161,15 +161,18 @@ class ManifestDetectCli extends CliFramework $platform = $this->detectPlatform($root); $fields = [ - 'platform' => $platform, - 'name' => '', - 'description' => '', - 'version' => '', - 'element_name' => '', - 'package_type' => '', - 'language' => '', - 'entry_point' => '', - 'license_spdx' => '', + 'platform' => $platform, + 'name' => '', + 'description' => '', + 'version' => '', + 'element_name' => '', + 'package_type' => '', + 'language' => '', + 'entry_point' => '', + 'license_spdx' => '', + 'display_name' => '', + 'target_version' => '', + 'php_minimum' => '', ]; switch ($platform) { @@ -316,7 +319,13 @@ class ManifestDetectCli extends CliFramework ]; if (isset($prefixMap[$extType])) { $prefix = $prefixMap[$extType]; - if (strpos($element, $prefix) !== 0 && strpos($element, '_') === false) { + // Only add prefix if not already present (check all known prefixes) + $hasPrefix = false; + foreach ($prefixMap as $p) { + if (strpos($element, $p) === 0) { $hasPrefix = true; break; } + } + if (strpos($element, 'plg_') === 0) { $hasPrefix = true; } + if (!$hasPrefix) { $element = $prefix . $element; } } elseif ($extType === 'plugin') { @@ -349,6 +358,30 @@ class ManifestDetectCli extends CliFramework } } + // Display name for update feeds + if (!empty($fields['name'])) { + $name = $fields['name']; + // If name already has "Type - " prefix, use as-is + if (preg_match('/^(Package|Component|Module|Plugin|Template|Library)\s*-\s*/i', $name)) { + $fields['display_name'] = $name; + } elseif (!empty($extType)) { + $fields['display_name'] = ucfirst($extType) . ' - ' . $name; + } + } + + // Target Joomla version + if (preg_match('/]*version="([^"]+)"/', $xml, $m)) { + $fields['target_version'] = trim($m[1]); + } else { + // Default for Joomla 5/6 + $fields['target_version'] = '(5|6)\..*'; + } + + // PHP minimum + if (preg_match('/([^<]+)<\/php_minimum>/', $xml, $m)) { + $fields['php_minimum'] = trim($m[1]); + } + // License if (preg_match('/([^<]+)<\/license>/', $xml, $m)) { $fields['license_spdx'] = $this->normalizeLicense(trim($m[1])); -- 2.52.0