aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-07-24 20:23:01 +0900
committernsfisis <nsfisis@gmail.com>2026-07-24 20:23:01 +0900
commit93733a249437e63774ac1989e0544b2d422e13b3 (patch)
treec89f1121d291f5e60727c9bf0bee195933e0bc88 /crates
parent8c316f2c5e93888f4b3a5b8c18df3373b54fa816 (diff)
downloadphp-shirabe-93733a249437e63774ac1989e0544b2d422e13b3.tar.gz
php-shirabe-93733a249437e63774ac1989e0544b2d422e13b3.tar.zst
php-shirabe-93733a249437e63774ac1989e0544b2d422e13b3.zip
fix(pool-builder): use plain getPackages() on locked repository
PoolBuilder::build_pool() and warn_about_non_matching_update_allow_list() called get_canonical_packages() on the locked repository during a partial update, but PHP's PoolBuilder uses the plain getPackages(). get_canonical_packages() unwraps AliasPackage down to its base package, discarding the alias's own version identity. Locker::get_locked_repository() wraps a lock entry with extra.branch-alias in a single CompleteAliasPackage rather than adding a separate base object, so canonicalizing it silently dropped the locked branch-alias version (e.g. 2.2.x-dev), leaving only the raw dev-master version behind. For a package excluded from the partial update's allow-list, that meant its locked branch-alias version could no longer satisfy the root's constraint, producing a spurious solver conflict instead of keeping the package pinned exactly as locked. Fixed the same bug in AuditCommand's --locked package listing, which had the identical get_canonical_packages()/getPackages() mismatch against AuditCommand.php.
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe/src/command/audit_command.rs3
-rw-r--r--crates/shirabe/src/dependency_resolver/pool_builder.rs6
-rw-r--r--crates/shirabe/tests/installer_test.rs8
3 files changed, 8 insertions, 9 deletions
diff --git a/crates/shirabe/src/command/audit_command.rs b/crates/shirabe/src/command/audit_command.rs
index fb56169e..c797eef1 100644
--- a/crates/shirabe/src/command/audit_command.rs
+++ b/crates/shirabe/src/command/audit_command.rs
@@ -8,7 +8,6 @@ use crate::command::base_command::base_command_initialize;
use crate::composer::PartialComposerHandle;
use crate::console::input::InputOption;
use crate::io::IOInterfaceImmutable;
-use crate::repository::CanonicalPackagesTrait;
use crate::repository::InstalledRepository;
use crate::repository::RepositoryInterface;
use crate::repository::RepositorySet;
@@ -265,7 +264,7 @@ impl AuditCommand {
.as_bool()
.unwrap_or(false),
)?;
- return locked_repo.borrow_mut().get_canonical_packages();
+ return locked_repo.borrow_mut().get_packages();
}
let root_pkg = composer.get_package();
diff --git a/crates/shirabe/src/dependency_resolver/pool_builder.rs b/crates/shirabe/src/dependency_resolver/pool_builder.rs
index 00d6b938..15cac540 100644
--- a/crates/shirabe/src/dependency_resolver/pool_builder.rs
+++ b/crates/shirabe/src/dependency_resolver/pool_builder.rs
@@ -14,8 +14,8 @@ use crate::package::CompleteAliasPackageHandle;
use crate::package::PackageInterfaceHandle;
use crate::package::base_package;
use crate::package::version::StabilityFilter;
-use crate::repository::CanonicalPackagesTrait;
use crate::repository::PlatformRepository;
+use crate::repository::RepositoryInterface;
use crate::repository::RepositoryInterfaceHandle;
use crate::repository::RootPackageRepository;
use indexmap::IndexMap;
@@ -159,7 +159,7 @@ impl PoolBuilder {
.get_locked_repository()
.unwrap()
.borrow_mut()
- .get_canonical_packages()?
+ .get_packages()?
{
if !self.is_update_allowed(locked_package.clone()) {
// remember which packages we skipped loading remote content for in this partial update
@@ -815,7 +815,7 @@ impl PoolBuilder {
.get_locked_repository()
.unwrap()
.borrow_mut()
- .get_canonical_packages()?
+ .get_packages()?
{
if Preg::is_match3(&pattern_regexp, &package.get_name(), None) {
continue 'outer;
diff --git a/crates/shirabe/tests/installer_test.rs b/crates/shirabe/tests/installer_test.rs
index 311fbb12..47a1ee3b 100644
--- a/crates/shirabe/tests/installer_test.rs
+++ b/crates/shirabe/tests/installer_test.rs
@@ -1399,10 +1399,10 @@ pool_optimizer_test! {
pool_optimizer_outdated_lock_file_with_new_platform_reqs_fails => "outdated-lock-file-with-new-platform-reqs-fails.test";
pool_optimizer_partial_update_always_updates_symlinked_path_repos => "partial-update-always-updates-symlinked-path-repos.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1";
pool_optimizer_partial_update_downgrades_non_allow_listed_unstable => "partial-update-downgrades-non-allow-listed-unstable.test";
- pool_optimizer_partial_update_forces_dev_reference_from_lock_for_non_updated_packages => "partial-update-forces-dev-reference-from-lock-for-non-updated-packages.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1";
+ pool_optimizer_partial_update_forces_dev_reference_from_lock_for_non_updated_packages => "partial-update-forces-dev-reference-from-lock-for-non-updated-packages.test";
pool_optimizer_partial_update_from_lock_with_root_alias => "partial-update-from-lock-with-root-alias.test";
pool_optimizer_partial_update_from_lock => "partial-update-from-lock.test";
- pool_optimizer_partial_update_installs_from_lock_even_missing => "partial-update-installs-from-lock-even-missing.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1";
+ pool_optimizer_partial_update_installs_from_lock_even_missing => "partial-update-installs-from-lock-even-missing.test";
pool_optimizer_partial_update_keeps_older_dep_if_still_required_with_provide => "partial-update-keeps-older-dep-if-still-required-with-provide.test";
pool_optimizer_partial_update_keeps_older_dep_if_still_required => "partial-update-keeps-older-dep-if-still-required.test";
pool_optimizer_partial_update_loads_root_aliases_for_path_repos => "partial-update-loads-root-aliases-for-path-repos.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1";
@@ -1589,10 +1589,10 @@ raw_pool_test! {
raw_pool_outdated_lock_file_with_new_platform_reqs_fails => "outdated-lock-file-with-new-platform-reqs-fails.test";
raw_pool_partial_update_always_updates_symlinked_path_repos => "partial-update-always-updates-symlinked-path-repos.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0";
raw_pool_partial_update_downgrades_non_allow_listed_unstable => "partial-update-downgrades-non-allow-listed-unstable.test";
- raw_pool_partial_update_forces_dev_reference_from_lock_for_non_updated_packages => "partial-update-forces-dev-reference-from-lock-for-non-updated-packages.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0";
+ raw_pool_partial_update_forces_dev_reference_from_lock_for_non_updated_packages => "partial-update-forces-dev-reference-from-lock-for-non-updated-packages.test";
raw_pool_partial_update_from_lock_with_root_alias => "partial-update-from-lock-with-root-alias.test";
raw_pool_partial_update_from_lock => "partial-update-from-lock.test";
- raw_pool_partial_update_installs_from_lock_even_missing => "partial-update-installs-from-lock-even-missing.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0";
+ raw_pool_partial_update_installs_from_lock_even_missing => "partial-update-installs-from-lock-even-missing.test";
raw_pool_partial_update_keeps_older_dep_if_still_required_with_provide => "partial-update-keeps-older-dep-if-still-required-with-provide.test";
raw_pool_partial_update_keeps_older_dep_if_still_required => "partial-update-keeps-older-dep-if-still-required.test";
raw_pool_partial_update_loads_root_aliases_for_path_repos => "partial-update-loads-root-aliases-for-path-repos.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0";