diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-24 20:22:58 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-24 20:22:58 +0900 |
| commit | 8c316f2c5e93888f4b3a5b8c18df3373b54fa816 (patch) | |
| tree | 06455cd54b6a41febabab13ba76c9d92406b57fe /crates/shirabe-php-rpc | |
| parent | 08a99447445167e2b2eeee9c81fc89d5044bfe6d (diff) | |
| download | php-shirabe-8c316f2c5e93888f4b3a5b8c18df3373b54fa816.tar.gz php-shirabe-8c316f2c5e93888f4b3a5b8c18df3373b54fa816.tar.zst php-shirabe-8c316f2c5e93888f4b3a5b8c18df3373b54fa816.zip | |
fix(dependency-resolver): query real PHP for ext-* version/loaded checks
Two shim gaps made the extension-related branches of solver-problem
messages wrong:
- phpversion($ext) with a non-empty extension can't be known statically
(it's shirabe-php-shim's todo!()); Problem::get_missing_package_reason
now calls shirabe_php_rpc::phpversion, the same RPC bridge
platform::runtime::Runtime::get_extension_version already uses.
- extension_loaded's hardcoded allowlist was missing "pcre", a mandatory
always-compiled-in PHP extension, so ext-pcre was misreported as
"missing from your system" instead of "disabled by your platform
config" whenever a platform override disabled it.
Also fix XdebugHandler::getAllIniFiles() always returning `[""]`
(a php-runtime stub): create_extension_hint()'s early-return guard
(`paths[0] empty && len==1`) fired unconditionally, silently dropping
the entire "To enable extensions..." hint from every solver-problem
message that mentions missing extensions. shirabe-external-packages
can't depend on shirabe-php-rpc (shirabe-php-rpc already depends on
shirabe-external-packages), so IniHelper::get_all() queries a new
get_all_ini_files RPC command directly instead of going through the
stub.
This exposed that XdebugHandler is never constructed with a name
because bin/composer's restart-without-Xdebug bootstrap was never
ported to main.rs, making COMPOSER_ORIGINAL_INIS-driven behavior
unreachable; documented with a TODO(phase-c) and updated
ini_helper_test.rs's ignore reasons (and ignored test_with_no_ini,
which only passed before by coincidence with the old stub's constant
output) to match.
Diffstat (limited to 'crates/shirabe-php-rpc')
| -rw-r--r-- | crates/shirabe-php-rpc/php/worker.php | 8 | ||||
| -rw-r--r-- | crates/shirabe-php-rpc/src/lib.rs | 12 |
2 files changed, 20 insertions, 0 deletions
diff --git a/crates/shirabe-php-rpc/php/worker.php b/crates/shirabe-php-rpc/php/worker.php index d7d8f251..060373d5 100644 --- a/crates/shirabe-php-rpc/php/worker.php +++ b/crates/shirabe-php-rpc/php/worker.php @@ -13,6 +13,14 @@ $dispatch = [ 'curl_version' => static fn($arg) => function_exists('curl_version') ? (curl_version()['version'] ?? null) : null, 'phpversion' => static fn($name) => phpversion($name), 'get_loaded_extensions' => static fn($arg) => implode(',', get_loaded_extensions()), + 'get_all_ini_files' => static function ($arg) { + $paths = [(string) php_ini_loaded_file()]; + $scanned = php_ini_scanned_files(); + if ($scanned !== false) { + $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); + } + return implode(',', $paths); + }, 'extension_info' => static function ($name) { if (!extension_loaded($name)) { return ''; diff --git a/crates/shirabe-php-rpc/src/lib.rs b/crates/shirabe-php-rpc/src/lib.rs index d939829a..dde91d3c 100644 --- a/crates/shirabe-php-rpc/src/lib.rs +++ b/crates/shirabe-php-rpc/src/lib.rs @@ -88,6 +88,18 @@ pub fn get_loaded_extensions() -> Vec<String> { } } +/// `Composer\XdebugHandler\XdebugHandler::getAllIniFiles()` (minus the `self::$name` branch, +/// which is unreachable since this port never constructs an XdebugHandler): `[(string) +/// php_ini_loaded_file()]` merged with the trimmed, comma-split `php_ini_scanned_files()` list +/// when scanning is active. Paths are joined with `,` on the PHP side and split back here; real +/// ini paths never contain a comma (same assumption `get_loaded_extensions` makes). +pub fn get_all_ini_files() -> Vec<String> { + match call("get_all_ini_files", "") { + PhpMixed::String(s) => s.split(',').map(|s| s.to_string()).collect(), + other => panic!("PHP RPC: `get_all_ini_files` did not return a string: {other:?}"), + } +} + const GLUE_SCRIPT: &str = include_str!("../php/worker.php"); struct Worker { |
