aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver/transaction.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver/transaction.rs')
-rw-r--r--crates/shirabe/src/dependency_resolver/transaction.rs80
1 files changed, 28 insertions, 52 deletions
diff --git a/crates/shirabe/src/dependency_resolver/transaction.rs b/crates/shirabe/src/dependency_resolver/transaction.rs
index 07564ed0..4abe85d4 100644
--- a/crates/shirabe/src/dependency_resolver/transaction.rs
+++ b/crates/shirabe/src/dependency_resolver/transaction.rs
@@ -1,9 +1,9 @@
//! ref: composer/src/Composer/DependencyResolver/Transaction.php
+use crate::dependency_resolver::operation::AnyOperation;
use crate::dependency_resolver::operation::InstallOperation;
use crate::dependency_resolver::operation::MarkAliasInstalledOperation;
use crate::dependency_resolver::operation::MarkAliasUninstalledOperation;
-use crate::dependency_resolver::operation::OperationInterface;
use crate::dependency_resolver::operation::UninstallOperation;
use crate::dependency_resolver::operation::UpdateOperation;
use crate::package::AliasPackageHandle;
@@ -21,7 +21,7 @@ use shirabe_php_shim::{
#[derive(Debug, Clone)]
pub struct Transaction {
/// @var OperationInterface[]
- pub(crate) operations: Vec<std::rc::Rc<dyn OperationInterface>>,
+ pub(crate) operations: Vec<AnyOperation>,
/// Packages present at the beginning of the transaction
/// @var PackageInterface[]
@@ -64,7 +64,7 @@ impl Transaction {
this
}
- pub fn get_operations(&self) -> &Vec<std::rc::Rc<dyn OperationInterface>> {
+ pub fn get_operations(&self) -> &Vec<AnyOperation> {
&self.operations
}
@@ -108,8 +108,8 @@ impl Transaction {
}
/// @return OperationInterface[]
- pub(crate) fn calculate_operations(&mut self) -> Vec<std::rc::Rc<dyn OperationInterface>> {
- let mut operations: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ pub(crate) fn calculate_operations(&mut self) -> Vec<AnyOperation> {
+ let mut operations: Vec<AnyOperation> = vec![];
let mut present_package_map: IndexMap<String, PackageInterfaceHandle> = IndexMap::new();
let mut remove_map: IndexMap<String, PackageInterfaceHandle> = IndexMap::new();
@@ -163,7 +163,7 @@ impl Transaction {
if present_alias_map.contains(&alias_key) {
remove_alias_map.shift_remove(&alias_key);
} else {
- operations.push(std::rc::Rc::new(MarkAliasInstalledOperation::new(alias)));
+ operations.push(MarkAliasInstalledOperation::new(alias).into());
}
} else if let Some(source) = present_package_map.get(&package.get_name()).cloned() {
// do we need to update?
@@ -187,14 +187,12 @@ impl Transaction {
|| package.get_source_reference() != present.get_source_reference()
|| abandoned_or_replacement_changed
{
- operations.push(std::rc::Rc::new(UpdateOperation::new(
- source.clone(),
- package.clone(),
- )));
+ operations
+ .push(UpdateOperation::new(source.clone(), package.clone()).into());
}
remove_map.shift_remove(&package.get_name());
} else {
- operations.push(std::rc::Rc::new(InstallOperation::new(package.clone())));
+ operations.push(InstallOperation::new(package.clone()).into());
remove_map.shift_remove(&package.get_name());
}
}
@@ -202,16 +200,10 @@ impl Transaction {
for (_name, package) in remove_map {
// PHP: array_unshift($operations, new Operation\UninstallOperation($package));
- array_unshift(
- &mut operations,
- std::rc::Rc::new(UninstallOperation::new(package))
- as std::rc::Rc<dyn OperationInterface>,
- );
+ array_unshift(&mut operations, UninstallOperation::new(package).into());
}
for (_name_version, package) in remove_alias_map {
- operations.push(std::rc::Rc::new(MarkAliasUninstalledOperation::new(
- package,
- )));
+ operations.push(MarkAliasUninstalledOperation::new(package).into());
}
let operations = self.move_plugins_to_front(operations);
@@ -279,29 +271,22 @@ impl Transaction {
///
/// @param OperationInterface[] $operations
/// @return OperationInterface[] reordered operation list
- fn move_plugins_to_front(
- &self,
- mut operations: Vec<std::rc::Rc<dyn OperationInterface>>,
- ) -> Vec<std::rc::Rc<dyn OperationInterface>> {
- let mut dl_modifying_plugins_no_deps: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
- let mut dl_modifying_plugins_with_deps: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ fn move_plugins_to_front(&self, mut operations: Vec<AnyOperation>) -> Vec<AnyOperation> {
+ let mut dl_modifying_plugins_no_deps: Vec<AnyOperation> = vec![];
+ let mut dl_modifying_plugins_with_deps: Vec<AnyOperation> = vec![];
let mut dl_modifying_plugin_requires: Vec<String> = vec![];
- let mut plugins_no_deps: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
- let mut plugins_with_deps: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ let mut plugins_no_deps: Vec<AnyOperation> = vec![];
+ let mut plugins_with_deps: Vec<AnyOperation> = vec![];
let mut plugin_requires: Vec<String> = vec![];
let mut to_remove: Vec<usize> = vec![];
for idx in (0..operations.len()).rev() {
let op = &operations[idx];
- let package: PackageInterfaceHandle = if let Some(install_op) =
- op.as_ref().as_any().downcast_ref::<InstallOperation>()
- {
- install_op.get_package().clone()
- } else if let Some(update_op) = op.as_ref().as_any().downcast_ref::<UpdateOperation>() {
- update_op.get_target_package().clone()
- } else {
- continue;
+ let package: PackageInterfaceHandle = match op {
+ AnyOperation::Install(install_op) => install_op.get_package(),
+ AnyOperation::Update(update_op) => update_op.get_target_package(),
+ _ => continue,
};
let extra = package.get_extra();
@@ -373,7 +358,7 @@ impl Transaction {
}
// PHP: array_merge($dlModifyingPluginsNoDeps, $dlModifyingPluginsWithDeps, $pluginsNoDeps, $pluginsWithDeps, $operations)
- let mut result: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ let mut result: Vec<AnyOperation> = vec![];
result.extend(dl_modifying_plugins_no_deps);
result.extend(dl_modifying_plugins_with_deps);
result.extend(plugins_no_deps);
@@ -387,23 +372,14 @@ impl Transaction {
///
/// @param OperationInterface[] $operations
/// @return OperationInterface[] reordered operation list
- fn move_uninstalls_to_front(
- &self,
- mut operations: Vec<std::rc::Rc<dyn OperationInterface>>,
- ) -> Vec<std::rc::Rc<dyn OperationInterface>> {
- let mut uninst_ops: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ fn move_uninstalls_to_front(&self, mut operations: Vec<AnyOperation>) -> Vec<AnyOperation> {
+ let mut uninst_ops: Vec<AnyOperation> = vec![];
let mut to_remove: Vec<usize> = vec![];
for (idx, op) in operations.iter().enumerate() {
- let is_uninstall = op
- .as_ref()
- .as_any()
- .downcast_ref::<UninstallOperation>()
- .is_some()
- || op
- .as_ref()
- .as_any()
- .downcast_ref::<MarkAliasUninstalledOperation>()
- .is_some();
+ let is_uninstall = matches!(
+ op,
+ AnyOperation::Uninstall(_) | AnyOperation::MarkAliasUninstalled(_)
+ );
if is_uninstall {
uninst_ops.push(op.clone());
to_remove.push(idx);
@@ -415,7 +391,7 @@ impl Transaction {
operations.remove(idx);
}
- let mut result: Vec<std::rc::Rc<dyn OperationInterface>> = vec![];
+ let mut result: Vec<AnyOperation> = vec![];
result.extend(uninst_ops);
result.extend(operations);
result