diff --git a/Cargo.lock b/Cargo.lock index d6f51e68..362fea2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,12 +11,6 @@ dependencies = [ "gimli", ] -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -109,12 +103,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "bindgen" version = "0.72.0" @@ -636,22 +624,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "flate2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" @@ -784,23 +756,6 @@ dependencies = [ "utf8-width", ] -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - [[package]] name = "httpdate" version = "1.0.3" @@ -1176,15 +1131,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "1.0.4" @@ -1538,20 +1484,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "rustc-hash" version = "2.1.1" @@ -1584,50 +1516,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "rustls" -version = "0.23.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "ryu" version = "1.0.20" @@ -1742,12 +1630,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.106" @@ -1770,17 +1652,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tar" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" -dependencies = [ - "filetime", - "libc", - "xattr", -] - [[package]] name = "target-lexicon" version = "0.13.2" @@ -2037,7 +1908,6 @@ dependencies = [ "anyhow", "cc", "etcetera", - "flate2", "fs4", "indoc", "libloading", @@ -2047,12 +1917,10 @@ dependencies = [ "semver", "serde", "serde_json", - "tar", "tempfile", "tree-sitter", "tree-sitter-highlight", "tree-sitter-tags", - "ureq", "url", ] @@ -2095,42 +1963,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00432f493971db5d8e47a65aeb3b02f8226b9b11f1450ff86bb772776ebadd70" -dependencies = [ - "base64", - "flate2", - "log", - "percent-encoding", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "ureq-proto", - "utf-8", - "webpki-roots", -] - -[[package]] -name = "ureq-proto" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b6cabebbecc4c45189ab06b52f956206cea7d8c8a20851c35a85cb169224cc" -dependencies = [ - "base64", - "http", - "httparse", - "log", -] - [[package]] name = "url" version = "2.5.7" @@ -2143,12 +1975,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8-width" version = "0.1.7" @@ -2508,15 +2334,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "webpki-roots" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "widestring" version = "1.2.0" @@ -2791,16 +2608,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "xattr" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" -dependencies = [ - "libc", - "rustix 1.0.8", -] - [[package]] name = "xtask" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index d904bf5a..10f31590 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,7 +122,6 @@ ctrlc = { version = "3.4.7", features = ["termination"] } dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } etcetera = "0.10.0" filetime = "0.2.26" -flate2 = "1.1.2" fs4 = "0.12.0" git2 = "0.20.2" glob = "0.3.3" @@ -147,7 +146,6 @@ serde_json = { version = "1.0.143", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" -tar = "0.4.40" tempfile = "3.21.0" thiserror = "2.0.16" tiny_http = "0.12.0" diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index 6e9e5760..3d2146f8 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -31,7 +31,6 @@ default = ["tree-sitter-highlight", "tree-sitter-tags"] anyhow.workspace = true cc.workspace = true etcetera.workspace = true -flate2.workspace = true fs4.workspace = true indoc.workspace = true libloading.workspace = true @@ -41,7 +40,6 @@ regex.workspace = true semver.workspace = true serde.workspace = true serde_json.workspace = true -tar.workspace = true tempfile.workspace = true url.workspace = true diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index ee5b43c6..f7247956 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -8,7 +8,7 @@ use std::sync::Mutex; use std::{ collections::HashMap, env, fs, - io::{BufRead, BufReader, Write as _}, + io::{BufRead, BufReader}, marker::PhantomData, mem, path::{Path, PathBuf}, @@ -20,7 +20,6 @@ use std::{ use anyhow::Error; use anyhow::{anyhow, Context, Result}; use etcetera::BaseStrategy as _; -use flate2::read::GzDecoder; use fs4::fs_std::FileExt; use indoc::indoc; use libloading::{Library, Symbol}; @@ -1073,35 +1072,29 @@ impl Loader { Ok(()) } - /// Extracts a tar.gz archive, stripping the first path component. - /// - /// Similar to `tar -xzf --strip-components=1` + /// Extracts a tar.gz archive with `tar`, stripping the first path component. fn extract_tar_gz_with_strip( &self, archive_path: &Path, destination: &Path, ) -> Result<(), Error> { - let archive_file = fs::File::open(archive_path).context("Failed to open archive")?; - let mut archive = tar::Archive::new(GzDecoder::new(archive_file)); - for entry in archive - .entries() - .with_context(|| "Failed to read archive entries")? - { - let mut entry = entry?; - let path = entry.path()?; - let Some(first_component) = path.components().next() else { - continue; - }; - let dest_path = destination.join(path.strip_prefix(first_component).unwrap()); - if let Some(parent) = dest_path.parent() { - fs::create_dir_all(parent).with_context(|| { - format!("Failed to create directory at {}", parent.display()) - })?; - } - entry - .unpack(&dest_path) - .with_context(|| format!("Failed to extract file to {}", dest_path.display()))?; + let status = Command::new("tar") + .arg("-xzf") + .arg(archive_path) + .arg("--strip-components=1") + .arg("-C") + .arg(destination) + .status() + .with_context(|| format!("Failed to execute tar for {}", archive_path.display()))?; + + if !status.success() { + return Err(anyhow!( + "Failed to extract archive {} to {}", + archive_path.display(), + destination.display() + )); } + Ok(()) }