aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/installer
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-07 10:33:53 +0900
committernsfisis <nsfisis@gmail.com>2026-06-07 10:33:53 +0900
commit971824aa15334fd12d08ae0f441f6bf6079344c3 (patch)
treed59892042f478c65d980d96f62ef633644fd8fea /crates/shirabe/src/installer
parent0d45c403c20ac8950f2877a21f9cd4f0ca9bf784 (diff)
downloadphp-shirabe-971824aa15334fd12d08ae0f441f6bf6079344c3.tar.gz
php-shirabe-971824aa15334fd12d08ae0f441f6bf6079344c3.tar.zst
php-shirabe-971824aa15334fd12d08ae0f441f6bf6079344c3.zip
feat(shirabe): resolve phase-b TODOs with shared ownership
Replace TODO(phase-b) placeholders (todo!() and commented-out code) with real implementations: - Share JsonFile via Rc<RefCell<JsonFile>> so JsonConfigSource and the owning command can hold the same instance (base_config_command, config_command, repository_command, require_command, create_project, remove_command, factory) - Change InstallerInterface methods (is_installed, download, prepare, cleanup, get_install_path) to &mut self so initialize_vendor_dir can run, propagated to all installer implementations - Pass io/config/filesystem/process by clone instead of moving or stubbing (auth_helper, svn_driver, curl_downloader, library_installer) - Make TransportException Clone and store it by value in VcsRepository - Clone operations in Transaction sort, root_aliases/temporary_constraints in RepositorySet::create_pool, and share CompletePackage via handle in PlatformRepository - Wire up set_option, set_requires/set_dev_requires, installation manager setters, BumpCommand::set_composer, and clean_backups/set_local_phar
Diffstat (limited to 'crates/shirabe/src/installer')
-rw-r--r--crates/shirabe/src/installer/installer_interface.rs10
-rw-r--r--crates/shirabe/src/installer/library_installer.rs42
-rw-r--r--crates/shirabe/src/installer/metapackage_installer.rs10
-rw-r--r--crates/shirabe/src/installer/noop_installer.rs10
-rw-r--r--crates/shirabe/src/installer/plugin_installer.rs10
-rw-r--r--crates/shirabe/src/installer/project_installer.rs10
6 files changed, 42 insertions, 50 deletions
diff --git a/crates/shirabe/src/installer/installer_interface.rs b/crates/shirabe/src/installer/installer_interface.rs
index 20fdb2c..6df00c6 100644
--- a/crates/shirabe/src/installer/installer_interface.rs
+++ b/crates/shirabe/src/installer/installer_interface.rs
@@ -11,19 +11,19 @@ pub trait InstallerInterface: std::fmt::Debug {
fn supports(&self, package_type: &str) -> bool;
fn is_installed(
- &self,
+ &mut self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool;
async fn download(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>>;
async fn prepare(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -49,13 +49,13 @@ pub trait InstallerInterface: std::fmt::Debug {
) -> anyhow::Result<Option<PhpMixed>>;
async fn cleanup(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>>;
- fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String>;
+ fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String>;
fn as_binary_presence_interface(&mut self) -> Option<&mut dyn BinaryPresenceInterface> {
None
diff --git a/crates/shirabe/src/installer/library_installer.rs b/crates/shirabe/src/installer/library_installer.rs
index 58706d6..daf5e33 100644
--- a/crates/shirabe/src/installer/library_installer.rs
+++ b/crates/shirabe/src/installer/library_installer.rs
@@ -65,8 +65,7 @@ impl LibraryInstaller {
);
let binary_installer = binary_installer.unwrap_or_else(|| {
BinaryInstaller::new(
- // TODO(phase-b): pass io by reference/clone
- todo!("io reference"),
+ io.clone(),
rtrim(
&composer_ref
.get_config()
@@ -81,8 +80,7 @@ impl LibraryInstaller {
.borrow_mut()
.get_str("bin-compat")
.unwrap_or_default(),
- // TODO(phase-b): pass filesystem reference
- todo!("filesystem reference"),
+ Some(filesystem.clone()),
Some(vendor_dir.clone()),
)
});
@@ -109,7 +107,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(&self, package: PackageInterfaceHandle) -> String {
+ pub(crate) fn get_package_base_path(&mut self, package: PackageInterfaceHandle) -> String {
let install_path = self.get_install_path(package.clone()).unwrap();
let target_dir = package.get_target_dir();
@@ -133,7 +131,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn install_code(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
) -> Result<Option<PhpMixed>> {
let download_path = self.get_install_path(package.clone()).unwrap();
@@ -147,7 +145,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn update_code(
- &self,
+ &mut self,
initial: PackageInterfaceHandle,
target: PackageInterfaceHandle,
) -> Result<Option<PhpMixed>> {
@@ -178,7 +176,7 @@ impl LibraryInstaller {
/// @return PromiseInterface|null
/// @phpstan-return PromiseInterface<void|null>|null
pub(crate) async fn remove_code(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
) -> Result<Option<PhpMixed>> {
let download_path = self.get_package_base_path(package.clone());
@@ -226,7 +224,7 @@ impl InstallerInterface for LibraryInstaller {
}
fn is_installed(
- &self,
+ &mut self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -256,12 +254,11 @@ impl InstallerInterface for LibraryInstaller {
}
async fn download(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ self.initialize_vendor_dir();
let download_path = self.get_install_path(package.clone()).unwrap();
self.get_download_manager()
@@ -271,13 +268,12 @@ impl InstallerInterface for LibraryInstaller {
}
async fn prepare(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ self.initialize_vendor_dir();
let download_path = self.get_install_path(package.clone()).unwrap();
self.get_download_manager()
@@ -287,13 +283,12 @@ impl InstallerInterface for LibraryInstaller {
}
async fn cleanup(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ self.initialize_vendor_dir();
let download_path = self.get_install_path(package.clone()).unwrap();
self.get_download_manager()
@@ -307,8 +302,7 @@ impl InstallerInterface for LibraryInstaller {
repo: &mut dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> Result<Option<PhpMixed>> {
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ self.initialize_vendor_dir();
let download_path = self.get_install_path(package.clone()).unwrap();
// remove the binaries if it appears the package files are missing
@@ -342,8 +336,7 @@ impl InstallerInterface for LibraryInstaller {
.into());
}
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ self.initialize_vendor_dir();
self.binary_installer.remove_binaries(initial.clone());
let _ = self.update_code(initial.clone(), target.clone()).await?;
@@ -393,9 +386,8 @@ impl InstallerInterface for LibraryInstaller {
Ok(None)
}
- fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
- // TODO(phase-b): initialize_vendor_dir requires &mut self
- // self.initialize_vendor_dir();
+ fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String> {
+ self.initialize_vendor_dir();
let base_path = format!(
"{}{}",
diff --git a/crates/shirabe/src/installer/metapackage_installer.rs b/crates/shirabe/src/installer/metapackage_installer.rs
index 0c67e9a..cebec2c 100644
--- a/crates/shirabe/src/installer/metapackage_installer.rs
+++ b/crates/shirabe/src/installer/metapackage_installer.rs
@@ -30,7 +30,7 @@ impl InstallerInterface for MetapackageInstaller {
}
fn is_installed(
- &self,
+ &mut self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -38,7 +38,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn download(
- &self,
+ &mut self,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
@@ -46,7 +46,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn prepare(
- &self,
+ &mut self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -55,7 +55,7 @@ impl InstallerInterface for MetapackageInstaller {
}
async fn cleanup(
- &self,
+ &mut self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -132,7 +132,7 @@ impl InstallerInterface for MetapackageInstaller {
Ok(None)
}
- fn get_install_path(&self, _package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&mut 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 3041e14..9b8aa08 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(
- &self,
+ &mut self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -23,7 +23,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn download(
- &self,
+ &mut self,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -31,7 +31,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn prepare(
- &self,
+ &mut self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -40,7 +40,7 @@ impl InstallerInterface for NoopInstaller {
}
async fn cleanup(
- &self,
+ &mut self,
_type: &str,
_package: PackageInterfaceHandle,
_prev_package: Option<PackageInterfaceHandle>,
@@ -99,7 +99,7 @@ impl InstallerInterface for NoopInstaller {
Ok(None)
}
- fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&mut 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 00b2210..23d7098 100644
--- a/crates/shirabe/src/installer/plugin_installer.rs
+++ b/crates/shirabe/src/installer/plugin_installer.rs
@@ -70,7 +70,7 @@ impl InstallerInterface for PluginInstaller {
}
fn is_installed(
- &self,
+ &mut self,
repo: &dyn InstalledRepositoryInterface,
package: PackageInterfaceHandle,
) -> bool {
@@ -78,7 +78,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn prepare(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -103,7 +103,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn download(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
@@ -166,7 +166,7 @@ impl InstallerInterface for PluginInstaller {
}
async fn cleanup(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -174,7 +174,7 @@ impl InstallerInterface for PluginInstaller {
self.inner.cleanup(r#type, package, prev_package).await
}
- fn get_install_path(&self, package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&mut self, package: PackageInterfaceHandle) -> Option<String> {
self.inner.get_install_path(package)
}
diff --git a/crates/shirabe/src/installer/project_installer.rs b/crates/shirabe/src/installer/project_installer.rs
index 6c8a279..351fd35 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(
- &self,
+ &mut self,
_repo: &dyn InstalledRepositoryInterface,
_package: PackageInterfaceHandle,
) -> bool {
@@ -44,7 +44,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn download(
- &self,
+ &mut self,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<Option<PhpMixed>> {
@@ -69,7 +69,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn prepare(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -81,7 +81,7 @@ impl InstallerInterface for ProjectInstaller {
}
async fn cleanup(
- &self,
+ &mut self,
r#type: &str,
package: PackageInterfaceHandle,
prev_package: Option<PackageInterfaceHandle>,
@@ -128,7 +128,7 @@ impl InstallerInterface for ProjectInstaller {
.into())
}
- fn get_install_path(&self, _package: PackageInterfaceHandle) -> Option<String> {
+ fn get_install_path(&mut self, _package: PackageInterfaceHandle) -> Option<String> {
Some(self.install_path.clone())
}
}