diff options
author | Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> | 2024-08-08 09:19:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-08 00:19:05 -0700 |
commit | 507e5b74ff21161ba8bd947d7d9cee317c0af379 (patch) | |
tree | 8cfd58d46034803cd296d7b3a159c3f84896ec88 /cli/standalone | |
parent | 4e4c96bf66111c6e8ba976ed24594edf7abfcbfb (diff) |
fix: Don't shell out to `unzip` in deno upgrade/compile (#24926)
Use the `zip` crate instead
Fixes #23988.
Diffstat (limited to 'cli/standalone')
-rw-r--r-- | cli/standalone/binary.rs | 81 |
1 files changed, 8 insertions, 73 deletions
diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index ed38e164b..78978cefc 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -54,6 +54,7 @@ use crate::http_util::HttpClientProvider; use crate::npm::CliNpmResolver; use crate::npm::InnerCliNpmResolverRef; use crate::standalone::virtual_fs::VfsEntry; +use crate::util::archive; use crate::util::fs::canonicalize_path_maybe_not_exists; use crate::util::progress_bar::ProgressBar; use crate::util::progress_bar::ProgressBarStyle; @@ -318,72 +319,6 @@ fn u64_from_bytes(arr: &[u8]) -> Result<u64, AnyError> { Ok(u64::from_be_bytes(*fixed_arr)) } -pub fn unpack_into_dir( - exe_name: &str, - archive_name: &str, - archive_data: Vec<u8>, - is_windows: bool, - temp_dir: &tempfile::TempDir, -) -> Result<PathBuf, AnyError> { - let temp_dir_path = temp_dir.path(); - let exe_ext = if is_windows { "exe" } else { "" }; - let archive_path = temp_dir_path.join(exe_name).with_extension("zip"); - let exe_path = temp_dir_path.join(exe_name).with_extension(exe_ext); - assert!(!exe_path.exists()); - - let archive_ext = Path::new(archive_name) - .extension() - .and_then(|ext| ext.to_str()) - .unwrap(); - let unpack_status = match archive_ext { - "zip" if cfg!(windows) => { - fs::write(&archive_path, &archive_data)?; - Command::new("tar.exe") - .arg("xf") - .arg(&archive_path) - .arg("-C") - .arg(temp_dir_path) - .spawn() - .map_err(|err| { - if err.kind() == std::io::ErrorKind::NotFound { - std::io::Error::new( - std::io::ErrorKind::NotFound, - "`tar.exe` was not found in your PATH", - ) - } else { - err - } - })? - .wait()? - } - "zip" => { - fs::write(&archive_path, &archive_data)?; - Command::new("unzip") - .current_dir(temp_dir_path) - .arg(&archive_path) - .spawn() - .map_err(|err| { - if err.kind() == std::io::ErrorKind::NotFound { - std::io::Error::new( - std::io::ErrorKind::NotFound, - "`unzip` was not found in your PATH, please install `unzip`", - ) - } else { - err - } - })? - .wait()? - } - ext => bail!("Unsupported archive type: '{ext}'"), - }; - if !unpack_status.success() { - bail!("Failed to unpack archive."); - } - assert!(exe_path.exists()); - fs::remove_file(&archive_path)?; - Ok(exe_path) -} - pub struct DenoCompileBinaryWriter<'a> { deno_dir: &'a DenoDir, file_fetcher: &'a FileFetcher, @@ -480,13 +415,13 @@ impl<'a> DenoCompileBinaryWriter<'a> { let archive_data = std::fs::read(binary_path)?; let temp_dir = tempfile::TempDir::new()?; - let base_binary_path = unpack_into_dir( - "denort", - &binary_name, - archive_data, - target.contains("windows"), - &temp_dir, - )?; + let base_binary_path = archive::unpack_into_dir(archive::UnpackArgs { + exe_name: "denort", + archive_name: &binary_name, + archive_data: &archive_data, + is_windows: target.contains("windows"), + dest_path: temp_dir.path(), + })?; let base_binary = std::fs::read(base_binary_path)?; drop(temp_dir); // delete the temp dir Ok(base_binary) |