diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-06 11:12:39 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-06 11:13:26 +0900 |
| commit | 9f6f83c479985e882dbd086a8495bcd772c80b54 (patch) | |
| tree | f5287fb3af16e9a04b8abc0010fb66e25dbe1937 /crates/shirabe/src/repository/installed_repository.rs | |
| parent | 8c5dba294fae26c8a46a308a46676e0afff217d6 (diff) | |
| download | php-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/installed_repository.rs')
| -rw-r--r-- | crates/shirabe/src/repository/installed_repository.rs | 21 |
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(); |
