aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe')
-rw-r--r--crates/shirabe/src/repository/composer_repository.rs16
-rw-r--r--crates/shirabe/tests/installer_test.rs4
2 files changed, 18 insertions, 2 deletions
diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs
index 66d530c4..84d8fbf7 100644
--- a/crates/shirabe/src/repository/composer_repository.rs
+++ b/crates/shirabe/src/repository/composer_repository.rs
@@ -79,6 +79,15 @@ pub struct ProviderListingEntry {
#[derive(Debug)]
pub struct ComposerRepository {
+ // TODO(phase-c): PHP's ArrayRepository methods that aren't overridden here (findPackage,
+ // findPackages, count, hasPackage) call $this->getPackages(), which virtual-dispatches back
+ // to ComposerRepository::getPackages() (see its "embedded inheritance does not dispatch back
+ // to the wrapper" comment below, and the identical guard in load_packages()). Composition
+ // doesn't get that dispatch for free: self.inner.find_package()/find_packages()/count()/
+ // has_package() below call ArrayRepository::initialize() (a no-op stub) instead, and will
+ // silently see an empty package list if called before get_packages()/load_packages() has
+ // run once on this instance. Not yet known to be hit by any test; audit call sites and add
+ // the same `if !self.inner.is_initialized() { self.initialize()?; }` guard where needed.
inner: ArrayRepository,
/// Weak reference to the outermost repository handle wrapping this `ComposerRepository`,
/// injected via `set_self_handle`. Used to wire package -> repository back-references.
@@ -592,6 +601,13 @@ impl ComposerRepository {
let has_providers = self.has_providers()?;
if !has_providers && !self.has_partial_packages()? && self.lazy_providers_url.is_none() {
+ // PHP relies on ArrayRepository::loadPackages() invoking the virtual getPackages()
+ // (which in turn invokes the virtual initialize()), both overridden by
+ // ComposerRepository. Embedded inheritance does not dispatch back to the wrapper, so
+ // initialize the wrapper explicitly before delegating; see get_packages() above.
+ if !self.inner.is_initialized() {
+ self.initialize()?;
+ }
let inner_result = self.inner.load_packages(
package_name_map,
acceptable_stabilities,
diff --git a/crates/shirabe/tests/installer_test.rs b/crates/shirabe/tests/installer_test.rs
index e8fa7bc6..13e4fc28 100644
--- a/crates/shirabe/tests/installer_test.rs
+++ b/crates/shirabe/tests/installer_test.rs
@@ -1392,7 +1392,7 @@ pool_optimizer_test! {
pool_optimizer_github_issues_9290 => "github-issues-9290.test";
pool_optimizer_hint_main_rename => "hint-main-rename.test";
pool_optimizer_install_aliased_alias => "install-aliased-alias.test";
- pool_optimizer_install_branch_alias_composer_repo => "install-branch-alias-composer-repo.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1";
+ pool_optimizer_install_branch_alias_composer_repo => "install-branch-alias-composer-repo.test";
pool_optimizer_install_dev_using_dist => "install-dev-using-dist.test";
pool_optimizer_install_dev => "install-dev.test";
pool_optimizer_install_forces_reinstall_if_abandon_changes => "install-forces-reinstall-if-abandon-changes.test";
@@ -1582,7 +1582,7 @@ raw_pool_test! {
raw_pool_github_issues_9290 => "github-issues-9290.test";
raw_pool_hint_main_rename => "hint-main-rename.test";
raw_pool_install_aliased_alias => "install-aliased-alias.test";
- raw_pool_install_branch_alias_composer_repo => "install-branch-alias-composer-repo.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0";
+ raw_pool_install_branch_alias_composer_repo => "install-branch-alias-composer-repo.test";
raw_pool_install_dev_using_dist => "install-dev-using-dist.test";
raw_pool_install_dev => "install-dev.test";
raw_pool_install_forces_reinstall_if_abandon_changes => "install-forces-reinstall-if-abandon-changes.test";