aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/installer/plugin_installer.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-07-18 18:16:07 +0900
committernsfisis <nsfisis@gmail.com>2026-07-18 18:16:07 +0900
commit307e66847dd5e00ad1890b6a64d3ac7192a03efc (patch)
treebdd4657d350a886d7d28dcb5187395771c99943b /crates/shirabe/src/installer/plugin_installer.rs
parent9b291d454b059977639db26c847af4e835cda0c3 (diff)
downloadphp-shirabe-307e66847dd5e00ad1890b6a64d3ac7192a03efc.tar.gz
php-shirabe-307e66847dd5e00ad1890b6a64d3ac7192a03efc.tar.zst
php-shirabe-307e66847dd5e00ad1890b6a64d3ac7192a03efc.zip
perf(installation-manager): fan out package downloads via Loop::wait
InstallationManager::downloadAndExecuteBatch now matches PHP: every update/install operation's installer->download() promise is collected and driven concurrently through waitOnPromises()/Loop::wait instead of being awaited one package at a time. Concurrency caps stay where PHP puts them (HttpDownloader 12, ProcessExecutor 10 via their semaphores). Error semantics follow PHP too: all downloads settle before the first rejection is rethrown, rather than aborting on the first failure. To let the collected futures and the cleanup closures own their installer beyond the loop iteration that created them, the installer registry becomes Vec<Rc<dyn InstallerInterface>> and get_installer hands out clones (PHP closures capture $installer the same way), with InstallerInterface methods taking &self across the six implementors — the only genuinely mutable state was LibraryInstaller.vendor_dir (canonicalized in place), now behind a RefCell. as_plugin_installer_mut/as_binary_presence_interface lose their &mut. The cleanup_promises entries are now the real thing: the PHP closure including the getInstallationSource() guard and the installer->cleanup($opType, $package, $initialPackage) call, replacing the no-op futures (drops one TODO(phase-b) and two TODO(phase-c)). Verified against the real network: create-project laravel/laravel produces a vendor tree byte-identical to real Composer's (diff -rq clean across all 109 packages including vendor/composer). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/installer/plugin_installer.rs')
-rw-r--r--crates/shirabe/src/installer/plugin_installer.rs26
1 files changed, 13 insertions, 13 deletions
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)
}
}