aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src')
-rw-r--r--crates/shirabe/src/package/base_package.rs5
-rw-r--r--crates/shirabe/src/package/handle.rs46
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)
}
}