mirror of
https://github.com/enso-org/enso.git
synced 2024-12-22 23:51:31 +03:00
Remove tokio-tar. (#7631)
This commit is contained in:
parent
2385f5b357
commit
d7e5c3f362
44
Cargo.lock
generated
44
Cargo.lock
generated
@ -3484,7 +3484,7 @@ checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"redox_syscall 0.2.16",
|
||||
"redox_syscall",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
@ -4295,7 +4295,6 @@ dependencies = [
|
||||
"tempfile",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"tokio-tar",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
"tracing-subscriber",
|
||||
@ -5350,7 +5349,7 @@ checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"redox_syscall 0.2.16",
|
||||
"redox_syscall",
|
||||
"smallvec 1.10.0",
|
||||
"windows-sys",
|
||||
]
|
||||
@ -5876,15 +5875,6 @@ dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.3.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.4.3"
|
||||
@ -5892,7 +5882,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
|
||||
dependencies = [
|
||||
"getrandom 0.2.8",
|
||||
"redox_syscall 0.2.16",
|
||||
"redox_syscall",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
@ -6664,7 +6654,7 @@ checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"
|
||||
dependencies = [
|
||||
"filetime",
|
||||
"libc",
|
||||
"xattr 0.2.3",
|
||||
"xattr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -6676,7 +6666,7 @@ dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"fastrand",
|
||||
"libc",
|
||||
"redox_syscall 0.2.16",
|
||||
"redox_syscall",
|
||||
"remove_dir_all",
|
||||
"winapi",
|
||||
]
|
||||
@ -6901,21 +6891,6 @@ dependencies = [
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-tar"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75"
|
||||
dependencies = [
|
||||
"filetime",
|
||||
"futures-core",
|
||||
"libc",
|
||||
"redox_syscall 0.3.5",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"xattr 1.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-tungstenite"
|
||||
version = "0.17.2"
|
||||
@ -7811,15 +7786,6 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xattr"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xi-rope"
|
||||
version = "0.3.0"
|
||||
|
@ -58,7 +58,7 @@ quote = { workspace = true }
|
||||
rand = "0.8.4"
|
||||
regex = { workspace = true }
|
||||
reqwest = { version = "0.11.5", default-features = false, features = [
|
||||
"stream"
|
||||
"stream",
|
||||
] }
|
||||
semver = { workspace = true }
|
||||
serde = { version = "1.0.130", features = ["derive"] }
|
||||
@ -71,7 +71,6 @@ symlink = "0.1.0"
|
||||
syn = { workspace = true }
|
||||
sysinfo = "0.26.2"
|
||||
tar = "0.4.37"
|
||||
tokio-tar = "0.3.1"
|
||||
tempfile = "3.2.0"
|
||||
tokio = { workspace = true }
|
||||
tokio-stream = { workspace = true }
|
||||
|
@ -1,9 +1,7 @@
|
||||
use crate::prelude::*;
|
||||
|
||||
use async_compression::tokio::bufread::GzipDecoder;
|
||||
use tokio::io::AsyncRead;
|
||||
use tokio::io::BufReader;
|
||||
use tokio_tar::Archive as Tar;
|
||||
use flate2::read::GzDecoder;
|
||||
use std::fs::File;
|
||||
|
||||
|
||||
|
||||
@ -18,19 +16,52 @@ pub struct Archive {
|
||||
/// The path that the `file` originated from. This is stored for error reporting.
|
||||
path: Box<Path>,
|
||||
#[derivative(Debug = "ignore")]
|
||||
file: Tar<Box<dyn AsyncRead + Unpin + Send>>,
|
||||
file: tar::Archive<GzDecoder<File>>,
|
||||
}
|
||||
|
||||
impl Archive {
|
||||
/// Open a gzip-compressed tar archive.
|
||||
#[context("Failed to open archive: {}", path.as_ref().display())]
|
||||
pub async fn open_tar_gz(path: impl AsRef<Path>) -> Result<Self> {
|
||||
let file = crate::fs::tokio::open(&path).await?;
|
||||
let file = BufReader::new(file);
|
||||
let file = GzipDecoder::new(file);
|
||||
let file: Box<dyn AsyncRead + Unpin + Send> = Box::new(file);
|
||||
let file = Tar::new(file);
|
||||
let file = file
|
||||
.try_into_std()
|
||||
.map_err(|_| anyhow!("Failed to convert tokio::fs::File to std::fs::File"))?;
|
||||
let tar_stream = flate2::read::GzDecoder::new(file);
|
||||
let archive = tar::Archive::new(tar_stream);
|
||||
let path = path.as_ref().to_owned().into_boxed_path();
|
||||
Ok(Self { path, file })
|
||||
Ok(Self { path, file: archive })
|
||||
}
|
||||
|
||||
/// Synchronous version of [`extract_files`].
|
||||
#[context("Failed to extract files from archive {}", self.path.display())]
|
||||
pub fn extract_files_sync(
|
||||
mut self,
|
||||
mut filter: impl FnMut(&Path) -> Option<PathBuf>,
|
||||
) -> Result {
|
||||
let entries = self.file.entries()?;
|
||||
for entry in entries {
|
||||
let mut entry = entry?;
|
||||
let path_in_archive = entry.path()?;
|
||||
if let Some(output_path) = filter(&path_in_archive) {
|
||||
let entry_type = entry.header().entry_type();
|
||||
let make_message = |prefix, path: Cow<Path>| {
|
||||
format!(
|
||||
"{} {:?} entry: {} => {}",
|
||||
prefix,
|
||||
entry_type,
|
||||
path.display(),
|
||||
output_path.display()
|
||||
)
|
||||
};
|
||||
|
||||
trace!("{}", make_message("Extracting", path_in_archive));
|
||||
entry.unpack(&output_path).with_context(|| {
|
||||
make_message("Failed to extract", entry.path().unwrap_or_default())
|
||||
})?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// The given function will be called with the path of each file within the archive. For each
|
||||
@ -39,21 +70,9 @@ impl Archive {
|
||||
/// IMPORTANT: If the function uses its input path to generate an output path, care must be
|
||||
/// taken that the output path is not in an unexpected location, especially if coming from an
|
||||
/// untrusted archive.
|
||||
#[context("Failed to extract files from archive: {}", self.path.display())]
|
||||
pub async fn extract_files(
|
||||
mut self,
|
||||
mut filter: impl FnMut(&Path) -> Option<PathBuf>,
|
||||
) -> Result {
|
||||
let mut entries = self.file.entries()?;
|
||||
while let Some(entry) = entries.next().await {
|
||||
let mut entry = entry?;
|
||||
let path_in_archive = entry.path()?;
|
||||
if let Some(output_path) = filter(&path_in_archive) {
|
||||
trace!("Extracting {}", output_path.display());
|
||||
entry.unpack(&output_path).await?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
pub async fn extract_files(self, filter: impl FnMut(&Path) -> Option<PathBuf>) -> Result {
|
||||
let job = move || self.extract_files_sync(filter);
|
||||
tokio::task::block_in_place(job)
|
||||
}
|
||||
|
||||
/// Extract all files from the specified subtree in the archive, placing them in the specified
|
||||
@ -63,6 +82,13 @@ impl Archive {
|
||||
prefix: impl AsRef<Path>,
|
||||
output: impl AsRef<Path>,
|
||||
) -> Result {
|
||||
let path = self.path.clone();
|
||||
debug!(
|
||||
"Extracting subtree '{}' from archive {} to {}",
|
||||
prefix.as_ref().display(),
|
||||
self.path.display(),
|
||||
output.as_ref().display()
|
||||
);
|
||||
self.extract_files(|path_in_archive| {
|
||||
path_in_archive
|
||||
.strip_prefix(&prefix)
|
||||
@ -70,5 +96,13 @@ impl Archive {
|
||||
.map(|relative_path| output.as_ref().join(relative_path))
|
||||
})
|
||||
.await
|
||||
.with_context(|| {
|
||||
format!(
|
||||
"Failed to extract subtree '{}' from archive {} to {}",
|
||||
prefix.as_ref().display(),
|
||||
path.display(),
|
||||
output.as_ref().display()
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -86,3 +86,9 @@ pub async fn read<P: AsRef<Path>>(path: P) -> Result<Vec<u8>> {
|
||||
pub async fn read_to_string(path: impl AsRef<Path>) -> Result<String> {
|
||||
tokio::fs::read_to_string(&path).await.anyhow_err()
|
||||
}
|
||||
|
||||
/// See [`tokio::fs::set_permissions`].
|
||||
#[context("Failed to set permissions {:?} for file: {}", permissions, path.as_ref().display())]
|
||||
pub async fn set_permissions(path: impl AsRef<Path>, permissions: std::fs::Permissions) -> Result {
|
||||
tokio::fs::set_permissions(&path, permissions.clone()).await.anyhow_err()
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ pub use ttf::Weight;
|
||||
pub use ttf::Width;
|
||||
|
||||
|
||||
|
||||
// =================
|
||||
// === Constants ===
|
||||
// =================
|
||||
|
Loading…
Reference in New Issue
Block a user