summaryrefslogtreecommitdiff
path: root/cli/standalone
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-08-08 09:19:05 +0200
committerGitHub <noreply@github.com>2024-08-08 00:19:05 -0700
commit507e5b74ff21161ba8bd947d7d9cee317c0af379 (patch)
tree8cfd58d46034803cd296d7b3a159c3f84896ec88 /cli/standalone
parent4e4c96bf66111c6e8ba976ed24594edf7abfcbfb (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.rs81
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)