aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/installer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/installer.rs')
-rw-r--r--crates/shirabe/src/installer.rs111
1 files changed, 61 insertions, 50 deletions
diff --git a/crates/shirabe/src/installer.rs b/crates/shirabe/src/installer.rs
index 1ae8e11..b770b48 100644
--- a/crates/shirabe/src/installer.rs
+++ b/crates/shirabe/src/installer.rs
@@ -144,7 +144,8 @@ pub struct Installer {
pub(crate) update_mirrors: bool,
pub(crate) update_allow_list: Option<Vec<String>>,
pub(crate) update_allow_transitive_dependencies: i64,
- pub(crate) suggested_packages_reporter: SuggestedPackagesReporter,
+ pub(crate) suggested_packages_reporter:
+ std::rc::Rc<std::cell::RefCell<SuggestedPackagesReporter>>,
pub(crate) platform_requirement_filter: std::rc::Rc<dyn PlatformRequirementFilterInterface>,
pub(crate) additional_fixed_repository: Option<crate::repository::RepositoryInterfaceHandle>,
pub(crate) temporary_constraints: IndexMap<String, AnyConstraint>,
@@ -172,7 +173,9 @@ impl Installer {
event_dispatcher: std::rc::Rc<std::cell::RefCell<EventDispatcher>>,
autoload_generator: std::rc::Rc<std::cell::RefCell<AutoloadGenerator>>,
) -> Self {
- let suggested_packages_reporter = SuggestedPackagesReporter::new(io.clone());
+ let suggested_packages_reporter = std::rc::Rc::new(std::cell::RefCell::new(
+ SuggestedPackagesReporter::new(io.clone()),
+ ));
let platform_requirement_filter = PlatformRequirementFilterFactory::ignore_nothing();
let write_lock = config.borrow_mut().get("lock").as_bool().unwrap_or(false);
@@ -357,9 +360,11 @@ impl Installer {
]);
if is_fresh_install {
self.suggested_packages_reporter
+ .borrow_mut()
.add_suggestions_from_package(self.package.clone().into());
}
self.suggested_packages_reporter
+ .borrow()
.output_minimalistic(Some(&mut installed_repo), None)?;
}
@@ -488,7 +493,7 @@ impl Installer {
gc_enable();
}
- let audit_config = self.get_audit_config()?;
+ let audit_config = self.get_audit_config()?.clone();
if audit_config.audit {
let (packages, target) = if self.update && !self.install {
@@ -521,12 +526,18 @@ impl Installer {
repo_set.add_repository(repo.clone())?;
}
- // TODO(phase-b): Auditor::audit takes owned packages/ignore lists; need cloning
- // strategy. PHP shares these (copy semantics for arrays). Cloning for now is
- // safe because arrays use copy semantics, but trait objects (packages) cannot
- // be cloned trivially.
- let audit_result: anyhow::Result<i64> = todo!();
- let _ = (&auditor, &repo_set, &packages, &audit_config);
+ let audit_result = auditor.audit(
+ &mut *self.io.borrow_mut(),
+ &repo_set,
+ packages,
+ &audit_config.audit_format,
+ true,
+ audit_config.ignore_list_for_audit.clone(),
+ &audit_config.audit_abandoned,
+ audit_config.ignore_severity_for_audit.clone(),
+ audit_config.ignore_unreachable,
+ audit_config.ignore_abandoned_for_audit.clone(),
+ );
match audit_result {
Ok(n) => {
return Ok(if n > 0 && self.error_on_audit {
@@ -646,21 +657,21 @@ impl Installer {
let _ = allow_list;
}
- // TODO(phase-b): create_pool takes owned Request, std::rc::Rc<std::cell::RefCell<dyn IOInterface>>, Option<Rc<...>>
- // but locally we only have refs. PHP classes (IO, dispatcher) shouldn't Clone.
- let mut pool: Option<Pool> = {
- let _ = (&request, &self.event_dispatcher, &policy, &repository_set);
- todo!()
- };
+ let pool = std::rc::Rc::new(std::cell::RefCell::new(repository_set.create_pool(
+ &mut request,
+ self.io.clone(),
+ Some(self.event_dispatcher.clone()),
+ self.create_pool_optimizer(policy.clone()),
+ self.ignored_types.clone(),
+ self.allowed_types.clone(),
+ self.create_security_audit_pool_filter()?,
+ )?));
self.io.write_error("<info>Updating dependencies</info>");
// solve dependencies
- // TODO(phase-b): Solver::new takes owned policy/pool/io; refactor needed
- let mut solver: Option<Solver> = {
- let _ = (&policy, pool.as_ref(), &self.io);
- todo!()
- };
+ let mut solver: Option<Solver> =
+ Some(Solver::new(policy.clone(), pool.clone(), self.io.clone()));
let mut lock_transaction: LockTransaction;
let rule_set_size;
match solver
@@ -676,7 +687,7 @@ impl Installer {
Err(e) => {
// TODO(phase-b): SolverProblemsException contains dyn Rule which isn't Send+Sync
// so anyhow::Error::downcast_ref can't extract it. Skipping detection.
- let _ = (&repository_set, &request, pool.as_ref());
+ let _ = (&repository_set, &request, &pool);
return Err(e);
}
}
@@ -685,7 +696,7 @@ impl Installer {
self.io.write_error3(
&format!(
"Analyzed {} packages to resolve dependencies",
- pool.as_ref().unwrap().get_packages().len()
+ pool.borrow().get_packages().len()
),
true,
io_interface::VERBOSE,
@@ -696,8 +707,7 @@ impl Installer {
io_interface::VERBOSE,
);
- pool = None;
- let _ = pool;
+ drop(pool);
if lock_transaction.get_operations().is_empty() {
self.io.write_error("Nothing to modify in lock file");
@@ -714,7 +724,7 @@ impl Installer {
&mut lock_transaction,
&platform_repo,
&aliases,
- &*policy,
+ policy.clone(),
locked_repository.as_ref(),
)?;
if exit_code != 0 {
@@ -837,6 +847,7 @@ impl Installer {
// collect suggestions
if let Some(io) = operation.as_install_operation() {
self.suggested_packages_reporter
+ .borrow_mut()
.add_suggestions_from_package(io.get_package());
}
@@ -919,7 +930,7 @@ impl Installer {
lock_transaction: &mut LockTransaction,
platform_repo: &PlatformRepositoryHandle,
aliases: &Vec<IndexMap<String, String>>,
- policy: &dyn PolicyInterface,
+ policy: std::rc::Rc<dyn PolicyInterface>,
locked_repository: Option<&crate::repository::LockArrayRepositoryHandle>,
) -> anyhow::Result<i64> {
if self.package.get_dev_requires().is_empty() {
@@ -946,13 +957,11 @@ impl Installer {
self.create_request(self.fixed_root_package.clone(), platform_repo, None)?;
self.require_packages_for_update(&mut request, locked_repository, false)?;
- let pool = repository_set.create_pool_with_all_packages()?;
+ let pool = std::rc::Rc::new(std::cell::RefCell::new(
+ repository_set.create_pool_with_all_packages()?,
+ ));
- // TODO(phase-b): Solver::new takes owned policy/pool/io; refactor needed
- let mut solver: Option<Solver> = {
- let _ = (policy, &pool, &self.io);
- todo!()
- };
+ let mut solver: Option<Solver> = Some(Solver::new(policy, pool.clone(), self.io.clone()));
let non_dev_lock_transaction: LockTransaction;
match solver
.as_mut()
@@ -1085,18 +1094,19 @@ impl Installer {
}
drop(root_requires);
- // TODO(phase-b): create_pool takes owned Request, std::rc::Rc<std::cell::RefCell<dyn IOInterface>>, Option<Rc<...>>
- let pool: Pool = {
- let _ = (&request, &self.io, &self.event_dispatcher, &repository_set);
- todo!()
- };
+ let pool = std::rc::Rc::new(std::cell::RefCell::new(repository_set.create_pool(
+ &mut request,
+ self.io.clone(),
+ Some(self.event_dispatcher.clone()),
+ None,
+ self.ignored_types.clone(),
+ self.allowed_types.clone(),
+ None,
+ )?));
// solve dependencies
- // TODO(phase-b): Solver::new takes owned policy/pool/io
- let mut solver: Option<Solver> = {
- let _ = (&policy, &pool, &self.io);
- todo!()
- };
+ let mut solver: Option<Solver> =
+ Some(Solver::new(policy, pool.clone(), self.io.clone()));
match solver
.as_mut()
.unwrap()
@@ -1136,13 +1146,14 @@ impl Installer {
.unwrap(),
)?
};
- // TODO(phase-b): dispatch_installer_event takes owned Transaction, not &LocalRepoTransaction
- // self.event_dispatcher.borrow_mut().dispatch_installer_event(
- // InstallerEvents::PRE_OPERATIONS_EXEC,
- // self.dev_mode,
- // self.execute_operations,
- // &local_repo_transaction,
- // );
+ self.event_dispatcher
+ .borrow_mut()
+ .dispatch_installer_event(
+ InstallerEvents::PRE_OPERATIONS_EXEC,
+ self.dev_mode,
+ self.execute_operations,
+ local_repo_transaction.to_transaction(),
+ )?;
let mut installs: Vec<String> = vec![];
let mut updates: Vec<String> = vec![];
@@ -1968,7 +1979,7 @@ impl Installer {
pub fn set_suggested_packages_reporter(
&mut self,
- suggested_packages_reporter: SuggestedPackagesReporter,
+ suggested_packages_reporter: std::rc::Rc<std::cell::RefCell<SuggestedPackagesReporter>>,
) -> &mut Self {
self.suggested_packages_reporter = suggested_packages_reporter;