From 9f6f83c479985e882dbd086a8495bcd772c80b54 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 6 Jun 2026 11:12:39 +0900 Subject: fix(array-merge): route mixed-key merges through faithful array_merge * Config::merge called array_merge_recursive where PHP uses plain array_merge (string-key overwrite); switch those six sites to array_merge. * provides/replaces merges that may carry an AliasPackage's self.version numeric keys ("0","1",...) were collapsing under naive chain/insert/or_insert; route them through a new array_merge_map(). Co-Authored-By: Claude Opus 4.8 --- .../shirabe/src/repository/installed_repository.rs | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) (limited to 'crates/shirabe/src/repository') diff --git a/crates/shirabe/src/repository/installed_repository.rs b/crates/shirabe/src/repository/installed_repository.rs index e199556..e6f022e 100644 --- a/crates/shirabe/src/repository/installed_repository.rs +++ b/crates/shirabe/src/repository/installed_repository.rs @@ -2,6 +2,7 @@ use indexmap::IndexMap; use shirabe_php_shim::LogicException; +use shirabe_php_shim::array_merge_map; use shirabe_semver::constraint::AnyConstraint; use shirabe_semver::constraint::MatchAllConstraint; use shirabe_semver::constraint::SimpleConstraint; @@ -84,16 +85,9 @@ impl InstalledRepository { continue; } - let provides = candidate.get_provides(); - let replaces = candidate.get_replaces(); - let mut provides_and_replaces: Vec<&Link> = vec![]; - for link in provides.values() { - provides_and_replaces.push(link); - } - for link in replaces.values() { - provides_and_replaces.push(link); - } - for link in provides_and_replaces { + let provides_and_replaces = + array_merge_map(candidate.get_provides(), candidate.get_replaces()); + for link in provides_and_replaces.values() { if name == link.get_target() && (constraint.is_none() || constraint.as_ref().unwrap().matches(link.get_constraint())) @@ -313,11 +307,8 @@ impl InstalledRepository { .into(); if link.get_target() != pkg.get_name().as_str() { - let mut replaces_and_provides: IndexMap = - pkg.get_replaces(); - for (k, v) in pkg.get_provides() { - replaces_and_provides.entry(k).or_insert(v); - } + let replaces_and_provides = + array_merge_map(pkg.get_replaces(), pkg.get_provides()); for prov in replaces_and_provides.values() { if link.get_target() == prov.get_target() { version = prov.get_constraint().clone(); -- cgit v1.3.1