diff --git a/Cargo.lock b/Cargo.lock index cec5aed..7c6e83e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2867,6 +2867,8 @@ name = "revive-dt-config" version = "0.1.0" dependencies = [ "clap", + "semver 1.0.26", + "temp-dir", ] [[package]] @@ -2884,6 +2886,7 @@ dependencies = [ "revive-dt-format", "revive-dt-node", "revive-dt-node-interaction", + "revive-dt-solc-binaries", "revive-solc-json-interface", "semver 1.0.26", "serde", diff --git a/Cargo.toml b/Cargo.toml index 27d502a..ffda817 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ revive-dt-format = { version = "0.1.0", path = "crates/format" } revive-dt-node = { version = "0.1.0", path = "crates/node" } revive-dt-node-interaction = { version = "0.1.0", path = "crates/node-interaction" } revive-dt-node-pool = { version = "0.1.0", path = "crates/node-pool" } +revive-dt-solc-binaries = { version = "0.1.0", path = "crates/solc-binaries" } anyhow = "1.0" clap = { version = "4", features = ["derive"] } diff --git a/crates/solc-binaries/src/cache.rs b/crates/solc-binaries/src/cache.rs index eab0154..acc8a90 100644 --- a/crates/solc-binaries/src/cache.rs +++ b/crates/solc-binaries/src/cache.rs @@ -5,6 +5,7 @@ use std::{ collections::HashSet, fs::{File, create_dir_all}, io::Write, + os::unix::fs::PermissionsExt, path::{Path, PathBuf}, sync::Mutex, }; @@ -50,17 +51,33 @@ impl SolcCacher { return Ok(file_path); } - if file_path.exists() { - self.cached_binaries.insert(file_path.clone()); - return Ok(file_path); - } - create_dir_all(directory)?; - let buf = downloader.download()?; - File::create_new(&file_path) - .expect("should not exist because of above early return") - .write_all(&buf)?; + let Ok(mut file) = File::create_new(&file_path) else { + self.cached_binaries.insert(file_path.clone()); + return Ok(file_path); + }; + + file.write_all(&downloader.download()?)?; + + #[cfg(unix)] + { + let mut permissions = file.metadata()?.permissions(); + let mode = permissions.mode() | 0o111; + permissions.set_mode(mode); + file.set_permissions(permissions)?; + } + + #[cfg(target_os = "macos")] + std::process::Command::new("xattr") + .arg("-d") + .arg("com.apple.quarantine") + .arg(&file_path) + .stderr(std::process::Stdio::null()) + .stdout(std::process::Stdio::null()) + .stdout(std::process::Stdio::null()) + .spawn()? + .wait()?; Ok(file_path) }