aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-06 11:12:39 +0900
committernsfisis <nsfisis@gmail.com>2026-06-06 11:13:26 +0900
commit9f6f83c479985e882dbd086a8495bcd772c80b54 (patch)
treef5287fb3af16e9a04b8abc0010fb66e25dbe1937 /crates/shirabe/src/repository
parent8c5dba294fae26c8a46a308a46676e0afff217d6 (diff)
downloadphp-shirabe-9f6f83c479985e882dbd086a8495bcd772c80b54.tar.gz
php-shirabe-9f6f83c479985e882dbd086a8495bcd772c80b54.tar.zst
php-shirabe-9f6f83c479985e882dbd086a8495bcd772c80b54.zip
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 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository')
-rw-r--r--crates/shirabe/src/repository/installed_repository.rs21
1 files changed, 6 insertions, 15 deletions
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<String, Link> =
- 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();