From 670a380cd5a4b4fbf47b5705af17ac52f0c1a7a9 Mon Sep 17 00:00:00 2001 From: specCon18 Date: Sat, 2 Sep 2023 15:11:48 -0400 Subject: [PATCH] added xz support --- Cargo.lock | 21 ------------ Cargo.toml | 2 +- flake.lock | 27 +++++++++++++++ flake.nix | 31 +++++++++++++++++ justfile | 2 -- src/extensions.rs | 1 - src/extractors.rs | 33 ++++++++++++++++-- src/main.rs | 85 ++++++++++++++++++++++++++--------------------- 8 files changed, 136 insertions(+), 66 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 justfile diff --git a/Cargo.lock b/Cargo.lock index 3b12320..6527de5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,7 +356,6 @@ dependencies = [ "rayon", "tar", "unrar", - "xz2", "zip", ] @@ -506,17 +505,6 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -[[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]] name = "memchr" version = "2.5.0" @@ -1183,15 +1171,6 @@ dependencies = [ "libc", ] -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "zip" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index d1fc806..67c1300 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ crossterm = "0.27.0" eyre = "0.6.8" indicatif = "0.17.6" rayon = "1.7.0" +#rust-lzma = "0.6.0" tar = "0.4.40" unrar = "0.5.1" -xz2 = "0.1.7" zip = "0.6.6" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..216f58a --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1693565476, + "narHash": "sha256-ya00zHt7YbPo3ve/wNZ/6nts61xt7wK/APa6aZAfey0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "aa8aa7e2ea35ce655297e8322dc82bf77a31d04b", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..07a17c4 --- /dev/null +++ b/flake.nix @@ -0,0 +1,31 @@ +{ + description = "Spec's NixOS-config"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + outputs = { self, nixpkgs, ... }@inputs: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.${system}.rust = pkgs.mkShell{ + buildInputs = with pkgs; [ + cargo + cargo-watch + rustc + just + rustup + clippy + lolcat + rust-analyzer + xz # Add xz (liblzma) to the build inputs + ]; + + # Add a shellHook to modify PKG_CONFIG_PATH + shellHook = '' + export PKG_CONFIG_PATH="${pkgs.xz}/lib/pkgconfig:$PKG_CONFIG_PATH" + ''; + }; + }; +} diff --git a/justfile b/justfile deleted file mode 100644 index 646e040..0000000 --- a/justfile +++ /dev/null @@ -1,2 +0,0 @@ -dev: - cargo watch -x 'run' diff --git a/src/extensions.rs b/src/extensions.rs index 5874dd2..b37be04 100644 --- a/src/extensions.rs +++ b/src/extensions.rs @@ -8,7 +8,6 @@ pub enum Extensions{ Txz, Lzma, Gz, - Gz, Xz, Z, Sevenz, diff --git a/src/extractors.rs b/src/extractors.rs index d1f4f15..5a766a4 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,6 +1,9 @@ -use std::{fs, io, path::Path}; +/* +TODO_2: implement remaining extractor functions and write tests +*/ +use std::{fs, io::{self, Write}, path::Path, fs::File}; use unrar::Archive; - +// use lzma::reader::LzmaReader; pub fn extract_zip(zip_file: &Path) -> io::Result<()> { let file = fs::File::open(zip_file)?; let mut archive = zip::ZipArchive::new(file)?; @@ -94,13 +97,37 @@ pub fn extract_rar(rar_file: &Path) -> Result<(), Box> { Ok(()) } +// pub fn extract_xz(xz_file: &Path, output_dir: &Path) -> io::Result<()> { +// // Open the xz file for reading +// let file = File::open(xz_file)?; + +// // Create a LzmaReader to decompress the data +// let mut xz_reader = LzmaReader::new_decompressor(file)?; + +// // Read the decompressed data into a buffer +// let mut decompressed_data = Vec::new(); +// xz_reader.read_to_end(&mut decompressed_data)?; + +// // Get the filename from the original path +// let xz_filename = xz_file +// .file_name() +// .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "Invalid file name"))?; + +// // Create the output file path by appending the filename to the output directory +// let output_path = output_dir.join(xz_filename); + +// // Create or overwrite the output file and write the decompressed data to it +// let mut output_file = File::create(output_path)?; +// output_file.write_all(&decompressed_data)?; + +// Ok(()) +// } pub fn extract_bz2(){} pub fn extract_tbz2(){} pub fn extract_tgz(){} pub fn extract_txz(){} pub fn extract_lzma(){} pub fn extract_gz(){} - pub fn extract_xz(){} pub fn extract_z(){} pub fn extract_7z(){} pub fn extract_arj(){} diff --git a/src/main.rs b/src/main.rs index 1ad5e5e..23bb15c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,44 +1,48 @@ +/* +TODO_3: setup rayon to handle parallel file processsing when passed +more than one file and square up concurrency model for files with +more than one extension. +*/ +/* +TODO_1: define supported extensions as structs and write an extensions enum +*/ mod extractors; +// mod extensions; +// use extenstions::{ + // File, + // Extensions +// } +use std::{path::Path, fs}; use extractors::{ extract_zip, extract_rar, extract_tar, - extract_bz2, - extract_tbz2, - extract_tgz, - extract_txz, - extract_lzma, - extract_gz, - extract_gz, - extract_xz, - extract_z, - extract_7z, - extract_arj, - extract_cab, - extract_chm, - extract_deb, - extract_dmg, - extract_iso, - extract_lzh, - extract_msi, - extract_rpm, - extract_udf, - extract_wim, - extract_xar, - extract_exe + // extract_xz, + // extract_bz2, + // extract_tbz2, + // extract_tgz, + // extract_txz, + // extract_lzma, + // extract_gz, + // extract_z, + // extract_7z, + // extract_arj, + // extract_cab, + // extract_chm, + // extract_deb, + // extract_dmg, + // extract_iso, + // extract_lzh, + // extract_msi, + // extract_rpm, + // extract_udf, + // extract_wim, + // extract_xar, + // extract_exe }; fn main() { std::process::exit(run()); } - - /* - TODO: [ ] setup rayon to handle concurrent file processsing when passed - more than one file - */ - /* - TODO: [ ] Write for loop to iter over all extensions of a file to handle - files that are tared and then compressed ex: foo.tar.gz, foo.tar.gz - */ fn run() -> i32 { let args: Vec<_> = std::env::args().collect(); if args.len() < 2 { @@ -66,13 +70,18 @@ fn run() -> i32 { return 1; } } + // "xz" => { + // 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_xz(&fname, &output_directory) { + // println!("Error extracting XZ: {}", err); + // return 1; + // } + // } /* - "xz" => { - if let Err(err) = extract_xz(&fname) { - println!("Error extracting XZ: {}", err); - return 1; - } - } "gz" => { if let Err(err) = extract_gz(&fname) { println!("Error extracting GZ: {}", err);