aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/installer
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/installer')
-rw-r--r--crates/shirabe/src/installer/binary_presence_interface.rs2
-rw-r--r--crates/shirabe/src/installer/installation_manager.rs169
-rw-r--r--crates/shirabe/src/installer/installer_interface.rs20
-rw-r--r--crates/shirabe/src/installer/library_installer.rs48
-rw-r--r--crates/shirabe/src/installer/metapackage_installer.rs16
-rw-r--r--crates/shirabe/src/installer/noop_installer.rs16
-rw-r--r--crates/shirabe/src/installer/plugin_installer.rs26
-rw-r--r--crates/shirabe/src/installer/project_installer.rs16
8 files changed, 176 insertions, 137 deletions
diff --git a/crates/shirabe/src/installer/binary_presence_interface.rs b/crates/shirabe/src/installer/binary_presence_interface.rs
index 8bc3ff90..2c4b2cc4 100644
--- a/crates/shirabe/src/installer/binary_presence_interface.rs
+++ b/crates/shirabe/src/installer/binary_presence_interface.rs
@@ -3,5 +3,5 @@
use crate::package::PackageInterfaceHandle;
pub trait BinaryPresenceInterface {
- fn ensure_binaries_presence(&mut self, package: PackageInterfaceHandle);
+ fn ensure_binaries_presence(&self, package: PackageInterfaceHandle);
}
diff --git a/crates/shirabe/src/installer/installation_manager.rs b/crates/shirabe/src/installer/installation_manager.rs
index a3e429b1..df8384c4 100644
--- a/crates/shirabe/src/installer/installation_manager.rs
+++ b/crates/shirabe/src/installer/installation_manager.rs
@@ -29,11 +29,13 @@ use shirabe_php_shim::{
/// Package operation manager.
#[derive(Debug)]
pub struct InstallationManager {
- installers: Vec<Box<dyn InstallerInterface>>,
+ /// Rc rather than Box so `get_installer` can hand out shareable handles: the download/cleanup
+ /// futures collected for Loop::wait must own their installer beyond the loop iteration that
+ /// created them (PHP closures capture $installer the same way).
+ installers: Vec<std::rc::Rc<dyn InstallerInterface>>,
/// Maps a package type to the index of its installer in `installers`. PHP caches the installer
- /// instance itself; here we store an index instead to avoid sharing ownership of the boxed
- /// installer. The index never dangles because both `add_installer` and `remove_installer`
- /// clear the cache whenever `installers` changes.
+ /// instance itself; here we store an index instead. The index never dangles because both
+ /// `add_installer` and `remove_installer` clear the cache whenever `installers` changes.
cache: IndexMap<String, usize>,
notifiable_packages: IndexMap<String, Vec<PackageInterfaceHandle>>,
loop_: std::rc::Rc<std::cell::RefCell<Loop>>,
@@ -125,7 +127,7 @@ impl InstallationManager {
/// Adds installer
pub fn add_installer(&mut self, installer: Box<dyn InstallerInterface>) {
- array_unshift(&mut self.installers, installer);
+ array_unshift(&mut self.installers, std::rc::Rc::from(installer));
self.cache = IndexMap::new();
}
@@ -135,7 +137,7 @@ impl InstallationManager {
let key = self
.installers
.iter()
- .position(|inst| inst.as_ref() as *const dyn InstallerInterface as *const () == target);
+ .position(|inst| &**inst as *const dyn InstallerInterface as *const () == target);
if let Some(k) = key {
array_splice(&mut self.installers, k as i64, Some(1), vec![]);
self.cache = IndexMap::new();
@@ -148,19 +150,22 @@ impl InstallationManager {
/// disabling the PluginManager. This ensures that no third-party
/// code is ever executed.
pub fn disable_plugins(&mut self) {
- for installer in self.installers.iter_mut() {
- if let Some(plugin_installer) = installer.as_plugin_installer_mut() {
+ for installer in self.installers.iter() {
+ if let Some(plugin_installer) = installer.as_plugin_installer() {
plugin_installer.disable_plugins();
}
}
}
/// Returns installer for a specific package type.
- pub fn get_installer(&mut self, r#type: &str) -> anyhow::Result<&mut dyn InstallerInterface> {
+ pub fn get_installer(
+ &mut self,
+ r#type: &str,
+ ) -> anyhow::Result<std::rc::Rc<dyn InstallerInterface>> {
let r#type = strtolower(r#type);
if let Some(&index) = self.cache.get(&r#type) {
- return Ok(self.installers[index].as_mut());
+ return Ok(self.installers[index].clone());
}
let index = self
@@ -169,7 +174,7 @@ impl InstallationManager {
.position(|installer| installer.supports(&r#type));
if let Some(index) = index {
self.cache.insert(r#type.clone(), index);
- return Ok(self.installers[index].as_mut());
+ return Ok(self.installers[index].clone());
}
Err(InvalidArgumentException {
@@ -416,17 +421,9 @@ impl InstallationManager {
download_only: bool,
all_operations: Vec<std::rc::Rc<dyn OperationInterface>>,
) -> anyhow::Result<()> {
- // PHP: waitOnPromises() shows a ProgressBar while the concurrent downloads resolve.
- // TODO(phase-c-promise): see the identical note in execute_batch — the single-threaded
- // port downloads serially in this same loop, so only a 0% -> 100% jump is rendered after
- // the loop instead of PHP's timing-driven intermediate snapshots.
- let download_promise_count = operations
- .values()
- .filter(|op| {
- let t = op.get_operation_type();
- t == "update" || t == "install"
- })
- .count() as i64;
+ let mut promises: Vec<
+ std::pin::Pin<Box<dyn std::future::Future<Output = anyhow::Result<()>>>>,
+ > = vec![];
for (index, operation) in &operations {
let op_type = operation.get_operation_type();
@@ -452,62 +449,58 @@ impl InstallationManager {
}
let installer = self.get_installer(&package.get_type())?;
- // PHP: $cleanupPromises[$index] = function () use ($index, $installer, $type, $package) {
+ // PHP: $cleanupPromises[$index] = static function () use ($opType, $installer, $package, $initialPackage) {
// if (null === $package->getInstallationSource()) { return \React\Promise\resolve(null); }
- // return $installer->cleanup($type, $package); };
- // TODO(phase-c): the cleanup callable must capture the installer and package and invoke
- // installer.cleanup(...) returning a React promise. It is a 'static closure stored in
- // cleanup_promises, so installer/package must be Rc-shared (the installer registry is
- // not Rc yet, see get_installer) and the promise type must be modelled. Both depend on
- // the async/React-Promise rework, so a no-op future is stored instead.
- let _ = installer;
- let op_type_clone = op_type.clone();
+ // return $installer->cleanup($opType, $package, $initialPackage); };
let cleanup: Box<
dyn Fn() -> Option<
std::pin::Pin<Box<dyn std::future::Future<Output = anyhow::Result<()>>>>,
>,
- > = Box::new(move || {
- // avoid calling cleanup if the download was not even initialized for a package
- // as without installation source configured nothing will work
- // TODO(phase-b): if (null === $package->getInstallationSource()) return resolve(null);
- let _ = &op_type_clone;
- // TODO(phase-c-promise): build the real installer.cleanup() future once the installer
- // can be shared into a 'static cleanup closure (Stage 2 Rc/Arc).
- let fut: std::pin::Pin<Box<dyn std::future::Future<Output = anyhow::Result<()>>>> =
- Box::pin(async { Ok(()) });
- Some(fut)
- });
+ > = {
+ let installer = installer.clone();
+ let op_type = op_type.clone();
+ let package = package.clone();
+ let initial_package = initial_package.clone();
+ Box::new(move || {
+ // avoid calling cleanup if the download was not even initialized for a package
+ // as without installation source configured nothing will work
+ if package.get_installation_source().is_none() {
+ let fut: std::pin::Pin<
+ Box<dyn std::future::Future<Output = anyhow::Result<()>>>,
+ > = Box::pin(async { Ok(()) });
+ return Some(fut);
+ }
+
+ let installer = installer.clone();
+ let op_type = op_type.clone();
+ let package = package.clone();
+ let initial_package = initial_package.clone();
+ let fut: std::pin::Pin<
+ Box<dyn std::future::Future<Output = anyhow::Result<()>>>,
+ > = Box::pin(async move {
+ installer
+ .cleanup(&op_type, package, initial_package)
+ .await
+ .map(|_| ())
+ });
+ Some(fut)
+ })
+ };
cleanup_promises.insert(*index, cleanup);
if op_type != "uninstall" {
- // TODO(phase-c-promise): PHP collects every download and runs them concurrently via
- // Loop::wait; the single-threaded loop awaits each serially instead.
- let installer = self.get_installer(&package.get_type())?;
- installer.download(package, initial_package).await?;
+ let installer = installer.clone();
+ let package = package.clone();
+ let initial_package = initial_package.clone();
+ promises.push(Box::pin(async move {
+ installer.download(package, initial_package).await.map(|_| ())
+ }));
}
}
- if self.output_progress
- && !Platform::get_env("CI").is_some_and(|v| !v.is_empty() && v != "0")
- && !self.io.is_debug()
- && download_promise_count > 1
- {
- let bar = {
- let io_ref = self.io.borrow();
- io_ref
- .as_any()
- .downcast_ref::<ConsoleIO>()
- .map(|console_io| console_io.get_progress_bar(download_promise_count))
- };
- if let Some(mut bar) = bar {
- bar.start(Some(download_promise_count))?;
- bar.set_progress(download_promise_count)?;
- bar.finish()?;
- bar.clear()?;
- if !self.io.is_decorated() {
- self.io.write_error("");
- }
- }
+ // execute all downloads first
+ if !promises.is_empty() {
+ self.wait_on_promises(promises).await?;
}
if download_only {
@@ -1012,6 +1005,48 @@ impl InstallationManager {
}
}
+ /// PHP: waitOnPromises() creates a ProgressBar up front and Loop::wait advances it while the
+ /// concurrent promises resolve.
+ /// TODO(phase-c-promise): Loop::wait has no active-job counter to feed the bar yet, so a
+ /// single 0% -> 100% jump is rendered after the wait instead of PHP's timing-driven
+ /// intermediate snapshots.
+ async fn wait_on_promises(
+ &mut self,
+ promises: Vec<
+ std::pin::Pin<Box<dyn std::future::Future<Output = anyhow::Result<()>>>>,
+ >,
+ ) -> anyhow::Result<()> {
+ let promise_count = promises.len() as i64;
+ let show_progress = self.output_progress
+ && !Platform::get_env("CI").is_some_and(|v| !v.is_empty() && v != "0")
+ && !self.io.is_debug()
+ && promise_count > 1;
+
+ let result = self.loop_.borrow_mut().wait(promises, None).await;
+
+ if result.is_ok() && show_progress {
+ let bar = {
+ let io_ref = self.io.borrow();
+ io_ref
+ .as_any()
+ .downcast_ref::<ConsoleIO>()
+ .map(|console_io| console_io.get_progress_bar(promise_count))
+ };
+ if let Some(mut bar) = bar {
+ bar.start(Some(promise_count))?;
+ bar.set_progress(promise_count)?;
+ bar.finish()?;
+ bar.clear()?;
+ // ProgressBar in non-decorated output does not output a final line-break and clear() does nothing
+ if !self.io.is_decorated() {
+ self.io.write_error("");
+ }
+ }
+ }
+
+ result
+ }
+
async fn run_cleanup(
&mut self,
cleanup_promises: &IndexMap<
diff --git a/crates/shirabe/src/installer/installer_interface.rs b/crates/shirabe/src/installer/installer_interface.rs
index ff7708f1..3394f1e3 100644
--- a/crates/shirabe/src/installer/installer_interface.rs
+++ b/crates/shirabe/src/installer/installer_interface.rs
@@ -11,57 +11,57 @@ pub trait InstallerInterface: std::fmt::Debug {
fn supports(&self, package_type: &str) -> bool;
fn is_installed(
- &mut self,
+ &self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool;
async fn download(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>>;
async fn prepare(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>>;
async fn install(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>>;
async fn update(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>>;
async fn uninstall(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>>;
async fn cleanup(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>>;
- fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String>;
+ fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String>;
- fn as_binary_presence_interface(&mut self) -> Option<&mut dyn BinaryPresenceInterface> {
+ fn as_binary_presence_interface(&self) -> Option<&dyn BinaryPresenceInterface> {
None
}
- fn as_plugin_installer_mut(&mut self) -> Option<&mut PluginInstaller> {
+ fn as_plugin_installer(&self) -> Option<&PluginInstaller> {
None
}
}
diff --git a/crates/shirabe/src/installer/library_installer.rs b/crates/shirabe/src/installer/library_installer.rs
index c3ebad16..5baffc15 100644
--- a/crates/shirabe/src/installer/library_installer.rs
+++ b/crates/shirabe/src/installer/library_installer.rs
@@ -22,7 +22,9 @@ use shirabe_php_shim::{
#[derive(Debug)]
pub struct LibraryInstaller {
pub(crate) composer: PartialComposerWeakHandle,
- pub(crate) vendor_dir: String,
+ /// Behind a RefCell so initialize_vendor_dir can canonicalize it through `&self` (the
+ /// installer instance is shared between concurrent package operations).
+ pub(crate) vendor_dir: std::cell::RefCell<String>,
pub(crate) download_manager:
Option<std::rc::Rc<std::cell::RefCell<dyn DownloadManagerInterface>>>,
pub(crate) io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
@@ -93,7 +95,7 @@ impl LibraryInstaller {
io,
r#type,
filesystem,
- vendor_dir,
+ vendor_dir: std::cell::RefCell::new(vendor_dir),
binary_installer,
}
}
@@ -108,7 +110,7 @@ impl LibraryInstaller {
}
/// Make sure binaries are installed for a given package.
- pub fn ensure_binaries_presence(&mut self, package: PackageInterfaceHandle) {
+ pub fn ensure_binaries_presence(&self, package: PackageInterfaceHandle) {
let install_path = self.get_install_path(package.clone()).unwrap();
self.binary_installer
.borrow_mut()
@@ -119,7 +121,7 @@ impl LibraryInstaller {
///
/// It is used for BC as getInstallPath tends to be overridden by
/// installer plugins but not getPackageBasePath
- pub(crate) fn get_package_base_path(&mut self, package: PackageInterfaceHandle) -> String {
+ pub(crate) fn get_package_base_path(&self, package: PackageInterfaceHandle) -> String {
let install_path = self.get_install_path(package.clone()).unwrap();
let target_dir = package.get_target_dir();
@@ -143,7 +145,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn install_code(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
let download_path = self.get_install_path(package.clone()).unwrap();
@@ -157,7 +159,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn update_code(
- &mut self,
+ &self,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -188,7 +190,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn remove_code(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
let download_path = self.get_package_base_path(package.clone());
@@ -199,11 +201,12 @@ impl LibraryInstaller {
.await
}
- pub(crate) fn initialize_vendor_dir(&mut self) {
+ pub(crate) fn initialize_vendor_dir(&self) {
self.filesystem
.borrow_mut()
- .ensure_directory_exists(&self.vendor_dir);
- self.vendor_dir = realpath(&self.vendor_dir).unwrap_or_default();
+ .ensure_directory_exists(&self.vendor_dir.borrow());
+ let realpath = realpath(&self.vendor_dir.borrow()).unwrap_or_default();
+ *self.vendor_dir.borrow_mut() = realpath;
}
pub(crate) fn get_download_manager(
@@ -237,7 +240,7 @@ impl InstallerInterface for LibraryInstaller {
}
fn is_installed(
- &mut self,
+ &self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -267,7 +270,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn download(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -281,7 +284,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn prepare(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -296,7 +299,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn cleanup(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -311,7 +314,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn install(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -339,7 +342,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn update(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
@@ -372,7 +375,7 @@ impl InstallerInterface for LibraryInstaller {
}
async fn uninstall(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -407,13 +410,14 @@ impl InstallerInterface for LibraryInstaller {
Ok(None)
}
- fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
self.initialize_vendor_dir();
+ let vendor_dir = self.vendor_dir.borrow();
let base_path = format!(
"{}{}",
- if !self.vendor_dir.is_empty() {
- format!("{}/", self.vendor_dir)
+ if !vendor_dir.is_empty() {
+ format!("{}/", vendor_dir)
} else {
String::new()
},
@@ -432,13 +436,13 @@ impl InstallerInterface for LibraryInstaller {
})
}
- fn as_binary_presence_interface(&mut self) -> Option<&mut dyn BinaryPresenceInterface> {
+ fn as_binary_presence_interface(&self) -> Option<&dyn BinaryPresenceInterface> {
Some(self)
}
}
impl BinaryPresenceInterface for LibraryInstaller {
- fn ensure_binaries_presence(&mut self, package: PackageInterfaceHandle) {
+ fn ensure_binaries_presence(&self, package: PackageInterfaceHandle) {
LibraryInstaller::ensure_binaries_presence(self, package);
}
}
diff --git a/crates/shirabe/src/installer/metapackage_installer.rs b/crates/shirabe/src/installer/metapackage_installer.rs
index ae1f49bb..22abdab7 100644
--- a/crates/shirabe/src/installer/metapackage_installer.rs
+++ b/crates/shirabe/src/installer/metapackage_installer.rs
@@ -29,7 +29,7 @@ impl InstallerInterface for MetapackageInstaller {
}
fn is_installed(
- &mut self,
+ &self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -37,7 +37,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn download(
- &mut self,
+ &self,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -45,7 +45,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn prepare(
- &mut self,
+ &self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -54,7 +54,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn cleanup(
- &mut self,
+ &self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -63,7 +63,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn install(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -79,7 +79,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn update(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
@@ -108,7 +108,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn uninstall(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -131,7 +131,7 @@ impl InstallerInterface for MetapackageInstaller {
Ok(None)
}
- fn get_install_path(&mut self, _package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&self, _package: PackageInterfaceHandle) -> Option<String> {
None
}
}
diff --git a/crates/shirabe/src/installer/noop_installer.rs b/crates/shirabe/src/installer/noop_installer.rs
index 9b8aa087..62e5de78 100644
--- a/crates/shirabe/src/installer/noop_installer.rs
+++ b/crates/shirabe/src/installer/noop_installer.rs
@@ -15,7 +15,7 @@ impl InstallerInterface for NoopInstaller {
}
fn is_installed(
- &mut self,
+ &self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -23,7 +23,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn download(
- &mut self,
+ &self,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -31,7 +31,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn prepare(
- &mut self,
+ &self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -40,7 +40,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn cleanup(
- &mut self,
+ &self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -49,7 +49,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn install(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -61,7 +61,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn update(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
@@ -83,7 +83,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn uninstall(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -99,7 +99,7 @@ impl InstallerInterface for NoopInstaller {
Ok(None)
}
- fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
let target_dir = package.get_target_dir();
let pretty_name = package.get_pretty_name();
diff --git a/crates/shirabe/src/installer/plugin_installer.rs b/crates/shirabe/src/installer/plugin_installer.rs
index 7ff5eb33..ca8864ab 100644
--- a/crates/shirabe/src/installer/plugin_installer.rs
+++ b/crates/shirabe/src/installer/plugin_installer.rs
@@ -38,13 +38,13 @@ impl PluginInstaller {
}
}
- pub fn disable_plugins(&mut self) {
+ pub fn disable_plugins(&self) {
// TODO(plugin): disable plugins via plugin manager
self.get_plugin_manager().borrow_mut().disable_plugins();
}
async fn rollback_install(
- &mut self,
+ &self,
e: anyhow::Error,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
@@ -78,7 +78,7 @@ impl InstallerInterface for PluginInstaller {
}
fn is_installed(
- &mut self,
+ &self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -86,7 +86,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn prepare(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -114,7 +114,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn download(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -134,7 +134,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn install(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -148,7 +148,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn update(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
@@ -164,7 +164,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn uninstall(
- &mut self,
+ &self,
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -177,7 +177,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn cleanup(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -185,15 +185,15 @@ impl InstallerInterface for PluginInstaller {
self.inner.cleanup(r#type, package, prev_package).await
}
- fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
self.inner.get_install_path(package)
}
- fn as_binary_presence_interface(&mut self) -> Option<&mut dyn BinaryPresenceInterface> {
- Some(&mut self.inner)
+ fn as_binary_presence_interface(&self) -> Option<&dyn BinaryPresenceInterface> {
+ Some(&self.inner)
}
- fn as_plugin_installer_mut(&mut self) -> Option<&mut PluginInstaller> {
+ fn as_plugin_installer(&self) -> Option<&PluginInstaller> {
Some(self)
}
}
diff --git a/crates/shirabe/src/installer/project_installer.rs b/crates/shirabe/src/installer/project_installer.rs
index 83ffbb24..0ca251c2 100644
--- a/crates/shirabe/src/installer/project_installer.rs
+++ b/crates/shirabe/src/installer/project_installer.rs
@@ -36,7 +36,7 @@ impl InstallerInterface for ProjectInstaller {
}
fn is_installed(
- &mut self,
+ &self,
_repo: &dyn InstalledRepositoryInterface,
_package: PackageInterfaceHandle,
) -> bool {
@@ -44,7 +44,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn download(
- &mut self,
+ &self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -69,7 +69,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn prepare(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -81,7 +81,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn cleanup(
- &mut self,
+ &self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -93,7 +93,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn install(
- &mut self,
+ &self,
_repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -104,7 +104,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn update(
- &mut self,
+ &self,
_repo: &mut dyn InstalledRepositoryInterface,
_initial: PackageInterfaceHandle,
_target: PackageInterfaceHandle,
@@ -117,7 +117,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn uninstall(
- &mut self,
+ &self,
_repo: &mut dyn InstalledRepositoryInterface,
_package: PackageInterfaceHandle,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -128,7 +128,7 @@ impl InstallerInterface for ProjectInstaller {
.into())
}
- fn get_install_path(&mut self, _package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&self, _package: PackageInterfaceHandle) -> Option<String> {
Some(self.install_path.clone())
}
}