aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/downloader
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/downloader')
-rw-r--r--crates/shirabe/src/downloader/archive_downloader.rs3
-rw-r--r--crates/shirabe/src/downloader/download_manager.rs71
-rw-r--r--crates/shirabe/src/downloader/file_downloader.rs33
-rw-r--r--crates/shirabe/src/downloader/fossil_downloader.rs6
-rw-r--r--crates/shirabe/src/downloader/git_downloader.rs28
-rw-r--r--crates/shirabe/src/downloader/gzip_downloader.rs24
-rw-r--r--crates/shirabe/src/downloader/hg_downloader.rs6
-rw-r--r--crates/shirabe/src/downloader/path_downloader.rs32
-rw-r--r--crates/shirabe/src/downloader/perforce_downloader.rs6
-rw-r--r--crates/shirabe/src/downloader/phar_downloader.rs20
-rw-r--r--crates/shirabe/src/downloader/rar_downloader.rs22
-rw-r--r--crates/shirabe/src/downloader/svn_downloader.rs18
-rw-r--r--crates/shirabe/src/downloader/tar_downloader.rs20
-rw-r--r--crates/shirabe/src/downloader/vcs_downloader.rs56
-rw-r--r--crates/shirabe/src/downloader/xz_downloader.rs20
-rw-r--r--crates/shirabe/src/downloader/zip_downloader.rs30
16 files changed, 225 insertions, 170 deletions
diff --git a/crates/shirabe/src/downloader/archive_downloader.rs b/crates/shirabe/src/downloader/archive_downloader.rs
index 4842b05..ac898d5 100644
--- a/crates/shirabe/src/downloader/archive_downloader.rs
+++ b/crates/shirabe/src/downloader/archive_downloader.rs
@@ -36,6 +36,7 @@ pub trait ArchiveDownloader {
self.cleanup_executed_mut().remove(package.get_name());
self.inner_mut()
.prepare(r#type, package, path, prev_package)
+ .await
}
async fn cleanup(
@@ -49,6 +50,7 @@ pub trait ArchiveDownloader {
.insert(package.get_name().to_string(), true);
self.inner_mut()
.cleanup(r#type, package, path, prev_package)
+ .await
}
/// @inheritDoc
@@ -122,6 +124,7 @@ pub trait ArchiveDownloader {
let _ = file_name;
+ // TODO(phase-c-promise): rewrite extract().then(onFulfilled/onRejected) + renameRecursively chain as an await sequence
let promise = self.extract(package, "", &temporary_dir)?;
// TODO(phase-b): the original PHP chains React promise `.then(onFulfilled, onRejected)`
diff --git a/crates/shirabe/src/downloader/download_manager.rs b/crates/shirabe/src/downloader/download_manager.rs
index 3100e29..f5201cc 100644
--- a/crates/shirabe/src/downloader/download_manager.rs
+++ b/crates/shirabe/src/downloader/download_manager.rs
@@ -214,7 +214,7 @@ impl DownloadManager {
let source = match array_shift(&mut sources) {
Some(s) => s,
None => {
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
};
if retry_state {
@@ -233,12 +233,15 @@ impl DownloadManager {
let downloader = match self.get_downloader_for_package(package)? {
Some(d) => d,
None => {
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
};
// TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch
- let result = match downloader.download3(package, &target_dir, prev_package) {
+ let result = match downloader
+ .download3(package, &target_dir, prev_package)
+ .await
+ {
Ok(r) => r,
Err(e) => {
// PHP closure handleError: rethrow if not RuntimeException or if IrrecoverableDownloadException
@@ -271,15 +274,8 @@ impl DownloadManager {
};
// PHP: $result->then(static fn ($res) => $res, $handleError);
- // TODO(phase-b): chain $handleError as the rejection handler on the promise
- let res = result.then(
- Some(Box::new(move |res: Option<PhpMixed>| -> Option<PhpMixed> {
- res
- })),
- None,
- );
-
- return Ok(res);
+ // The rejection handler ($handleError) is already applied via the try/catch (the Err arm above).
+ return Ok(result);
}
}
@@ -299,10 +295,12 @@ impl DownloadManager {
) -> 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);
+ return downloader
+ .prepare(r#type, package, &target_dir, prev_package)
+ .await;
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
/// Installs package into target dir.
@@ -320,10 +318,10 @@ impl DownloadManager {
) -> 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);
+ return downloader.install2(package, &target_dir).await;
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
/// Updates package from initial to target version.
@@ -346,19 +344,26 @@ impl DownloadManager {
// no downloaders present means update from metapackage to metapackage, nothing to do
if initial_downloader.is_none() && downloader.is_none() {
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
// if we have a downloader present before, but not after, the package became a metapackage and its files should be removed
if downloader.is_none() {
- return initial_downloader.unwrap().remove2(initial, &target_dir);
+ return initial_downloader
+ .unwrap()
+ .remove2(initial, &target_dir)
+ .await;
}
let initial_type = self.get_downloader_type(initial_downloader.unwrap());
let target_type = self.get_downloader_type(downloader.unwrap());
if initial_type == target_type {
// TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch
- match downloader.unwrap().update(initial, target, &target_dir) {
+ match downloader
+ .unwrap()
+ .update(initial, target, &target_dir)
+ .await
+ {
Ok(p) => return Ok(p),
Err(e) => {
// TODO(phase-b): downcast to RuntimeException
@@ -383,18 +388,12 @@ impl DownloadManager {
// if downloader type changed, or update failed and user asks for reinstall,
// we wipe the dir and do a new install instead of updating it
- let promise = initial_downloader.unwrap().remove2(initial, &target_dir)?;
-
- let target_dir_owned = target_dir.clone();
- // TODO(phase-b): capture self and target into the closure; type mismatch with then signature.
- let _ = target_dir_owned;
- Ok(promise.then(
- Some(Box::new(move |res: Option<PhpMixed>| -> Option<PhpMixed> {
- let _ = res;
- todo!("self.install(target, &target_dir_owned)")
- })),
- None,
- ))
+ // PHP: return $promise->then(fn () => $this->install($target, $targetDir));
+ let _ = initial_downloader
+ .unwrap()
+ .remove2(initial, &target_dir)
+ .await?;
+ self.install(target, &target_dir).await
}
/// Removes package from target dir.
@@ -409,10 +408,10 @@ impl DownloadManager {
) -> 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);
+ return downloader.remove2(package, &target_dir).await;
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
/// Cleans up a failed operation
@@ -431,10 +430,12 @@ impl DownloadManager {
) -> 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);
+ return downloader
+ .cleanup(r#type, package, &target_dir, prev_package)
+ .await;
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
/// Determines the install preference of a package
diff --git a/crates/shirabe/src/downloader/file_downloader.rs b/crates/shirabe/src/downloader/file_downloader.rs
index 0920342..452ce8c 100644
--- a/crates/shirabe/src/downloader/file_downloader.rs
+++ b/crates/shirabe/src/downloader/file_downloader.rs
@@ -199,6 +199,7 @@ impl DownloaderInterface for FileDownloader {
.borrow_mut()
.ensure_directory_exists(&dir_of_file)?;
+ // TODO(phase-c-promise): rewrite the accept/reject/retry promise orchestration as an async loop.
// TODO(plugin): inline closures rely on captured $accept/$reject/$urls/$retries. In Rust
// we'd need a struct holding shared state — left as a phase-b refactor.
let _ = (output, &urls, &mut retries, cache_key_generator, &file_name);
@@ -218,7 +219,7 @@ impl DownloaderInterface for FileDownloader {
_path: &str,
_prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- Ok(react_promise_resolve(Some(PhpMixed::Null)))
+ Ok(Some(PhpMixed::Null))
}
/// @inheritDoc
@@ -273,7 +274,7 @@ impl DownloaderInterface for FileDownloader {
}
}
- Ok(react_promise_resolve(Some(PhpMixed::Null)))
+ Ok(Some(PhpMixed::Null))
}
/// @inheritDoc
@@ -333,7 +334,7 @@ impl DownloaderInterface for FileDownloader {
}
}
- Ok(react_promise_resolve(Some(PhpMixed::Null)))
+ Ok(Some(PhpMixed::Null))
}
/// @inheritDoc
@@ -349,10 +350,9 @@ impl DownloaderInterface for FileDownloader {
self.get_install_operation_appendix(target, path)
));
- let _promise = self.remove(initial, path, false)?;
- // TODO(phase-b): chain `.then(|| self.install(target, path, false))`
- let _ = (initial, target, path);
- todo!("phase-b: chain promise.then(|| self.install(target, path, false))")
+ // PHP: return $this->remove($initial, $path, false)->then(fn () => $this->install($target, $path, false));
+ let _ = self.remove(initial, path, false).await?;
+ self.install(target, path, false).await
}
/// @inheritDoc
@@ -368,11 +368,20 @@ impl DownloaderInterface for FileDownloader {
UninstallOperation::format(package, false)
));
}
- let _promise = self.filesystem.borrow_mut().remove_directory_async(path)?;
+ let result = self
+ .filesystem
+ .borrow_mut()
+ .remove_directory_async(path)
+ .await?;
+ if !result {
+ return Err(RuntimeException {
+ message: format!("Could not completely delete {}, aborting.", path),
+ code: 0,
+ }
+ .into());
+ }
- // TODO(phase-b): chain `.then(|result| if !result { throw RuntimeException })`
- let _ = path;
- todo!("phase-b: chain promise.then(|result| {{ if !result {{ throw RuntimeException }} }})")
+ Ok(None)
}
}
@@ -384,6 +393,8 @@ impl ChangeReportInterface for FileDownloader {
package: &dyn PackageInterface,
path: &str,
) -> Result<Option<String>> {
+ // TODO(phase-c-promise): get_local_changes drives promises via http_downloader/process wait();
+ // converting requires deciding whether ChangeReportInterface::get_local_changes becomes async. Left as-is.
// TODO(phase-b): swap self.io to NullIO and restore — needs a take/swap helper
let mut null_io = NullIO::new();
diff --git a/crates/shirabe/src/downloader/fossil_downloader.rs b/crates/shirabe/src/downloader/fossil_downloader.rs
index fc3d0e8..25f3a31 100644
--- a/crates/shirabe/src/downloader/fossil_downloader.rs
+++ b/crates/shirabe/src/downloader/fossil_downloader.rs
@@ -35,7 +35,7 @@ impl FossilDownloader {
_url: String,
_prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_install(
@@ -95,7 +95,7 @@ impl FossilDownloader {
&mut output,
)?;
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_update(
@@ -147,7 +147,7 @@ impl FossilDownloader {
&mut output,
)?;
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub fn get_local_changes(
diff --git a/crates/shirabe/src/downloader/git_downloader.rs b/crates/shirabe/src/downloader/git_downloader.rs
index e6bc16b..e43d31b 100644
--- a/crates/shirabe/src/downloader/git_downloader.rs
+++ b/crates/shirabe/src/downloader/git_downloader.rs
@@ -66,7 +66,7 @@ impl GitDownloader {
) -> 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));
+ return Ok(None);
}
GitUtil::clean_env(&self.inner.process);
@@ -129,7 +129,7 @@ impl GitDownloader {
.into());
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_install(
@@ -282,7 +282,7 @@ impl GitDownloader {
let _ = new_ref;
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_update(
@@ -448,7 +448,7 @@ impl GitDownloader {
self.update_origin_url(&path, target.get_source_url().unwrap());
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub fn get_local_changes(&self, _package: &dyn PackageInterface, path: &str) -> Option<String> {
@@ -717,23 +717,23 @@ impl GitDownloader {
let changes = match self.get_local_changes(package, &path) {
Some(c) => c,
- None => return Ok(promise::resolve(None)),
+ None => return Ok(None),
};
if !self.inner.io.is_interactive() {
let discard_changes = self.inner.config.borrow_mut().get("discard-changes");
if discard_changes.as_bool() == Some(true) {
- return self.discard_changes(&path);
+ return self.discard_changes(&path).await;
}
if discard_changes.as_string() == Some("stash") {
if !update {
- return self.inner.clean_changes(package, &path, update);
+ return self.inner.clean_changes(package, &path, update).await;
}
- return self.stash_changes(&path);
+ return self.stash_changes(&path).await;
}
- return self.inner.clean_changes(package, &path, update);
+ return self.inner.clean_changes(package, &path, update).await;
}
let changes: Vec<String> = array_map(
@@ -780,7 +780,7 @@ impl GitDownloader {
let mut do_help = false;
match answer.as_deref() {
Some("y") => {
- self.discard_changes(&path)?;
+ self.discard_changes(&path).await?;
break 'outer;
}
Some("s") => {
@@ -788,7 +788,7 @@ impl GitDownloader {
// goto help;
do_help = true;
} else {
- self.stash_changes(&path)?;
+ self.stash_changes(&path).await?;
break 'outer;
}
}
@@ -847,7 +847,7 @@ impl GitDownloader {
}
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) fn reapply_changes(&mut self, path: &str) -> Result<()> {
@@ -1254,7 +1254,7 @@ impl GitDownloader {
self.has_discarded_changes.insert(path, true);
- Ok(promise::resolve(None))
+ Ok(None)
}
/// @phpstan-return PromiseInterface<void|null>
@@ -1281,7 +1281,7 @@ impl GitDownloader {
self.has_stashed_changes.insert(path, true);
- Ok(promise::resolve(None))
+ Ok(None)
}
/// @throws \RuntimeException
diff --git a/crates/shirabe/src/downloader/gzip_downloader.rs b/crates/shirabe/src/downloader/gzip_downloader.rs
index a3fbb49..d852a00 100644
--- a/crates/shirabe/src/downloader/gzip_downloader.rs
+++ b/crates/shirabe/src/downloader/gzip_downloader.rs
@@ -90,12 +90,12 @@ impl GzipDownloader {
(),
)? == 0
{
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
if extension_loaded("zlib") {
self.extract_using_ext(file, &target_filepath);
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
let process_error = format!(
@@ -111,7 +111,7 @@ impl GzipDownloader {
self.extract_using_ext(file, &target_filepath);
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
fn extract_using_ext(&self, file: &str, target_filepath: &str) {
@@ -141,7 +141,9 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -151,7 +153,9 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -160,7 +164,7 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -169,7 +173,7 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -178,7 +182,7 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -188,6 +192,8 @@ impl crate::downloader::DownloaderInterface for GzipDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/hg_downloader.rs b/crates/shirabe/src/downloader/hg_downloader.rs
index 16cf73c..56f3b6f 100644
--- a/crates/shirabe/src/downloader/hg_downloader.rs
+++ b/crates/shirabe/src/downloader/hg_downloader.rs
@@ -43,7 +43,7 @@ impl HgDownloader {
.into());
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_install(
@@ -97,7 +97,7 @@ impl HgDownloader {
.into());
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_update(
@@ -148,7 +148,7 @@ impl HgDownloader {
};
hg_utils.run_command(up_command, url, Some(path));
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub fn get_local_changes(
diff --git a/crates/shirabe/src/downloader/path_downloader.rs b/crates/shirabe/src/downloader/path_downloader.rs
index 3da4915..f677a50 100644
--- a/crates/shirabe/src/downloader/path_downloader.rs
+++ b/crates/shirabe/src/downloader/path_downloader.rs
@@ -93,7 +93,7 @@ impl PathDownloader {
let real_url = real_url.unwrap();
if realpath(&path).as_deref() == Some(&real_url) {
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
if format!(
@@ -119,7 +119,7 @@ impl PathDownloader {
.into());
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub async fn install(
@@ -155,7 +155,7 @@ impl PathDownloader {
);
}
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
// Get the transport options with default values
@@ -290,7 +290,7 @@ impl PathDownloader {
self.inner.io.write_error3("", true, io_interface::NORMAL);
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub async fn remove(
@@ -339,7 +339,7 @@ impl PathDownloader {
.into());
}
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
let url = package.get_dist_url().ok_or_else(|| RuntimeException {
@@ -378,10 +378,10 @@ impl PathDownloader {
);
}
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
- self.inner.remove(package, &path, output)
+ self.inner.remove(package, &path, output).await
}
pub fn get_vcs_reference(&self, package: &dyn PackageInterface, path: &str) -> Option<String> {
@@ -549,7 +549,9 @@ impl DownloaderInterface for PathDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -559,7 +561,9 @@ impl DownloaderInterface for PathDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -568,7 +572,7 @@ impl DownloaderInterface for PathDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -577,7 +581,7 @@ impl DownloaderInterface for PathDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -586,7 +590,7 @@ impl DownloaderInterface for PathDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -596,6 +600,8 @@ impl DownloaderInterface for PathDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/perforce_downloader.rs b/crates/shirabe/src/downloader/perforce_downloader.rs
index ae433ef..fdb0f0d 100644
--- a/crates/shirabe/src/downloader/perforce_downloader.rs
+++ b/crates/shirabe/src/downloader/perforce_downloader.rs
@@ -40,7 +40,7 @@ impl PerforceDownloader {
_url: String,
_prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
pub async fn do_install(
@@ -70,7 +70,7 @@ impl PerforceDownloader {
.sync_code_base(label.as_deref());
self.perforce.as_mut().unwrap().cleanup_client_spec();
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
fn get_label_from_source_reference(&self, source_ref: String) -> Option<String> {
@@ -118,7 +118,7 @@ impl PerforceDownloader {
path: String,
url: String,
) -> Result<Option<PhpMixed>> {
- self.do_install(target, path, url)
+ self.do_install(target, path, url).await
}
pub fn get_local_changes(
diff --git a/crates/shirabe/src/downloader/phar_downloader.rs b/crates/shirabe/src/downloader/phar_downloader.rs
index f3fffb9..9cfb18f 100644
--- a/crates/shirabe/src/downloader/phar_downloader.rs
+++ b/crates/shirabe/src/downloader/phar_downloader.rs
@@ -59,7 +59,7 @@ impl PharDownloader {
// https://github.com/koto/phar-util
// http://blog.kotowicz.net/2010/08/hardening-php-how-to-securely-include.html
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
}
@@ -75,7 +75,9 @@ impl DownloaderInterface for PharDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -85,7 +87,9 @@ impl DownloaderInterface for PharDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -94,7 +98,7 @@ impl DownloaderInterface for PharDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -103,7 +107,7 @@ impl DownloaderInterface for PharDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -112,7 +116,7 @@ impl DownloaderInterface for PharDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -122,6 +126,8 @@ impl DownloaderInterface for PharDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/rar_downloader.rs b/crates/shirabe/src/downloader/rar_downloader.rs
index 71efc29..c6031d9 100644
--- a/crates/shirabe/src/downloader/rar_downloader.rs
+++ b/crates/shirabe/src/downloader/rar_downloader.rs
@@ -77,7 +77,7 @@ impl RarDownloader {
(),
)? == 0
{
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
process_error = Some(format!(
@@ -139,7 +139,7 @@ impl RarDownloader {
rar_archive.close();
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
}
@@ -155,7 +155,9 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -165,7 +167,9 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -174,7 +178,7 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -183,7 +187,7 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -192,7 +196,7 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -202,6 +206,8 @@ impl crate::downloader::DownloaderInterface for RarDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/svn_downloader.rs b/crates/shirabe/src/downloader/svn_downloader.rs
index 65e3e37..f3d0fef 100644
--- a/crates/shirabe/src/downloader/svn_downloader.rs
+++ b/crates/shirabe/src/downloader/svn_downloader.rs
@@ -57,7 +57,7 @@ impl SvnDownloader {
.into());
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_install(
@@ -101,7 +101,7 @@ impl SvnDownloader {
Some(path),
)?;
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) async fn do_update(
@@ -152,7 +152,7 @@ impl SvnDownloader {
None,
)?;
- Ok(promise::resolve(None))
+ Ok(None)
}
pub fn get_local_changes(&self, package: &dyn PackageInterface, path: &str) -> Option<String> {
@@ -210,7 +210,7 @@ impl SvnDownloader {
) -> anyhow::Result<Option<PhpMixed>> {
let changes = self.get_local_changes(package, path);
if changes.is_none() {
- return Ok(promise::resolve(None));
+ return Ok(None);
}
if !self.inner.io.is_interactive() {
@@ -222,10 +222,10 @@ impl SvnDownloader {
.as_bool()
== Some(true)
{
- return self.discard_changes(path);
+ return self.discard_changes(path).await;
}
- return self.inner.clean_changes(package, path, update);
+ return self.inner.clean_changes(package, path, update).await;
}
let changes_str = changes.unwrap();
@@ -273,7 +273,7 @@ impl SvnDownloader {
.as_string()
{
Some("y") => {
- self.discard_changes(path)?;
+ self.discard_changes(path).await?;
break;
}
Some("n") => {
@@ -310,7 +310,7 @@ impl SvnDownloader {
}
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) fn get_commit_logs(
@@ -421,7 +421,7 @@ impl SvnDownloader {
.into());
}
- Ok(promise::resolve(None))
+ Ok(None)
}
pub(crate) fn has_metadata_repository(&self, path: &str) -> bool {
diff --git a/crates/shirabe/src/downloader/tar_downloader.rs b/crates/shirabe/src/downloader/tar_downloader.rs
index b65d0e3..c720ccf 100644
--- a/crates/shirabe/src/downloader/tar_downloader.rs
+++ b/crates/shirabe/src/downloader/tar_downloader.rs
@@ -54,7 +54,7 @@ impl TarDownloader {
let archive = PharData::new(file.to_string());
archive.extract_to(path, None, true);
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
}
@@ -70,7 +70,9 @@ impl DownloaderInterface for TarDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -80,7 +82,9 @@ impl DownloaderInterface for TarDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -89,7 +93,7 @@ impl DownloaderInterface for TarDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -98,7 +102,7 @@ impl DownloaderInterface for TarDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -107,7 +111,7 @@ impl DownloaderInterface for TarDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -117,6 +121,8 @@ impl DownloaderInterface for TarDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/vcs_downloader.rs b/crates/shirabe/src/downloader/vcs_downloader.rs
index 1219ab1..096e93d 100644
--- a/crates/shirabe/src/downloader/vcs_downloader.rs
+++ b/crates/shirabe/src/downloader/vcs_downloader.rs
@@ -65,7 +65,7 @@ impl VcsDownloaderBase {
) -> 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))
+ Ok(None)
}
}
@@ -142,7 +142,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<Option<PhpMixed>> =
- self.do_download(package, path, &url, prev_package);
+ self.do_download(package, path, &url, prev_package).await;
match attempt {
Ok(promise) => return Ok(promise),
Err(e) => {
@@ -182,7 +182,7 @@ pub trait VcsDownloader:
}
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
async fn prepare(
@@ -193,7 +193,8 @@ pub trait VcsDownloader:
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
if r#type == "update" {
- self.clean_changes(prev_package.unwrap(), path, true)?;
+ self.clean_changes(prev_package.unwrap(), path, true)
+ .await?;
self.has_cleaned_changes_mut()
.insert(prev_package.unwrap().get_unique_name(), true);
} else if r#type == "install" {
@@ -201,10 +202,10 @@ pub trait VcsDownloader:
.borrow_mut()
.empty_directory(path, true)?;
} else if r#type == "uninstall" {
- self.clean_changes(package, path, false)?;
+ self.clean_changes(package, path, false).await?;
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
async fn cleanup(
@@ -227,7 +228,7 @@ pub trait VcsDownloader:
.shift_remove(&prev_package.unwrap().get_unique_name());
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
async fn install(
@@ -255,7 +256,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<Option<PhpMixed>> = self.do_install(package, path, &url);
+ let attempt: Result<Option<PhpMixed>> = self.do_install(package, path, &url).await;
match attempt {
Ok(_) => break,
Err(e) => {
@@ -295,7 +296,7 @@ pub trait VcsDownloader:
}
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
async fn update(
@@ -326,7 +327,8 @@ 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<Option<PhpMixed>> = self.do_update(initial, target, path, &url);
+ let attempt: Result<Option<PhpMixed>> =
+ self.do_update(initial, target, path, &url).await;
match attempt {
Ok(_) => {
exception = None;
@@ -404,7 +406,7 @@ pub trait VcsDownloader:
}
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
async fn remove(
@@ -418,28 +420,20 @@ pub trait VcsDownloader:
io_interface::NORMAL,
);
- let promise = self
+ let result = self
.filesystem_mut()
.borrow_mut()
- .remove_directory_async(path)?;
+ .remove_directory_async(path)
+ .await?;
+ if !result {
+ return Err(RuntimeException {
+ message: format!("Could not completely delete {}, aborting.", path),
+ code: 0,
+ }
+ .into());
+ }
- let path = path.to_string();
- // TODO(phase-b): closure return type mismatches PromiseInterface::then signature.
- Ok(promise.then(
- Some(Box::new(
- move |result: Option<PhpMixed>| -> Option<PhpMixed> {
- let result_bool = result.as_ref().and_then(|v| v.as_bool()).unwrap_or(false);
- if !result_bool {
- let _: RuntimeException = RuntimeException {
- message: format!("Could not completely delete {}, aborting.", path),
- code: 0,
- };
- }
- None
- },
- )),
- None,
- ))
+ Ok(None)
}
fn get_vcs_reference(&self, package: &dyn PackageInterface, path: &str) -> Option<String> {
@@ -480,7 +474,7 @@ pub trait VcsDownloader:
.into());
}
- Ok(shirabe_external_packages::react::promise::resolve(None))
+ Ok(None)
}
/// Reapply previously stashed changes if applicable, only called after an update (regardless if successful or not)
diff --git a/crates/shirabe/src/downloader/xz_downloader.rs b/crates/shirabe/src/downloader/xz_downloader.rs
index 6cc960e..d15287d 100644
--- a/crates/shirabe/src/downloader/xz_downloader.rs
+++ b/crates/shirabe/src/downloader/xz_downloader.rs
@@ -64,7 +64,7 @@ impl XzDownloader {
(),
)? == 0
{
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
let process_error = format!(
@@ -89,7 +89,9 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -99,7 +101,9 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -108,7 +112,7 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -117,7 +121,7 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -126,7 +130,7 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -136,6 +140,8 @@ impl crate::downloader::DownloaderInterface for XzDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}
diff --git a/crates/shirabe/src/downloader/zip_downloader.rs b/crates/shirabe/src/downloader/zip_downloader.rs
index ef18f95..88b3d3a 100644
--- a/crates/shirabe/src/downloader/zip_downloader.rs
+++ b/crates/shirabe/src/downloader/zip_downloader.rs
@@ -192,7 +192,9 @@ impl ZipDownloader {
}
}
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn extract_with_system_unzip(
@@ -211,7 +213,7 @@ impl ZipDownloader {
.as_ref()
.map_or(true, |v| v.is_empty());
if unzip_commands_empty {
- return self.extract_with_zip_archive(package, file, path);
+ return self.extract_with_zip_archive(package, file, path).await;
}
let command_spec = UNZIP_COMMANDS.lock().unwrap().as_ref().unwrap()[0].clone();
@@ -268,6 +270,8 @@ impl ZipDownloader {
}
}
+ // TODO(phase-c-promise): execute_async + .then fallback closure captures &mut self/io;
+ // recursive promise flattening, not a mechanical await chain.
// TODO(phase-b): full try_fallback closure deferred — PHP captures `$io`, `$self`
// and several locals by reference, conflicting with Rust's borrow checker because
// `extract_with_zip_archive` later needs `&mut self`. Restructure once the
@@ -350,7 +354,7 @@ impl ZipDownloader {
if extract_result {
zip_archive.close();
- return Ok(shirabe_external_packages::react::promise::resolve(None));
+ return Ok(None);
}
return Err(RuntimeException {
@@ -392,7 +396,7 @@ impl ZipDownloader {
file: &str,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.extract_with_system_unzip(package, file, path)
+ self.extract_with_system_unzip(package, file, path).await
}
pub fn get_error_message(&self, retval: i64, file: &str) -> String {
@@ -433,7 +437,9 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
prev_package: Option<&dyn PackageInterface>,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.download(package, path, prev_package, output)
+ self.inner
+ .download(package, path, prev_package, output)
+ .await
}
async fn prepare(
@@ -443,7 +449,9 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.prepare(r#type, package, path, prev_package)
+ self.inner
+ .prepare(r#type, package, path, prev_package)
+ .await
}
async fn install(
@@ -452,7 +460,7 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.install(package, path, output)
+ self.inner.install(package, path, output).await
}
async fn update(
@@ -461,7 +469,7 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
target: &dyn PackageInterface,
path: &str,
) -> Result<Option<PhpMixed>> {
- self.inner.update(initial, target, path)
+ self.inner.update(initial, target, path).await
}
async fn remove(
@@ -470,7 +478,7 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
path: &str,
output: bool,
) -> Result<Option<PhpMixed>> {
- self.inner.remove(package, path, output)
+ self.inner.remove(package, path, output).await
}
async fn cleanup(
@@ -480,6 +488,8 @@ impl crate::downloader::DownloaderInterface for ZipDownloader {
path: &str,
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
- self.inner.cleanup(r#type, package, path, prev_package)
+ self.inner
+ .cleanup(r#type, package, path, prev_package)
+ .await
}
}