diff options
Diffstat (limited to 'crates/shirabe/src')
30 files changed, 400 insertions, 441 deletions
diff --git a/crates/shirabe/src/downloader/archive_downloader.rs b/crates/shirabe/src/downloader/archive_downloader.rs index 3346275..4842b05 100644 --- a/crates/shirabe/src/downloader/archive_downloader.rs +++ b/crates/shirabe/src/downloader/archive_downloader.rs @@ -2,7 +2,6 @@ use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::symfony::component::finder::Finder; use shirabe_php_shim::{ DIRECTORY_SEPARATOR, RuntimeException, bin2hex, file_exists, is_dir, random_bytes, realpath, @@ -20,32 +19,32 @@ pub trait ArchiveDownloader { fn cleanup_executed(&self) -> &IndexMap<String, bool>; fn cleanup_executed_mut(&mut self) -> &mut IndexMap<String, bool>; - fn extract( + async fn extract( &self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>>; + ) -> Result<Option<PhpMixed>>; - fn prepare( + async fn prepare( &mut self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.cleanup_executed_mut().remove(package.get_name()); self.inner_mut() .prepare(r#type, package, path, prev_package) } - fn cleanup( + async fn cleanup( &mut self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.cleanup_executed_mut() .insert(package.get_name().to_string(), true); self.inner_mut() @@ -56,12 +55,12 @@ pub trait ArchiveDownloader { /// /// @throws \RuntimeException /// @throws \UnexpectedValueException - fn install( + async fn install( &mut self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if output { self.inner().io.write_error(&format!( " - {}{}", diff --git a/crates/shirabe/src/downloader/download_manager.rs b/crates/shirabe/src/downloader/download_manager.rs index e81a6bb..3100e29 100644 --- a/crates/shirabe/src/downloader/download_manager.rs +++ b/crates/shirabe/src/downloader/download_manager.rs @@ -4,7 +4,6 @@ use crate::io::io_interface; use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::Preg; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ InvalidArgumentException, LogicException, PhpMixed, RuntimeException, array_keys, array_reverse, array_shift, dirname, get_class, implode, in_array, preg_quote, rtrim, sprintf, @@ -195,12 +194,12 @@ impl DownloadManager { /// /// @throws \InvalidArgumentException if package have no urls to download from /// @throws \RuntimeException - pub fn download( + pub async fn download( &self, package: &dyn PackageInterface, target_dir: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); self.filesystem .borrow_mut() @@ -291,13 +290,13 @@ impl DownloadManager { /// @param string $targetDir target dir /// @param PackageInterface|null $prevPackage previous package instance in case of updates /// @phpstan-return PromiseInterface<void|null> - pub fn prepare( + pub async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, target_dir: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); if let Some(downloader) = self.get_downloader_for_package(package)? { return downloader.prepare(r#type, package, &target_dir, prev_package); @@ -314,11 +313,11 @@ impl DownloadManager { /// /// @throws \InvalidArgumentException if package have no urls to download from /// @throws \RuntimeException - pub fn install( + pub async fn install( &self, package: &dyn PackageInterface, target_dir: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); if let Some(downloader) = self.get_downloader_for_package(package)? { return downloader.install2(package, &target_dir); @@ -335,12 +334,12 @@ impl DownloadManager { /// @phpstan-return PromiseInterface<void|null> /// /// @throws \InvalidArgumentException if initial package is not installed - pub fn update( + pub async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, target_dir: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); let downloader = self.get_downloader_for_package(target)?; let initial_downloader = self.get_downloader_for_package(initial)?; @@ -403,11 +402,11 @@ impl DownloadManager { /// @param PackageInterface $package package instance /// @param string $targetDir target dir /// @phpstan-return PromiseInterface<void|null> - pub fn remove( + pub async fn remove( &self, package: &dyn PackageInterface, target_dir: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); if let Some(downloader) = self.get_downloader_for_package(package)? { return downloader.remove2(package, &target_dir); @@ -423,13 +422,13 @@ impl DownloadManager { /// @param string $targetDir target dir /// @param PackageInterface|null $prevPackage previous package instance in case of updates /// @phpstan-return PromiseInterface<void|null> - pub fn cleanup( + pub async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, target_dir: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let target_dir = self.normalize_target_dir(target_dir); if let Some(downloader) = self.get_downloader_for_package(package)? { return downloader.cleanup(r#type, package, &target_dir, prev_package); diff --git a/crates/shirabe/src/downloader/downloader_interface.rs b/crates/shirabe/src/downloader/downloader_interface.rs index 9ced979..7b333e6 100644 --- a/crates/shirabe/src/downloader/downloader_interface.rs +++ b/crates/shirabe/src/downloader/downloader_interface.rs @@ -1,84 +1,83 @@ //! ref: composer/src/Composer/Downloader/DownloaderInterface.php -use shirabe_external_packages::react::promise::PromiseInterface; - use crate::package::PackageInterface; +use shirabe_php_shim::PhpMixed; pub trait DownloaderInterface: std::fmt::Debug { fn get_installation_source(&self) -> String; - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; /// Convenience for the PHP default `$output = true` overload. - fn download3( + async fn download3( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { self.download(package, path, prev_package, true) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; /// Convenience for the PHP default `$output = true` overload. - fn install2( + async fn install2( &self, package: &dyn PackageInterface, path: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { self.install(package, path, true) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; /// Convenience for the PHP default `$output = true` overload. - fn remove2( + async fn remove2( &self, package: &dyn PackageInterface, path: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { self.remove(package, path, true) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>>; + ) -> anyhow::Result<Option<PhpMixed>>; /// TODO(phase-b): runtime downcast helpers for PHP `instanceof` checks. fn as_change_report_interface(&self) -> Option<&dyn crate::downloader::ChangeReportInterface> { diff --git a/crates/shirabe/src/downloader/file_downloader.rs b/crates/shirabe/src/downloader/file_downloader.rs index ce5d275..0920342 100644 --- a/crates/shirabe/src/downloader/file_downloader.rs +++ b/crates/shirabe/src/downloader/file_downloader.rs @@ -6,7 +6,6 @@ use indexmap::IndexMap; use std::sync::{LazyLock, Mutex}; use crate::util::Silencer; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::react::promise::resolve as react_promise_resolve; use shirabe_php_shim::{ DIRECTORY_SEPARATOR, InvalidArgumentException, PATHINFO_BASENAME, PATHINFO_EXTENSION, @@ -148,13 +147,13 @@ impl DownloaderInterface for FileDownloader { } /// @inheritDoc - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, _prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if package.get_dist_url().is_none() { return Err(InvalidArgumentException { message: "The given package is missing url information".to_string(), @@ -212,24 +211,24 @@ impl DownloaderInterface for FileDownloader { } /// @inheritDoc - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { Ok(react_promise_resolve(Some(PhpMixed::Null))) } /// @inheritDoc - fn cleanup( + async fn cleanup( &self, _type: &str, package: &dyn PackageInterface, path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let file_name = self.get_file_name(package, path); if file_exists(&file_name) { self.filesystem.borrow_mut().unlink(&file_name)?; @@ -278,12 +277,12 @@ impl DownloaderInterface for FileDownloader { } /// @inheritDoc - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if output { self.io .write_error(&format!(" - {}", InstallOperation::format(package, false))); @@ -338,12 +337,12 @@ impl DownloaderInterface for FileDownloader { } /// @inheritDoc - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.io.write_error(&format!( " - {}{}", UpdateOperation::format(initial, target, false), @@ -357,12 +356,12 @@ impl DownloaderInterface for FileDownloader { } /// @inheritDoc - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if output { self.io.write_error(&format!( " - {}", diff --git a/crates/shirabe/src/downloader/fossil_downloader.rs b/crates/shirabe/src/downloader/fossil_downloader.rs index 363fd50..fc3d0e8 100644 --- a/crates/shirabe/src/downloader/fossil_downloader.rs +++ b/crates/shirabe/src/downloader/fossil_downloader.rs @@ -9,8 +9,7 @@ use crate::util::Filesystem; use crate::util::ProcessExecutor; use anyhow::Result; use shirabe_external_packages::composer::pcre::Preg; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::RuntimeException; +use shirabe_php_shim::{PhpMixed, RuntimeException}; #[derive(Debug)] pub struct FossilDownloader { @@ -29,22 +28,22 @@ impl FossilDownloader { } } - pub(crate) fn do_download( + pub(crate) async fn do_download( &self, _package: &dyn PackageInterface, _path: String, _url: String, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub(crate) fn do_install( + pub(crate) async fn do_install( &self, package: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.config.borrow_mut().prohibit_url_by_config( &url, Some(self.inner.io.as_ref()), @@ -99,13 +98,13 @@ impl FossilDownloader { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub(crate) fn do_update( + pub(crate) async fn do_update( &self, _initial: &dyn PackageInterface, target: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.config.borrow_mut().prohibit_url_by_config( &url, Some(self.inner.io.as_ref()), @@ -256,60 +255,60 @@ impl DownloaderInterface for FossilDownloader { todo!() } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn install( + async fn install( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn update( + async fn update( &self, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, _path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn remove( + async fn remove( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } } diff --git a/crates/shirabe/src/downloader/git_downloader.rs b/crates/shirabe/src/downloader/git_downloader.rs index 9c4c64d..e6bc16b 100644 --- a/crates/shirabe/src/downloader/git_downloader.rs +++ b/crates/shirabe/src/downloader/git_downloader.rs @@ -5,7 +5,6 @@ use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_external_packages::react::promise; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ PhpMixed, RuntimeException, array_map, basename, dirname, implode, in_array, is_dir, preg_quote, realpath, rtrim, sprintf, strlen, strpos, substr, trim, version_compare, @@ -58,13 +57,13 @@ impl GitDownloader { } } - pub(crate) fn do_download( + pub(crate) async fn do_download( &mut self, package: &dyn PackageInterface, _path: &str, url: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { // Do not create an extra local cache when repository is already local if Filesystem::is_local_path(url) { return Ok(promise::resolve(None)); @@ -133,12 +132,12 @@ impl GitDownloader { Ok(promise::resolve(None)) } - pub(crate) fn do_install( + pub(crate) async fn do_install( &mut self, package: &dyn PackageInterface, path: &str, url: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { GitUtil::clean_env(&self.inner.process); let path = self.normalize_path(path); let cache_path = format!( @@ -286,13 +285,13 @@ impl GitDownloader { Ok(promise::resolve(None)) } - pub(crate) fn do_update( + pub(crate) async fn do_update( &mut self, _initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, url: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { GitUtil::clean_env(&self.inner.process); let path = self.normalize_path(path); if !self.has_metadata_repository(&path) { @@ -685,12 +684,12 @@ impl GitDownloader { unpushed_changes } - pub(crate) fn clean_changes( + pub(crate) async fn clean_changes( &mut self, package: &dyn PackageInterface, path: &str, update: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { GitUtil::clean_env(&self.inner.process); let path = self.normalize_path(path); @@ -1224,7 +1223,7 @@ impl GitDownloader { /// @phpstan-return PromiseInterface<void|null> /// @throws \RuntimeException - pub(crate) fn discard_changes(&mut self, path: &str) -> Result<Box<dyn PromiseInterface>> { + pub(crate) async fn discard_changes(&mut self, path: &str) -> Result<Option<PhpMixed>> { let path = self.normalize_path(path); let mut output = String::new(); if self.inner.process.borrow_mut().execute_args( @@ -1260,7 +1259,7 @@ impl GitDownloader { /// @phpstan-return PromiseInterface<void|null> /// @throws \RuntimeException - pub(crate) fn stash_changes(&mut self, path: &str) -> Result<Box<dyn PromiseInterface>> { + pub(crate) async fn stash_changes(&mut self, path: &str) -> Result<Option<PhpMixed>> { let path = self.normalize_path(path); let mut output = String::new(); if self.inner.process.borrow_mut().execute_args( @@ -1365,60 +1364,60 @@ impl crate::downloader::DownloaderInterface for GitDownloader { todo!() } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn install( + async fn install( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn update( + async fn update( &self, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, _path: &str, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn remove( + async fn remove( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn shirabe_external_packages::react::promise::PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } } diff --git a/crates/shirabe/src/downloader/gzip_downloader.rs b/crates/shirabe/src/downloader/gzip_downloader.rs index 557fe3a..a3fbb49 100644 --- a/crates/shirabe/src/downloader/gzip_downloader.rs +++ b/crates/shirabe/src/downloader/gzip_downloader.rs @@ -13,7 +13,6 @@ use crate::util::Platform; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ DIRECTORY_SEPARATOR, PATHINFO_FILENAME, PHP_URL_PATH, PhpMixed, RuntimeException, extension_loaded, fclose, fopen, fwrite, gzclose, gzopen, gzread, implode, parse_url, pathinfo, @@ -50,12 +49,12 @@ impl GzipDownloader { } } - pub(crate) fn extract( + pub(crate) async fn extract( &mut self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let filename = pathinfo( parse_url( &strtr(&package.get_dist_url().unwrap_or_default(), "\\", "/"), @@ -135,60 +134,60 @@ impl crate::downloader::DownloaderInterface for GzipDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/hg_downloader.rs b/crates/shirabe/src/downloader/hg_downloader.rs index 986a214..16cf73c 100644 --- a/crates/shirabe/src/downloader/hg_downloader.rs +++ b/crates/shirabe/src/downloader/hg_downloader.rs @@ -9,8 +9,7 @@ use crate::util::Filesystem; use crate::util::Hg as HgUtils; use crate::util::ProcessExecutor; use anyhow::Result; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::RuntimeException; +use shirabe_php_shim::{PhpMixed, RuntimeException}; #[derive(Debug)] pub struct HgDownloader { @@ -29,13 +28,13 @@ impl HgDownloader { } } - pub(crate) fn do_download( + pub(crate) async fn do_download( &self, package: &dyn PackageInterface, path: String, url: String, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if HgUtils::get_version(&self.inner.process).is_none() { return Err(RuntimeException { message: "hg was not found in your PATH, skipping source download".to_string(), @@ -47,12 +46,12 @@ impl HgDownloader { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub(crate) fn do_install( + pub(crate) async fn do_install( &self, package: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let hg_utils = HgUtils::new( &*self.inner.io, &*self.inner.config.borrow(), @@ -101,13 +100,13 @@ impl HgDownloader { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub(crate) fn do_update( + pub(crate) async fn do_update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let hg_utils = HgUtils::new( &*self.inner.io, &*self.inner.config.borrow(), @@ -226,60 +225,60 @@ impl DownloaderInterface for HgDownloader { todo!() } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn install( + async fn install( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn update( + async fn update( &self, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, _path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn remove( + async fn remove( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } } diff --git a/crates/shirabe/src/downloader/path_downloader.rs b/crates/shirabe/src/downloader/path_downloader.rs index 9003e81..3da4915 100644 --- a/crates/shirabe/src/downloader/path_downloader.rs +++ b/crates/shirabe/src/downloader/path_downloader.rs @@ -3,7 +3,6 @@ use crate::io::io_interface; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::symfony::component::filesystem::Filesystem as SymfonyFilesystem; use shirabe_external_packages::symfony::component::filesystem::exception::IOException; use shirabe_php_shim::{ @@ -61,13 +60,13 @@ impl PathDownloader { } } - pub fn download( + pub async fn download( &mut self, package: &dyn PackageInterface, path: String, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let path = Filesystem::trim_trailing_slash(&path); let url = package.get_dist_url().ok_or_else(|| RuntimeException { message: format!( @@ -123,12 +122,12 @@ impl PathDownloader { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub fn install( + pub async fn install( &mut self, package: &dyn PackageInterface, path: String, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let path = Filesystem::trim_trailing_slash(&path); let url = package.get_dist_url().ok_or_else(|| RuntimeException { message: format!( @@ -294,12 +293,12 @@ impl PathDownloader { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub fn remove( + pub async fn remove( &mut self, package: &dyn PackageInterface, path: String, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let path = Filesystem::trim_trailing_slash(&path); // realpath() may resolve Windows junctions to the source path, so we'll check for a junction // first to prevent a false positive when checking if the dist and install paths are the same. @@ -543,60 +542,60 @@ impl DownloaderInterface for PathDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/perforce_downloader.rs b/crates/shirabe/src/downloader/perforce_downloader.rs index 433ae8f..ae433ef 100644 --- a/crates/shirabe/src/downloader/perforce_downloader.rs +++ b/crates/shirabe/src/downloader/perforce_downloader.rs @@ -11,7 +11,6 @@ use crate::util::Perforce; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::PhpMixed; use std::any::Any; @@ -34,22 +33,22 @@ impl PerforceDownloader { } } - pub(crate) fn do_download( + pub(crate) async fn do_download( &self, _package: &dyn PackageInterface, _path: String, _url: String, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { Ok(shirabe_external_packages::react::promise::resolve(None)) } - pub fn do_install( + pub async fn do_install( &mut self, package: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let source_ref = package.get_source_reference().map(|s| s.to_string()); let label = self.get_label_from_source_reference(source_ref.clone().unwrap_or_default()); @@ -112,13 +111,13 @@ impl PerforceDownloader { repository.get_repo_config().clone() } - pub(crate) fn do_update( + pub(crate) async fn do_update( &mut self, _initial: &dyn PackageInterface, target: &dyn PackageInterface, path: String, url: String, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.do_install(target, path, url) } @@ -165,60 +164,60 @@ impl DownloaderInterface for PerforceDownloader { todo!() } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn install( + async fn install( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn update( + async fn update( &self, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, _path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn remove( + async fn remove( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { todo!() } } diff --git a/crates/shirabe/src/downloader/phar_downloader.rs b/crates/shirabe/src/downloader/phar_downloader.rs index ee87bd1..f3fffb9 100644 --- a/crates/shirabe/src/downloader/phar_downloader.rs +++ b/crates/shirabe/src/downloader/phar_downloader.rs @@ -13,8 +13,7 @@ use crate::util::HttpDownloader; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::Phar; +use shirabe_php_shim::{Phar, PhpMixed}; #[derive(Debug)] pub struct PharDownloader { @@ -46,12 +45,12 @@ impl PharDownloader { } } - pub(crate) fn extract( + pub(crate) async fn extract( &self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { // Can throw an UnexpectedValueException let archive = Phar::new(file.to_string()); archive.extract_to(path, None, true); @@ -69,60 +68,60 @@ impl DownloaderInterface for PharDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/rar_downloader.rs b/crates/shirabe/src/downloader/rar_downloader.rs index fd45c7d..71efc29 100644 --- a/crates/shirabe/src/downloader/rar_downloader.rs +++ b/crates/shirabe/src/downloader/rar_downloader.rs @@ -14,7 +14,6 @@ use crate::util::Platform; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ PhpMixed, RarArchive, RuntimeException, UnexpectedValueException, class_exists, implode, }; @@ -49,12 +48,12 @@ impl RarDownloader { } } - pub(crate) fn extract( + pub(crate) async fn extract( &mut self, _package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let mut process_error: Option<String> = None; if !Platform::is_windows() { @@ -149,60 +148,60 @@ impl crate::downloader::DownloaderInterface for RarDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/svn_downloader.rs b/crates/shirabe/src/downloader/svn_downloader.rs index fc5bca7..65e3e37 100644 --- a/crates/shirabe/src/downloader/svn_downloader.rs +++ b/crates/shirabe/src/downloader/svn_downloader.rs @@ -4,7 +4,6 @@ use crate::io::io_interface; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_external_packages::react::promise; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{PhpMixed, RuntimeException, is_dir, version_compare}; use crate::config::Config; @@ -36,13 +35,13 @@ impl SvnDownloader { } } - pub(crate) fn do_download( + pub(crate) async fn do_download( &mut self, package: &dyn PackageInterface, path: &str, url: &str, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { SvnUtil::clean_env(); let mut util = SvnUtil::new( url.to_string(), @@ -61,12 +60,12 @@ impl SvnDownloader { Ok(promise::resolve(None)) } - pub(crate) fn do_install( + pub(crate) async fn do_install( &mut self, package: &dyn PackageInterface, path: &str, url: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { SvnUtil::clean_env(); let r#ref = package.get_source_reference(); @@ -105,13 +104,13 @@ impl SvnDownloader { Ok(promise::resolve(None)) } - pub(crate) fn do_update( + pub(crate) async fn do_update( &mut self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, url: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { SvnUtil::clean_env(); let r#ref = target.get_source_reference(); @@ -203,12 +202,12 @@ impl SvnDownloader { }) } - pub(crate) fn clean_changes( + pub(crate) async fn clean_changes( &mut self, package: &dyn PackageInterface, path: &str, update: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { let changes = self.get_local_changes(package, path); if changes.is_none() { return Ok(promise::resolve(None)); @@ -404,7 +403,7 @@ impl SvnDownloader { } } - pub(crate) fn discard_changes(&self, path: &str) -> anyhow::Result<Box<dyn PromiseInterface>> { + pub(crate) async fn discard_changes(&self, path: &str) -> anyhow::Result<Option<PhpMixed>> { let mut output = String::new(); if self.inner.process.borrow_mut().execute_args( &["svn", "revert", "-R", "."].map(|s| s.to_string()).to_vec(), @@ -438,60 +437,60 @@ impl DownloaderInterface for SvnDownloader { todo!() } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, _output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn install( + async fn install( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn update( + async fn update( &self, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, _path: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn remove( + async fn remove( &self, _package: &dyn PackageInterface, _path: &str, _output: bool, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _path: &str, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<Option<PhpMixed>> { todo!() } } diff --git a/crates/shirabe/src/downloader/tar_downloader.rs b/crates/shirabe/src/downloader/tar_downloader.rs index b98b274..b65d0e3 100644 --- a/crates/shirabe/src/downloader/tar_downloader.rs +++ b/crates/shirabe/src/downloader/tar_downloader.rs @@ -13,8 +13,7 @@ use crate::util::HttpDownloader; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::PharData; +use shirabe_php_shim::{PharData, PhpMixed}; #[derive(Debug)] pub struct TarDownloader { @@ -46,12 +45,12 @@ impl TarDownloader { } } - pub(crate) fn extract( + pub(crate) async fn extract( &self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let archive = PharData::new(file.to_string()); archive.extract_to(path, None, true); @@ -64,60 +63,60 @@ impl DownloaderInterface for TarDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/vcs_downloader.rs b/crates/shirabe/src/downloader/vcs_downloader.rs index 31f4c7c..1219ab1 100644 --- a/crates/shirabe/src/downloader/vcs_downloader.rs +++ b/crates/shirabe/src/downloader/vcs_downloader.rs @@ -3,7 +3,6 @@ use crate::io::io_interface; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ InvalidArgumentException, PhpMixed, RuntimeException, array_map, array_shift, count, explode, get_class, get_class_err, implode, rawurldecode, realpath, str_replace, strlen, strpos, substr, @@ -58,12 +57,12 @@ impl VcsDownloaderBase { /// call this when they need to invoke the base behavior. Since this lives on the data struct, /// it cannot consult subclass-specific `get_local_changes`; it assumes any callers have /// already verified that no local changes exist. - pub fn clean_changes( + pub async fn clean_changes( &self, _package: &dyn PackageInterface, _path: &str, _update: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { // TODO(phase-b): parent::cleanChanges() rechecks getLocalChanges via dynamic dispatch. // Callers in subclasses must do that check themselves (they already have). Ok(shirabe_external_packages::react::promise::resolve(None)) @@ -85,30 +84,30 @@ pub trait VcsDownloader: fn has_cleaned_changes_mut(&mut self) -> &mut IndexMap<String, bool>; /// Downloads data needed to run an install/update later - fn do_download( + async fn do_download( &mut self, package: &dyn PackageInterface, path: &str, url: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>>; + ) -> Result<Option<PhpMixed>>; /// Downloads specific package into specific folder. - fn do_install( + async fn do_install( &mut self, package: &dyn PackageInterface, path: &str, url: &str, - ) -> Result<Box<dyn PromiseInterface>>; + ) -> Result<Option<PhpMixed>>; /// Updates specific package in specific folder from initial to target version. - fn do_update( + async fn do_update( &mut self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, url: &str, - ) -> Result<Box<dyn PromiseInterface>>; + ) -> Result<Option<PhpMixed>>; /// Fetches the commit logs between two commits fn get_commit_logs(&self, from_reference: &str, to_reference: &str, path: &str) -> String; @@ -121,12 +120,12 @@ pub trait VcsDownloader: "source".to_string() } - fn download( + async fn download( &mut self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if package.get_source_reference().is_none() { return Err(InvalidArgumentException { message: format!( @@ -142,7 +141,7 @@ pub trait VcsDownloader: while let Some(url) = array_shift(&mut urls) { // TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch - let attempt: Result<Box<dyn PromiseInterface>> = + let attempt: Result<Option<PhpMixed>> = self.do_download(package, path, &url, prev_package); match attempt { Ok(promise) => return Ok(promise), @@ -186,13 +185,13 @@ pub trait VcsDownloader: Ok(shirabe_external_packages::react::promise::resolve(None)) } - fn prepare( + async fn prepare( &mut self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if r#type == "update" { self.clean_changes(prev_package.unwrap(), path, true)?; self.has_cleaned_changes_mut() @@ -208,13 +207,13 @@ pub trait VcsDownloader: Ok(shirabe_external_packages::react::promise::resolve(None)) } - fn cleanup( + async fn cleanup( &mut self, r#type: &str, _package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if r#type == "update" && prev_package .map(|p| { @@ -231,11 +230,11 @@ pub trait VcsDownloader: Ok(shirabe_external_packages::react::promise::resolve(None)) } - fn install( + async fn install( &mut self, package: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if package.get_source_reference().is_none() { return Err(InvalidArgumentException { message: format!( @@ -256,7 +255,7 @@ pub trait VcsDownloader: let mut urls = self.prepare_urls(package.get_source_urls()); while let Some(url) = array_shift(&mut urls) { // TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch - let attempt: Result<Box<dyn PromiseInterface>> = self.do_install(package, path, &url); + let attempt: Result<Option<PhpMixed>> = self.do_install(package, path, &url); match attempt { Ok(_) => break, Err(e) => { @@ -299,12 +298,12 @@ pub trait VcsDownloader: Ok(shirabe_external_packages::react::promise::resolve(None)) } - fn update( + async fn update( &mut self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { if target.get_source_reference().is_none() { return Err(InvalidArgumentException { message: format!( @@ -327,8 +326,7 @@ pub trait VcsDownloader: let mut exception: Option<anyhow::Error> = None; while let Some(url) = array_shift(&mut urls) { // TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch - let attempt: Result<Box<dyn PromiseInterface>> = - self.do_update(initial, target, path, &url); + let attempt: Result<Option<PhpMixed>> = self.do_update(initial, target, path, &url); match attempt { Ok(_) => { exception = None; @@ -409,11 +407,11 @@ pub trait VcsDownloader: Ok(shirabe_external_packages::react::promise::resolve(None)) } - fn remove( + async fn remove( &mut self, package: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.io_mut().write_error3( &format!(" - {}", UninstallOperation::format(package, false)), true, @@ -467,12 +465,12 @@ pub trait VcsDownloader: /// /// @param bool $update if true (update) the changes can be stashed and reapplied after an update, /// if false (remove) the changes should be assumed to be lost if the operation is not aborted - fn clean_changes( + async fn clean_changes( &self, package: &dyn PackageInterface, path: &str, _update: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { // the default implementation just fails if there are any changes, override in child classes to provide stash-ability if self.get_local_changes(package, path)?.is_some() { return Err(RuntimeException { diff --git a/crates/shirabe/src/downloader/xz_downloader.rs b/crates/shirabe/src/downloader/xz_downloader.rs index 7724e9a..6cc960e 100644 --- a/crates/shirabe/src/downloader/xz_downloader.rs +++ b/crates/shirabe/src/downloader/xz_downloader.rs @@ -12,7 +12,6 @@ use crate::util::HttpDownloader; use crate::util::ProcessExecutor; use anyhow::{Result, bail}; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::PhpMixed; #[derive(Debug)] @@ -45,12 +44,12 @@ impl XzDownloader { } } - pub(crate) fn extract( + pub(crate) async fn extract( &mut self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let command = vec!["tar", "-xJf", file, "-C", path]; let mut ignored_output = PhpMixed::Null; @@ -83,60 +82,60 @@ impl crate::downloader::DownloaderInterface for XzDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/downloader/zip_downloader.rs b/crates/shirabe/src/downloader/zip_downloader.rs index c51a9ea..ef18f95 100644 --- a/crates/shirabe/src/downloader/zip_downloader.rs +++ b/crates/shirabe/src/downloader/zip_downloader.rs @@ -9,13 +9,12 @@ use crate::util::Platform; use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::symfony::component::process::ExecutableFinder; use shirabe_external_packages::symfony::component::process::Process; use shirabe_php_shim::{ - DIRECTORY_SEPARATOR, ErrorException, RuntimeException, UnexpectedValueException, ZipArchive, - bin2hex, class_exists, file_exists, file_get_contents, filesize, function_exists, hash_file, - is_file, json_encode, random_int, version_compare, + DIRECTORY_SEPARATOR, ErrorException, PhpMixed, RuntimeException, UnexpectedValueException, + ZipArchive, bin2hex, class_exists, file_exists, file_get_contents, filesize, function_exists, + hash_file, is_file, json_encode, random_int, version_compare, }; use std::sync::Mutex; @@ -58,13 +57,13 @@ impl ZipDownloader { } } - pub fn download( + pub async fn download( &mut self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { { let mut unzip_commands = UNZIP_COMMANDS.lock().unwrap(); if unzip_commands.is_none() { @@ -196,12 +195,12 @@ impl ZipDownloader { self.inner.download(package, path, prev_package, output) } - fn extract_with_system_unzip( + async fn extract_with_system_unzip( &mut self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { static WARNED_7ZIP_LINUX: Mutex<bool> = Mutex::new(false); let is_last_chance = !HAS_ZIP_ARCHIVE.lock().unwrap().unwrap_or(false); @@ -288,18 +287,18 @@ impl ZipDownloader { } } - fn extract_with_zip_archive( + async fn extract_with_zip_archive( &mut self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { let mut zip_archive = self .zip_archive_object .take() .unwrap_or_else(ZipArchive::new); - let result: Result<Box<dyn PromiseInterface>> = (|| { + let result: Result<Option<PhpMixed>> = (|| { let retval = if !file_exists(file) || filesize(file).map_or(true, |s| s == 0) { Err(-1i64) } else { @@ -387,12 +386,12 @@ impl ZipDownloader { }) } - pub(crate) fn extract( + pub(crate) async fn extract( &mut self, package: &dyn PackageInterface, file: &str, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.extract_with_system_unzip(package, file, path) } @@ -427,60 +426,60 @@ impl crate::downloader::DownloaderInterface for ZipDownloader { self.inner.get_installation_source() } - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.download(package, path, prev_package, output) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.prepare(r#type, package, path, prev_package) } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.install(package, path, output) } - fn update( + async fn update( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.update(initial, target, path) } - fn remove( + async fn remove( &self, package: &dyn PackageInterface, path: &str, output: bool, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.remove(package, path, output) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, path, prev_package) } } diff --git a/crates/shirabe/src/installer/installation_manager.rs b/crates/shirabe/src/installer/installation_manager.rs index 479e478..114f1fc 100644 --- a/crates/shirabe/src/installer/installation_manager.rs +++ b/crates/shirabe/src/installer/installation_manager.rs @@ -4,7 +4,6 @@ use crate::io::io_interface; use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::react::promise; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::seld::signal::SignalHandler; use shirabe_php_shim::{ InvalidArgumentException, PhpMixed, array_search_mixed, array_splice, array_unshift, count, @@ -540,10 +539,7 @@ impl InstallationManager { /// Executes download operation. /// /// @phpstan-return PromiseInterface<void|null>|null - pub fn download( - &mut self, - package: &dyn PackageInterface, - ) -> Option<Box<dyn PromiseInterface>> { + pub async fn download(&mut self, package: &dyn PackageInterface) -> Option<PhpMixed> { let installer = self.get_installer(package.get_type()).ok()?; let promise = installer.cleanup("install", package, None).ok()?; @@ -553,11 +549,11 @@ impl InstallationManager { /// Executes install operation. /// /// @phpstan-return PromiseInterface<void|null>|null - pub fn install( + pub async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, operation: &InstallOperation, - ) -> Option<Box<dyn PromiseInterface>> { + ) -> Option<PhpMixed> { let package = operation.get_package(); let installer = self.get_installer(package.get_type()).ok()?; let promise = installer.install(repo, package).ok()?; @@ -569,11 +565,11 @@ impl InstallationManager { /// Executes update operation. /// /// @phpstan-return PromiseInterface<void|null>|null - pub fn update( + pub async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, operation: &UpdateOperation, - ) -> Option<Box<dyn PromiseInterface>> { + ) -> Option<PhpMixed> { let initial = operation.get_initial_package(); let target = operation.get_target_package(); @@ -608,11 +604,11 @@ impl InstallationManager { /// Uninstalls package. /// /// @phpstan-return PromiseInterface<void|null>|null - pub fn uninstall( + pub async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, operation: &UninstallOperation, - ) -> Option<Box<dyn PromiseInterface>> { + ) -> Option<PhpMixed> { let package = operation.get_package(); let installer = self.get_installer(package.get_type()).ok()?; diff --git a/crates/shirabe/src/installer/installer_interface.rs b/crates/shirabe/src/installer/installer_interface.rs index 5370364..29171cf 100644 --- a/crates/shirabe/src/installer/installer_interface.rs +++ b/crates/shirabe/src/installer/installer_interface.rs @@ -2,7 +2,7 @@ use crate::package::PackageInterface; use crate::repository::InstalledRepositoryInterface; -use shirabe_external_packages::react::promise::PromiseInterface; +use shirabe_php_shim::PhpMixed; pub trait InstallerInterface: std::fmt::Debug { fn supports(&self, package_type: &str) -> bool; @@ -13,44 +13,44 @@ pub trait InstallerInterface: std::fmt::Debug { package: &dyn PackageInterface, ) -> bool; - fn download( + async fn download( &self, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn install( + async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn update( + async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn uninstall( + async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>>; + ) -> anyhow::Result<Option<PhpMixed>>; fn get_install_path(&self, package: &dyn PackageInterface) -> Option<String>; diff --git a/crates/shirabe/src/installer/library_installer.rs b/crates/shirabe/src/installer/library_installer.rs index 4c3f201..a9a77e9 100644 --- a/crates/shirabe/src/installer/library_installer.rs +++ b/crates/shirabe/src/installer/library_installer.rs @@ -4,7 +4,6 @@ use std::any::Any; use anyhow::Result; use shirabe_external_packages::composer::pcre::Preg; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ InvalidArgumentException, LogicException, is_link, preg_quote, realpath, rmdir, rtrim, strpos, }; @@ -132,10 +131,10 @@ impl LibraryInstaller { /// @return PromiseInterface|null /// @phpstan-return PromiseInterface<void|null>|null - pub(crate) fn install_code( + pub(crate) async fn install_code( &self, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let download_path = self.get_install_path(package).unwrap(); Ok(Some( @@ -147,11 +146,11 @@ impl LibraryInstaller { /// @return PromiseInterface|null /// @phpstan-return PromiseInterface<void|null>|null - pub(crate) fn update_code( + pub(crate) async fn update_code( &self, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let initial_download_path = self.get_install_path(initial).unwrap(); let target_download_path = self.get_install_path(target).unwrap(); if target_download_path != initial_download_path { @@ -189,10 +188,10 @@ impl LibraryInstaller { /// @return PromiseInterface|null /// @phpstan-return PromiseInterface<void|null>|null - pub(crate) fn remove_code( + pub(crate) async fn remove_code( &self, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let download_path = self.get_package_base_path(package); Ok(Some( @@ -267,11 +266,11 @@ impl InstallerInterface for LibraryInstaller { false } - fn download( + async fn download( &self, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { // TODO(phase-b): initialize_vendor_dir requires &mut self // self.initialize_vendor_dir(); let download_path = self.get_install_path(package).unwrap(); @@ -283,12 +282,12 @@ impl InstallerInterface for LibraryInstaller { )?)) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { // TODO(phase-b): initialize_vendor_dir requires &mut self // self.initialize_vendor_dir(); let download_path = self.get_install_path(package).unwrap(); @@ -301,12 +300,12 @@ impl InstallerInterface for LibraryInstaller { )?)) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { // TODO(phase-b): initialize_vendor_dir requires &mut self // self.initialize_vendor_dir(); let download_path = self.get_install_path(package).unwrap(); @@ -319,11 +318,11 @@ impl InstallerInterface for LibraryInstaller { )?)) } - fn install( + async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { // TODO(phase-b): initialize_vendor_dir requires &mut self // self.initialize_vendor_dir(); let download_path = self.get_install_path(package).unwrap(); @@ -348,12 +347,12 @@ impl InstallerInterface for LibraryInstaller { ))) } - fn update( + async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { if !repo.has_package(initial) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", initial), @@ -381,11 +380,11 @@ impl InstallerInterface for LibraryInstaller { ))) } - fn uninstall( + async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { if !repo.has_package(package) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", package), diff --git a/crates/shirabe/src/installer/metapackage_installer.rs b/crates/shirabe/src/installer/metapackage_installer.rs index 2c23229..f6d6133 100644 --- a/crates/shirabe/src/installer/metapackage_installer.rs +++ b/crates/shirabe/src/installer/metapackage_installer.rs @@ -9,8 +9,7 @@ use crate::io::io_interface; use crate::package::PackageInterface; use crate::repository::InstalledRepositoryInterface; use anyhow::Result; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::InvalidArgumentException; +use shirabe_php_shim::{InvalidArgumentException, PhpMixed}; #[derive(Debug)] pub struct MetapackageInstaller { @@ -36,43 +35,43 @@ impl InstallerInterface for MetapackageInstaller { repo.has_package(package) } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn install( + async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { self.io.write_error3( &format!(" - {}", InstallOperation::format(package, false)), true, @@ -86,12 +85,12 @@ impl InstallerInterface for MetapackageInstaller { ))) } - fn update( + async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { if !repo.has_package(initial) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", initial), @@ -114,11 +113,11 @@ impl InstallerInterface for MetapackageInstaller { ))) } - fn uninstall( + async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { if !repo.has_package(package) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", package), diff --git a/crates/shirabe/src/installer/noop_installer.rs b/crates/shirabe/src/installer/noop_installer.rs index 360f962..263caca 100644 --- a/crates/shirabe/src/installer/noop_installer.rs +++ b/crates/shirabe/src/installer/noop_installer.rs @@ -3,8 +3,7 @@ use crate::installer::InstallerInterface; use crate::package::PackageInterface; use crate::repository::InstalledRepositoryInterface; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::InvalidArgumentException; +use shirabe_php_shim::{InvalidArgumentException, PhpMixed}; #[derive(Debug)] pub struct NoopInstaller; @@ -22,43 +21,43 @@ impl InstallerInterface for NoopInstaller { repo.has_package(package) } - fn download( + async fn download( &self, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn prepare( + async fn prepare( &self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn cleanup( + async fn cleanup( &self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Ok(Some(shirabe_external_packages::react::promise::resolve( None, ))) } - fn install( + async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { if !repo.has_package(package) { repo.add_package(package.clone_package_box()); } @@ -68,12 +67,12 @@ impl InstallerInterface for NoopInstaller { ))) } - fn update( + async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { if !repo.has_package(initial) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", initial), @@ -92,11 +91,11 @@ impl InstallerInterface for NoopInstaller { ))) } - fn uninstall( + async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { if !repo.has_package(package) { return Err(InvalidArgumentException { message: format!("Package is not installed: {}", package), diff --git a/crates/shirabe/src/installer/plugin_installer.rs b/crates/shirabe/src/installer/plugin_installer.rs index e1d4c5e..fd1fc99 100644 --- a/crates/shirabe/src/installer/plugin_installer.rs +++ b/crates/shirabe/src/installer/plugin_installer.rs @@ -11,7 +11,6 @@ use crate::repository::InstalledRepositoryInterface; use crate::util::Filesystem; use crate::util::Platform; use anyhow::Result; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{LogicException, PhpMixed, UnexpectedValueException, empty}; #[derive(Debug)] @@ -75,12 +74,12 @@ impl InstallerInterface for PluginInstaller { self.inner.is_installed(repo, package) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { if (r#type == "install" || r#type == "update") && !self .get_plugin_manager() @@ -100,11 +99,11 @@ impl InstallerInterface for PluginInstaller { self.inner.prepare(r#type, package, prev_package) } - fn download( + async fn download( &self, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let extra = package.get_extra(); let class = extra.get("class").cloned().unwrap_or(PhpMixed::Null); if empty(&class) { @@ -120,11 +119,11 @@ impl InstallerInterface for PluginInstaller { self.inner.download(package, prev_package) } - fn install( + async fn install( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let promise = self.inner.install(repo, package)?; let promise = match promise { Some(p) => p, @@ -143,12 +142,12 @@ impl InstallerInterface for PluginInstaller { ))) } - fn update( + async fn update( &mut self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { let promise = self.inner.update(repo, initial, target)?; let promise = match promise { Some(p) => p, @@ -168,11 +167,11 @@ impl InstallerInterface for PluginInstaller { ))) } - fn uninstall( + async fn uninstall( &mut self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { // TODO(plugin): uninstall package from plugin manager self.get_plugin_manager() .borrow_mut() @@ -181,12 +180,12 @@ impl InstallerInterface for PluginInstaller { self.inner.uninstall(repo, package) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Option<Box<dyn PromiseInterface>>> { + ) -> Result<Option<PhpMixed>> { self.inner.cleanup(r#type, package, prev_package) } diff --git a/crates/shirabe/src/installer/project_installer.rs b/crates/shirabe/src/installer/project_installer.rs index ad2c3a6..1c50a16 100644 --- a/crates/shirabe/src/installer/project_installer.rs +++ b/crates/shirabe/src/installer/project_installer.rs @@ -5,8 +5,7 @@ use crate::installer::InstallerInterface; use crate::package::PackageInterface; use crate::repository::InstalledRepositoryInterface; use crate::util::Filesystem; -use shirabe_external_packages::react::promise::PromiseInterface; -use shirabe_php_shim::InvalidArgumentException; +use shirabe_php_shim::{InvalidArgumentException, PhpMixed}; #[derive(Debug)] pub struct ProjectInstaller { @@ -43,11 +42,11 @@ impl InstallerInterface for ProjectInstaller { false } - fn download( + async fn download( &self, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { let install_path = &self.install_path; if std::path::Path::new(install_path).exists() && !self.filesystem.borrow().is_dir_empty(install_path) @@ -68,35 +67,35 @@ impl InstallerInterface for ProjectInstaller { .map(Some) } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { self.download_manager .borrow() .prepare(r#type, package, &self.install_path, prev_package) .map(Some) } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { self.download_manager .borrow() .cleanup(r#type, package, &self.install_path, prev_package) .map(Some) } - fn install( + async fn install( &mut self, _repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Ok(Some( self.download_manager .borrow() @@ -104,12 +103,12 @@ impl InstallerInterface for ProjectInstaller { )) } - fn update( + async fn update( &mut self, _repo: &mut dyn InstalledRepositoryInterface, _initial: &dyn PackageInterface, _target: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Err(InvalidArgumentException { message: "not supported".to_string(), code: 0, @@ -117,11 +116,11 @@ impl InstallerInterface for ProjectInstaller { .into()) } - fn uninstall( + async fn uninstall( &mut self, _repo: &mut dyn InstalledRepositoryInterface, _package: &dyn PackageInterface, - ) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + ) -> anyhow::Result<Option<PhpMixed>> { Err(InvalidArgumentException { message: "not supported".to_string(), code: 0, diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs index 624c4a2..7601117 100644 --- a/crates/shirabe/src/repository/composer_repository.rs +++ b/crates/shirabe/src/repository/composer_repository.rs @@ -3,7 +3,6 @@ use indexmap::IndexMap; use shirabe_external_packages::composer::metadata_minifier::MetadataMinifier; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ Countable, InvalidArgumentException, JSON_UNESCAPED_SLASHES, JSON_UNESCAPED_UNICODE, LogicException, PHP_EOL, PhpMixed, RuntimeException, UnexpectedValueException, @@ -2087,11 +2086,11 @@ impl ComposerRepository { }) } - fn start_cached_async_download( + async fn start_cached_async_download( &mut self, file_name: &str, package_name: Option<&str>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<PhpMixed> { if self.lazy_providers_url.is_none() { return Err(LogicException { message: "startCachedAsyncDownload only supports v2 protocol composer repos with a metadata-url".to_string(), @@ -3277,12 +3276,12 @@ impl ComposerRepository { } } - fn async_fetch_file( + async fn async_fetch_file( &mut self, filename: &str, cache_key: &str, last_modified_time: Option<&str>, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + ) -> anyhow::Result<PhpMixed> { if filename.is_empty() { return Err(InvalidArgumentException { message: "$filename should not be an empty string".to_string(), diff --git a/crates/shirabe/src/util/filesystem.rs b/crates/shirabe/src/util/filesystem.rs index 96316e9..39b5e6b 100644 --- a/crates/shirabe/src/util/filesystem.rs +++ b/crates/shirabe/src/util/filesystem.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Util/Filesystem.php use shirabe_external_packages::composer::pcre::Preg; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::symfony::component::filesystem::exception::IOException; use shirabe_external_packages::symfony::component::finder::Finder; use shirabe_php_shim::{ @@ -133,10 +132,7 @@ impl Filesystem { /// /// Uses the process component if proc_open is enabled on the PHP /// installation. - pub fn remove_directory_async( - &mut self, - directory: &str, - ) -> anyhow::Result<Box<dyn PromiseInterface>> { + pub async fn remove_directory_async(&mut self, directory: &str) -> anyhow::Result<bool> { let edge_case_result = self.remove_edge_cases(directory, true)?; if let Some(r) = edge_case_result { return Ok(shirabe_external_packages::react::promise::resolve(Some( diff --git a/crates/shirabe/src/util/http_downloader.rs b/crates/shirabe/src/util/http_downloader.rs index 3072df2..6f769ce 100644 --- a/crates/shirabe/src/util/http_downloader.rs +++ b/crates/shirabe/src/util/http_downloader.rs @@ -5,8 +5,6 @@ use indexmap::IndexMap; use crate::util::Silencer; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; -use shirabe_external_packages::react::promise::Promise; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_php_shim::{ InvalidArgumentException, LogicException, PhpMixed, array_replace_recursive, chr, extension_loaded, file_get_contents, function_exists, implode, is_numeric, max, min, @@ -203,11 +201,11 @@ impl HttpDownloader { } /// Create an async download operation - pub fn add( + pub async fn add( &mut self, url: &str, options: IndexMap<String, PhpMixed>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Response> { if "" == url { return Err(InvalidArgumentException { message: "$url must not be an empty string".to_string(), @@ -255,12 +253,12 @@ impl HttpDownloader { } /// Create an async copy operation - pub fn add_copy( + pub async fn add_copy( &mut self, url: &str, to: &str, options: IndexMap<String, PhpMixed>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Response> { if "" == url { return Err(InvalidArgumentException { message: "$url must not be an empty string".to_string(), @@ -292,11 +290,7 @@ impl HttpDownloader { /// @phpstan-param Request $request /// @return array{Job, PromiseInterface} - fn add_job( - &mut self, - mut request: Request, - sync: bool, - ) -> Result<(JobHandle, Box<dyn PromiseInterface>)> { + async fn add_job(&mut self, mut request: Request, sync: bool) -> Result<(JobHandle, Response)> { request.options = array_replace_recursive(self.options.clone(), request.options); let id = self.id_gen; diff --git a/crates/shirabe/src/util/loop.rs b/crates/shirabe/src/util/loop.rs index 1463d5e..18f2359 100644 --- a/crates/shirabe/src/util/loop.rs +++ b/crates/shirabe/src/util/loop.rs @@ -4,7 +4,6 @@ use crate::util::HttpDownloader; use crate::util::ProcessExecutor; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::symfony::component::console::helper::ProgressBar; use shirabe_php_shim::microtime; diff --git a/crates/shirabe/src/util/process_executor.rs b/crates/shirabe/src/util/process_executor.rs index cd25fbc..1ee821c 100644 --- a/crates/shirabe/src/util/process_executor.rs +++ b/crates/shirabe/src/util/process_executor.rs @@ -6,8 +6,6 @@ use indexmap::IndexMap; use std::sync::{LazyLock, Mutex}; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; -use shirabe_external_packages::react::promise::Promise; -use shirabe_external_packages::react::promise::PromiseInterface; use shirabe_external_packages::seld::signal::SignalHandler; use shirabe_external_packages::symfony::component::process::ExecutableFinder; use shirabe_external_packages::symfony::component::process::Process; @@ -375,7 +373,7 @@ impl ProcessExecutor { } /// starts a process on the commandline in async mode - pub fn execute_async<C, W>(&mut self, command: C, cwd: W) -> Result<Box<dyn PromiseInterface>> + pub async fn execute_async<C, W>(&mut self, command: C, cwd: W) -> Result<Process> where C: IntoExecCommand, W: IntoExecCwd, diff --git a/crates/shirabe/src/util/sync_helper.rs b/crates/shirabe/src/util/sync_helper.rs index f22b532..6cf2467 100644 --- a/crates/shirabe/src/util/sync_helper.rs +++ b/crates/shirabe/src/util/sync_helper.rs @@ -5,7 +5,7 @@ use crate::downloader::DownloaderInterface; use crate::package::PackageInterface; use crate::util::r#loop::Loop; use anyhow::Result; -use shirabe_external_packages::react::promise::PromiseInterface; +use shirabe_php_shim::PhpMixed; pub enum DownloaderOrManager<'a> { Interface(&'a dyn DownloaderInterface), @@ -13,61 +13,61 @@ pub enum DownloaderOrManager<'a> { } impl<'a> DownloaderOrManager<'a> { - fn download( + async fn download( &self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { match self { Self::Interface(d) => d.download3(package, path, prev_package), Self::Manager(d) => d.borrow().download(package, path, prev_package), } } - fn prepare( + async fn prepare( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { match self { Self::Interface(d) => d.prepare(r#type, package, path, prev_package), Self::Manager(d) => d.borrow().prepare(r#type, package, path, prev_package), } } - fn install( + async fn install( &self, package: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { match self { Self::Interface(d) => d.install2(package, path), Self::Manager(d) => d.borrow().install(package, path), } } - fn update( + async fn update( &self, package: &dyn PackageInterface, prev_package: &dyn PackageInterface, path: &str, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { match self { Self::Interface(d) => d.update(package, prev_package, path), Self::Manager(d) => d.borrow().update(package, prev_package, path), } } - fn cleanup( + async fn cleanup( &self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>, - ) -> Result<Box<dyn PromiseInterface>> { + ) -> Result<Option<PhpMixed>> { match self { Self::Interface(d) => d.cleanup(r#type, package, path, prev_package), Self::Manager(d) => d.borrow().cleanup(r#type, package, path, prev_package), |
