From 06dd6a71c409ce0c5f1b54a2eef303a87c2b4107 Mon Sep 17 00:00:00 2001 From: IQuant Date: Fri, 23 Aug 2024 12:51:53 +0300 Subject: [PATCH] Automated commit: v0.21.4 --- noita-proxy/.gitignore | 1 + noita-proxy/Cargo.lock | 6 +- noita-proxy/Cargo.toml | 4 +- noita-proxy/src/bookkeeping/mod_manager.rs | 72 ++++++++++++++++------ noita-proxy/src/bookkeeping/releases.rs | 11 +++- 5 files changed, 68 insertions(+), 26 deletions(-) diff --git a/noita-proxy/.gitignore b/noita-proxy/.gitignore index a96d4c7b..e1975b04 100644 --- a/noita-proxy/.gitignore +++ b/noita-proxy/.gitignore @@ -3,3 +3,4 @@ worldlog.bin flamegraph.svg perf.data perf.data.old +mod.zip diff --git a/noita-proxy/Cargo.lock b/noita-proxy/Cargo.lock index 13cb176c..fc3107b2 100644 --- a/noita-proxy/Cargo.lock +++ b/noita-proxy/Cargo.lock @@ -1993,7 +1993,7 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "noita-proxy" -version = "0.21.3" +version = "0.21.4" dependencies = [ "argh", "bincode", @@ -4509,9 +4509,9 @@ dependencies = [ [[package]] name = "zip" -version = "2.1.6" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e" +checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" dependencies = [ "aes", "arbitrary", diff --git a/noita-proxy/Cargo.toml b/noita-proxy/Cargo.toml index 57144dfa..2e6c60ed 100644 --- a/noita-proxy/Cargo.toml +++ b/noita-proxy/Cargo.toml @@ -5,7 +5,7 @@ resolver = "2" [package] name = "noita-proxy" description = "Noita Entangled Worlds companion app." -version = "0.21.3" +version = "0.21.4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -33,7 +33,7 @@ reqwest = { version = "0.12.4", features = ["blocking", "json", "http2", "rustls serde_json = "1.0.117" thiserror = "1.0.61" poll-promise = "0.3.0" -zip = "2.1.4" +zip = "2.2.0" self-replace = "1.3.7" bytemuck = { version = "1.16.0", features = ["derive"] } bincode = "1.3.3" diff --git a/noita-proxy/src/bookkeeping/mod_manager.rs b/noita-proxy/src/bookkeeping/mod_manager.rs index 30099676..451185ae 100644 --- a/noita-proxy/src/bookkeeping/mod_manager.rs +++ b/noita-proxy/src/bookkeeping/mod_manager.rs @@ -35,6 +35,7 @@ enum State { EyreErrorReport(eyre::Report), UnpackMod(Promise>), ConfirmInstall, + UnpackDone, } pub struct Modmanager { @@ -236,7 +237,7 @@ impl Modmanager { assert!(mod_path.ends_with("quant.ew")); fs::remove_dir_all(mod_path).ok(); info!("Current mod deleted"); - + info!("Switching to DownloadMod state"); self.state = State::DownloadMod(promise) } if ui.button(tr("modman_another_path")).clicked() { @@ -262,28 +263,37 @@ impl Modmanager { }; match promise.block_and_take() { Ok(downloader) => { - let path = downloader.path().to_path_buf(); - let directory = settings.mod_path(); - let promise: Promise> = - Promise::spawn_thread("unpack", move || { - extract_and_remove_zip(path, directory) - }); - self.state = State::UnpackMod(promise); + if downloader.ready().is_some() { + let path = downloader.path().to_path_buf(); + let directory = settings.mod_path(); + match downloader.into_ready() { + Ok(_) => { + let promise: Promise> = + Promise::spawn_thread("unpack", move || { + extract_and_remove_zip(path, directory) + }); + info!("Switching to UnpackMod state"); + self.state = State::UnpackMod(promise); + } + Err(err) => { + info!("Switching to EyreErrorReport state"); + self.state = State::EyreErrorReport(err) + } + } + } else { + self.state = State::DownloadMod(Promise::from_ready(Ok(downloader))) + } + } + Err(err) => { + info!("Switching to EyreErrorReport state (2)"); + self.state = State::EyreErrorReport(err) } - Err(err) => self.state = State::EyreErrorReport(err), } } } State::UnpackMod(promise) => { match promise.ready() { - Some(Ok(_)) => { - ui.label(tr("modman_installed")); - if ui.button(tr("button_continue")).clicked() { - self.state = State::Done; - return; - }; - } - Some(Err(_)) => {} + Some(_) => {} None => { ui.label(tr("modman_unpacking")); } @@ -293,7 +303,10 @@ impl Modmanager { unreachable!(); }; match promise.block_and_take() { - Ok(_) => {} + Ok(_) => { + info!("Switching to UnpackDone state"); + self.state = State::UnpackDone; + } Err(err) => { self.state = State::EyreErrorReport(err); } @@ -307,6 +320,14 @@ impl Modmanager { } } State::Done => {} + State::UnpackDone => { + ui.label(tr("modman_installed")); + if ui.button(tr("button_continue")).clicked() { + info!("Switching to Done state"); + self.state = State::Done; + return; + }; + } } } @@ -350,14 +371,25 @@ fn mod_downloader_for( } fn extract_and_remove_zip(zip_file: PathBuf, extract_to: PathBuf) -> Result<(), ReleasesError> { + extract_zip(&zip_file, extract_to)?; + fs::remove_file(&zip_file).ok(); + Ok(()) +} + +fn extract_zip(zip_file: &PathBuf, extract_to: PathBuf) -> Result<(), eyre::Error> { + let zip_file = zip_file.canonicalize().unwrap_or(zip_file.to_path_buf()); let reader = File::open(&zip_file) .wrap_err_with(|| format!("Failed to open zip file: {}", zip_file.display()))?; - let mut zip = zip::ZipArchive::new(reader).wrap_err("Failed to create Zip Archive reader")?; + let mut zip = zip::ZipArchive::new(reader).wrap_err_with(|| { + format!( + "Failed to create Zip Archive reader: {}", + zip_file.display() + ) + })?; info!("Extracting zip file"); zip.extract(&extract_to) .wrap_err_with(|| format!("Failed to extract zip to: {}", extract_to.display()))?; info!("Zip file extracted"); - fs::remove_file(&zip_file).ok(); Ok(()) } diff --git a/noita-proxy/src/bookkeeping/releases.rs b/noita-proxy/src/bookkeeping/releases.rs index 546e6288..f44cf054 100644 --- a/noita-proxy/src/bookkeeping/releases.rs +++ b/noita-proxy/src/bookkeeping/releases.rs @@ -118,6 +118,10 @@ impl Downloader { self.handle.ready() } + pub fn into_ready(self) -> Result<(), ReleasesError> { + self.handle.block_and_take() + } + pub fn path(&self) -> &Path { &self.path } @@ -227,7 +231,12 @@ pub fn get_release_by_tag(client: &Client, tag: Tag) -> Result