From 6bd66a07e2b5497761ebb985a9c9368f03759d27 Mon Sep 17 00:00:00 2001 From: specCon18 Date: Sun, 3 Sep 2023 21:30:11 -0400 Subject: [PATCH] added 7z and lzma support --- Cargo.lock | 229 +++++++++++++++++++++++++++++++++++++++++++--- Cargo.toml | 1 + src/extractors.rs | 10 +- src/main.rs | 54 ++++++----- 4 files changed, 258 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b814f5b..840de17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,6 +84,21 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -96,6 +111,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -105,6 +129,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + [[package]] name = "byteorder" version = "1.4.3" @@ -148,6 +178,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" +dependencies = [ + "num-traits", +] + [[package]] name = "cipher" version = "0.4.4" @@ -228,6 +267,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + [[package]] name = "crc32fast" version = "1.3.2" @@ -316,10 +370,13 @@ dependencies = [ ] [[package]] -name = "deranged" -version = "0.3.8" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] [[package]] name = "digest" @@ -327,7 +384,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "crypto-common", "subtle", ] @@ -357,6 +414,7 @@ dependencies = [ "indicatif", "rayon", "rust-lzma", + "sevenz-rust", "tar", "unrar", "zip", @@ -384,6 +442,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "filetime_creation" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aea213d5ab4e6cd49f50c0688a4e20e5b75ff3bc07ff63f814778bd9b1dd42d" +dependencies = [ + "cfg-if", + "filetime", + "windows-sys 0.48.0", +] + [[package]] name = "flate2" version = "1.0.27" @@ -431,7 +500,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -480,6 +549,15 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -508,6 +586,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lzma-rust" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5dadd5fd2bcf0256ff0340310c47851ef4113d2cc803b606804cd26604d0e1" +dependencies = [ + "byteorder", +] + [[package]] name = "memchr" version = "2.5.0" @@ -544,6 +631,25 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "nt-time" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7388539da3ff64e2ee5f23b310e2d46d78fbabf338bd35d410d59562ed188bd" +dependencies = [ + "chrono", + "time", +] + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -575,6 +681,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "owo-colors" version = "3.5.0" @@ -621,10 +733,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", "hmac", "password-hash", - "sha2", + "sha2 0.10.7", ] [[package]] @@ -771,6 +883,23 @@ dependencies = [ "syn", ] +[[package]] +name = "sevenz-rust" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f8f9506caeb765a103766f8d32d5a16ba11495e0e6ad44f29a3cd6b1dfe31b" +dependencies = [ + "bit-set", + "byteorder", + "crc", + "filetime_creation", + "js-sys", + "lzma-rust", + "nt-time", + "sha2 0.9.9", + "wasm-bindgen", +] + [[package]] name = "sha1" version = "0.10.5" @@ -779,7 +908,20 @@ checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] @@ -790,7 +932,7 @@ checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -893,13 +1035,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.28" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ - "deranged", "serde", "time-core", + "time-macros", ] [[package]] @@ -908,6 +1050,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +[[package]] +name = "time-macros" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +dependencies = [ + "time-core", +] + [[package]] name = "tracing" version = "0.1.37" @@ -1021,6 +1172,60 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + [[package]] name = "widestring" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index ce7de0c..1fc3168 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ flate2 = "1.0.27" indicatif = "0.17.6" rayon = "1.7.0" rust-lzma = "0.6.0" +sevenz-rust = "0.5.2" tar = "0.4.40" unrar = "0.5.1" zip = "0.6.6" diff --git a/src/extractors.rs b/src/extractors.rs index e9f75d4..d8e59c7 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -99,7 +99,7 @@ pub fn extract_tar(tar_file: &Path) -> io::Result<()> { Ok(()) } -pub fn extract_xz(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { +pub fn extract_lzma(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { // Open the input XZ file let input_file = File::open(input_path)?; @@ -166,11 +166,15 @@ pub fn extract_bz2(input_path: &Path, output_directory: &Path) -> Result<(), io: Ok(()) } +pub fn extract_7z(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { + + sevenz_rust::decompress_file(input_path, output_directory).expect("complete"); + + Ok(()) +} // pub fn extract_tbz2(){} // pub fn extract_tgz(){} // pub fn extract_txz(){} - // pub fn extract_lzma(){} - // pub fn extract_7z(){} // pub fn extract_arj(){} // pub fn extract_cab(){} // pub fn extract_chm(){} diff --git a/src/main.rs b/src/main.rs index 2524245..7d920d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ use extractors::{ extract_zip, extract_rar, extract_tar, - extract_xz, + extract_lzma, extract_bz2, // extract_tbz2, // extract_tgz, @@ -25,7 +25,7 @@ use extractors::{ // extract_lzma, extract_gz, // extract_z, - // extract_7z, + extract_7z, // extract_arj, // extract_cab, // extract_chm, @@ -76,13 +76,17 @@ fn run() -> i32 { println!("Error creating output directory: {}", err); return 1; } - if let Err(err) = extract_xz(&fname, &output_directory) { + if let Err(err) = extract_lzma(&fname, &output_directory) { println!("Error extracting XZ: {}", err); return 1; } } "gz" => { let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } if let Err(err) = extract_gz(&fname, &output_directory) { println!("Error extracting GZ: {}", err); return 1; @@ -90,11 +94,37 @@ fn run() -> i32 { } "bz2" => { let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } if let Err(err) = extract_bz2(&fname, &output_directory) { println!("Error extracting BZ2: {}", err); return 1; } } + "lzma" => { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_lzma(&fname, &output_directory) { + println!("Error extracting LZMA: {}", err); + return 1; + } + } + "7z" => { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_7z(&fname, &output_directory) { + println!("Error extracting 7Z: {}", err); + return 1; + } + } /* "tbz2" => { if let Err(err) = extract_tbz2(&fname) { @@ -114,24 +144,6 @@ fn run() -> i32 { return 1; } } - "lzma" => { - if let Err(err) = extract_lzma(&fname) { - println!("Error extracting LZMA: {}", err); - return 1; - } - } - "z" => { - if let Err(err) = extract_z(&fname) { - println!("Error extracting Z: {}", err); - return 1; - } - } - "7z" => { - if let Err(err) = extract_7z(&fname) { - println!("Error extracting 7Z: {}", err); - return 1; - } - } "arj" => { if let Err(err) = extract_arj(&fname) { println!("Error extracting ARJ: {}", err);