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/src | |
| 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/src')
| -rw-r--r-- | crates/shirabe/src/dependency_resolver/problem.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/main.rs | 7 | ||||
| -rw-r--r-- | crates/shirabe/src/util/ini_helper.rs | 8 |
3 files changed, 15 insertions, 4 deletions
diff --git a/crates/shirabe/src/dependency_resolver/problem.rs b/crates/shirabe/src/dependency_resolver/problem.rs index 855638cf..5ff949a9 100644 --- a/crates/shirabe/src/dependency_resolver/problem.rs +++ b/crates/shirabe/src/dependency_resolver/problem.rs @@ -459,7 +459,9 @@ impl Problem { Self::constraint_to_text(constraint) ); - let runtime_version = phpversion(&ext); + // Per-extension version info can't be known statically; query the real PHP + // runtime via the RPC bridge, same as platform::runtime::Runtime::get_extension_version. + let runtime_version = shirabe_php_rpc::phpversion(&ext); let effective_version = match runtime_version { None => "0".to_string(), Some(ref v) => v.clone(), diff --git a/crates/shirabe/src/main.rs b/crates/shirabe/src/main.rs index 2ae6d903..6eb8e4cb 100644 --- a/crates/shirabe/src/main.rs +++ b/crates/shirabe/src/main.rs @@ -3,6 +3,13 @@ use shirabe_php_shim::{PHP_ENV, PHP_SERVER}; fn main() { + // TODO(phase-c): PHP: `$xdebug = new XdebugHandler('Composer'); $xdebug->check(); unset($xdebug);` + // (restart the process without Xdebug loaded, for performance) is not ported. Since no + // XdebugHandler is ever constructed, `self::$name` never gets set, so the + // COMPOSER_ORIGINAL_INIS-env-var branch of XdebugHandler::getAllIniFiles() (see + // shirabe-external-packages' xdebug_handler.rs and shirabe/src/util/ini_helper.rs) is + // unreachable in this port, not merely unexercised by current tests. + // Take the $_ENV / $_SERVER snapshots before any putenv() mutates the real environment. // See `docs/dev/env-vars-porting.md` for details. std::sync::LazyLock::force(&PHP_ENV); diff --git a/crates/shirabe/src/util/ini_helper.rs b/crates/shirabe/src/util/ini_helper.rs index 57894113..c36b9189 100644 --- a/crates/shirabe/src/util/ini_helper.rs +++ b/crates/shirabe/src/util/ini_helper.rs @@ -1,13 +1,15 @@ //! ref: composer/src/Composer/Util/IniHelper.php -use shirabe_external_packages::composer::xdebug_handler::XdebugHandler; - pub struct IniHelper; impl IniHelper { /// Returns an array of php.ini locations with at least one entry. pub fn get_all() -> Vec<String> { - XdebugHandler::get_all_ini_files() + // PHP: XdebugHandler::getAllIniFiles(). shirabe_external_packages::XdebugHandler's port + // of that method can't reach the PHP RPC bridge (shirabe-php-rpc already depends on + // shirabe-external-packages, so the reverse dependency would cycle), so query the real + // PHP runtime's loaded/scanned ini files here instead. + shirabe_php_rpc::get_all_ini_files() } /// Describes the location of the loaded php.ini file(s). |
