migrated unpacking to rust zstd to conform with droplet

@drop/droplet now packs with zstd, so converts unpacker.rs to use zstd
This commit is contained in:
DecDuck
2024-10-07 15:10:38 +11:00
parent e504c003b1
commit c46c54b2a5
4 changed files with 47 additions and 52 deletions
+2 -1
View File
@@ -20,5 +20,6 @@
"vite": "^5.3.1", "vite": "^5.3.1",
"vue-tsc": "^2.0.22", "vue-tsc": "^2.0.22",
"@tauri-apps/cli": ">=2.0.0" "@tauri-apps/cli": ">=2.0.0"
} },
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
} }
+41 -22
View File
@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "addr2line" name = "addr2line"
@@ -278,6 +278,8 @@ version = "1.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8d9e0b4957f635b8d3da819d0db5603620467ecf1f692d22a8c2717ce27e6d8" checksum = "e8d9e0b4957f635b8d3da819d0db5603620467ecf1f692d22a8c2717ce27e6d8"
dependencies = [ dependencies = [
"jobserver",
"libc",
"shlex", "shlex",
] ]
@@ -689,7 +691,7 @@ dependencies = [
"tauri", "tauri",
"tauri-build", "tauri-build",
"tauri-plugin-shell", "tauri-plugin-shell",
"xz2", "zstd",
] ]
[[package]] [[package]]
@@ -1535,6 +1537,15 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.70" version = "0.3.70"
@@ -1663,17 +1674,6 @@ version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "lzma-sys"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
dependencies = [
"cc",
"libc",
"pkg-config",
]
[[package]] [[package]]
name = "mac" name = "mac"
version = "0.1.1" version = "0.1.1"
@@ -4307,15 +4307,6 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "xz2"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
dependencies = [
"lzma-sys",
]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.35" version = "0.7.35"
@@ -4336,3 +4327,31 @@ dependencies = [
"quote", "quote",
"syn 2.0.79", "syn 2.0.79",
] ]
[[package]]
name = "zstd"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
dependencies = [
"zstd-safe",
]
[[package]]
name = "zstd-safe"
version = "7.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
dependencies = [
"zstd-sys",
]
[[package]]
name = "zstd-sys"
version = "2.0.13+zstd.1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
dependencies = [
"cc",
"pkg-config",
]
+1 -1
View File
@@ -23,5 +23,5 @@ tauri-plugin-shell = "2.0.0"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
ciborium = "0.2.2" ciborium = "0.2.2"
xz2 = "0.1.7" zstd = "0.13.2"
rayon = "1.10.0" rayon = "1.10.0"
+3 -28
View File
@@ -4,12 +4,11 @@ use serde::Deserialize;
use std::{ use std::{
collections::HashMap, collections::HashMap,
fs::{create_dir_all, File}, fs::{create_dir_all, File},
io::{self, BufReader, Error, Seek}, io::{self, BufReader, Error, Seek, Write},
os::unix::fs::PermissionsExt, os::unix::fs::PermissionsExt,
path::Path, path::Path,
}; };
use tauri::Runtime; use tauri::Runtime;
use xz2::bufread::XzDecoder;
#[derive(Deserialize)] #[derive(Deserialize)]
struct ManifestChunk { struct ManifestChunk {
@@ -28,31 +27,6 @@ struct Manifest {
record: HashMap<String, ManifestRecord>, record: HashMap<String, ManifestRecord>,
} }
fn generate_permissions(permissions: Vec<bool>) -> u32 {
// Base 8
let mut perms: u32 = 0;
// Read
if permissions[0] {
perms += 4;
}
// Write
if permissions[1] {
perms += 2;
}
// Execute
if permissions[2] {
perms += 1;
}
perms *= 8 * 8;
perms += 4 * 8 + 4;
return perms;
}
pub fn unpack() -> Result<(), Error> { pub fn unpack() -> Result<(), Error> {
let chunk_size: u64 = 1024 * 1024 * 16; let chunk_size: u64 = 1024 * 1024 * 16;
@@ -80,12 +54,13 @@ pub fn unpack() -> Result<(), Error> {
let chunk_handle = File::open(chunk_path).unwrap(); let chunk_handle = File::open(chunk_path).unwrap();
let chunk_reader = BufReader::new(chunk_handle); let chunk_reader = BufReader::new(chunk_handle);
let mut decompressor = XzDecoder::new(chunk_reader); let mut decompressor = zstd::Decoder::new(chunk_reader).unwrap();
let offset = u64::try_from(chunk.index).unwrap() * chunk_size; let offset = u64::try_from(chunk.index).unwrap() * chunk_size;
file_handle.seek(io::SeekFrom::Start(offset)).unwrap(); file_handle.seek(io::SeekFrom::Start(offset)).unwrap();
io::copy(&mut decompressor, &mut file_handle).unwrap(); io::copy(&mut decompressor, &mut file_handle).unwrap();
file_handle.flush().unwrap();
} }
}); });