diff options
Diffstat (limited to 'crates/shirabe')
| -rw-r--r-- | crates/shirabe/src/package/base_package.rs | 5 | ||||
| -rw-r--r-- | crates/shirabe/src/package/handle.rs | 46 |
2 files changed, 38 insertions, 13 deletions
diff --git a/crates/shirabe/src/package/base_package.rs b/crates/shirabe/src/package/base_package.rs index 04b4ea0..44e4101 100644 --- a/crates/shirabe/src/package/base_package.rs +++ b/crates/shirabe/src/package/base_package.rs @@ -130,11 +130,6 @@ pub trait BasePackage: PackageInterface + std::fmt::Display { .get(self.get_stability()) .unwrap_or(&STABILITY_STABLE) } - - fn php_clone(&mut self) { - self.take_repository(); - *self.id_mut() = -1; - } } pub fn package_name_to_regexp(allow_pattern: &str) -> String { diff --git a/crates/shirabe/src/package/handle.rs b/crates/shirabe/src/package/handle.rs index d11b20e..c1db49c 100644 --- a/crates/shirabe/src/package/handle.rs +++ b/crates/shirabe/src/package/handle.rs @@ -4,8 +4,8 @@ //! `alias_of` references are acyclic. use crate::package::{ - AliasPackage, CompleteAliasPackage, CompletePackage, CompletePackageInterface, Package, - PackageInterface, RootAliasPackage, RootPackage, RootPackageInterface, + AliasPackage, BasePackage, CompleteAliasPackage, CompletePackage, CompletePackageInterface, + Package, PackageInterface, RootAliasPackage, RootPackage, RootPackageInterface, }; use std::cell::RefCell; use std::rc::Rc; @@ -152,16 +152,44 @@ impl AnyPackage { /// clone for most types (scalars/arrays are copied, nested object /// references — including `aliasOf` on alias variants — are shared), /// except for RootAliasPackage where PHP's `__clone` hook explicitly - /// reseats `aliasOf` to a fresh clone. + /// reseats `aliasOf` to a fresh clone. PHP's `BasePackage::__clone()` + /// additionally resets `repository` to null and `id` to -1 on every + /// variant; that reset is inlined below via `take_repository()`/`id_mut()`. pub fn dup(&self) -> Self { match self { - Self::Package(p) => Self::Package(p.clone()), - Self::CompletePackage(p) => Self::CompletePackage(p.clone()), - Self::RootPackage(p) => Self::RootPackage(p.clone()), - Self::AliasPackage(p) => Self::AliasPackage(p.clone()), - Self::CompleteAliasPackage(p) => Self::CompleteAliasPackage(p.clone()), + Self::Package(p) => { + let mut p = p.clone(); + p.take_repository(); + *p.id_mut() = -1; + Self::Package(p) + } + Self::CompletePackage(p) => { + let mut p = p.clone(); + p.inner.take_repository(); + *p.inner.id_mut() = -1; + Self::CompletePackage(p) + } + Self::RootPackage(p) => { + let mut p = p.clone(); + p.inner.inner.take_repository(); + *p.inner.inner.id_mut() = -1; + Self::RootPackage(p) + } + Self::AliasPackage(p) => { + let mut p = p.clone(); + p.take_repository(); + *p.id_mut() = -1; + Self::AliasPackage(p) + } + Self::CompleteAliasPackage(p) => { + let mut p = p.clone(); + p.inner.take_repository(); + *p.inner.id_mut() = -1; + Self::CompleteAliasPackage(p) + } Self::RootAliasPackage(p) => { // PHP's RootAliasPackage overrides `__clone()`: + // parent::__clone(); // $this->aliasOf = clone $this->aliasOf; let new_alias_of_inner = p.alias_of.0.borrow().dup(); let new_alias_of_rc = Rc::new(RefCell::new(new_alias_of_inner)); @@ -173,6 +201,8 @@ impl AnyPackage { cloned.alias_of = new_root; cloned.inner.alias_of = new_complete; cloned.inner.inner.alias_of = new_pkg; + cloned.inner.inner.take_repository(); + *cloned.inner.inner.id_mut() = -1; Self::RootAliasPackage(cloned) } } |
