aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-core/src/platform.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-core/src/platform.rs')
-rw-r--r--crates/mozart-core/src/platform.rs43
1 files changed, 34 insertions, 9 deletions
diff --git a/crates/mozart-core/src/platform.rs b/crates/mozart-core/src/platform.rs
index 819d8c9..47ce2a0 100644
--- a/crates/mozart-core/src/platform.rs
+++ b/crates/mozart-core/src/platform.rs
@@ -16,17 +16,32 @@ pub struct PlatformPackage {
/// Returns true if the package name is a Composer platform package.
///
-/// Platform packages include: php, php-*, ext-*, lib-*, composer,
-/// composer-plugin-api, composer-runtime-api.
+/// Mirrors `Composer\Repository\PlatformRepository::PLATFORM_PACKAGE_REGEX`:
+/// `php`, `php-64bit`, `php-ipv6`, `php-zts`, `php-debug`, `hhvm`,
+/// `ext-<name>`, `lib-<name>`, `composer`, `composer-plugin-api`,
+/// `composer-runtime-api`. The `php-` family is a closed set, NOT a wildcard
+/// — `php-http/client-common` is a regular vendor package, not a platform
+/// requirement.
pub fn is_platform_package(name: &str) -> bool {
let lower = name.to_lowercase();
- lower == "php"
- || lower.starts_with("php-")
- || lower.starts_with("ext-")
- || lower.starts_with("lib-")
- || lower == "composer"
- || lower == "composer-plugin-api"
- || lower == "composer-runtime-api"
+ match lower.as_str() {
+ "php"
+ | "php-64bit"
+ | "php-ipv6"
+ | "php-zts"
+ | "php-debug"
+ | "hhvm"
+ | "composer"
+ | "composer-plugin-api"
+ | "composer-runtime-api" => true,
+ _ => {
+ (lower.starts_with("ext-") || lower.starts_with("lib-"))
+ && lower[4..]
+ .chars()
+ .next()
+ .is_some_and(|c| c.is_ascii_alphanumeric())
+ }
+ }
}
// ─── Detection ───────────────────────────────────────────────────────────────
@@ -378,6 +393,16 @@ mod tests {
}
#[test]
+ fn test_is_platform_package_php_prefix_vendor() {
+ // Vendor packages whose names happen to start with "php-" are NOT
+ // platform packages. Composer's PLATFORM_PACKAGE_REGEX limits the
+ // `php-` family to a closed set of suffixes (64bit/ipv6/zts/debug).
+ assert!(!is_platform_package("php-http/client-common"));
+ assert!(!is_platform_package("php-http/httplug"));
+ assert!(!is_platform_package("php-amqplib/php-amqplib"));
+ }
+
+ #[test]
fn test_parse_platform_info_basic() {
let output = "PHP_VERSION:8.2.1\nPHP_INT_SIZE:8\nPHP_DEBUG:0\nPHP_ZTS:0\nIPV6:1\nEXTENSIONS:\njson:8.2.1\nctype:8.2.1\n";
let packages = parse_platform_info(output);