From f2b984bc7a6bd7695e626d6d74ee7706261e0b61 Mon Sep 17 00:00:00 2001 From: MisileLaboratory Date: Mon, 17 Apr 2023 14:36:15 +0000 Subject: [PATCH] feat: cleanup codes and more error handling --- src/commands/compress.rs | 29 +++++++++++++++++++---------- src/commands/decompress.rs | 6 +----- src/commands/list.rs | 12 +++++++----- src/commands/mod.rs | 17 +---------------- src/error.rs | 6 ++---- 5 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/commands/compress.rs b/src/commands/compress.rs index 2ee20c5..4ecf82c 100644 --- a/src/commands/compress.rs +++ b/src/commands/compress.rs @@ -1,4 +1,5 @@ use std::{ + env::current_dir, io::{self, BufWriter, Cursor, Seek, Write}, path::{Path, PathBuf}, }; @@ -13,8 +14,6 @@ use crate::{ QuestionAction, QuestionPolicy, BUFFER_CAPACITY, }; -use super::copy_recursively; - /// Compress files into `output_file`. /// /// # Arguments: @@ -129,18 +128,28 @@ pub fn compress_files( return Ok(false); }, SevenZip => { - let tmpdir = tempfile::tempdir()?; + let mut writer = + sevenz_rust::SevenZWriter::create(output_path).map_err(|e| crate::Error::SevenzipError(e))?; for filep in files.iter() { - if filep.is_dir() { - copy_recursively(filep, tmpdir.path() - .join(filep.strip_prefix(std::env::current_dir()?).expect("copy folder error")))?; - } else { - fs::copy(filep, tmpdir.path().join(filep.file_name().expect("no filename in file")))?; - } + writer + .push_archive_entry::( + sevenz_rust::SevenZWriter::::create_archive_entry( + filep, + filep + .strip_prefix(current_dir()?) + .expect("StripPrefix Failed") + .as_os_str() + .to_str() + .unwrap() + .to_string(), + ), + None, + ) + .map_err(|e| crate::Error::SevenzipError(e))?; } - sevenz_rust::compress_to_path(tmpdir.path(), output_path).expect("can't compress 7zip archive"); + writer.finish()?; } } diff --git a/src/commands/decompress.rs b/src/commands/decompress.rs index 206d6c2..1b9c181 100644 --- a/src/commands/decompress.rs +++ b/src/commands/decompress.rs @@ -165,11 +165,7 @@ pub fn decompress_file( } }, SevenZip => { - sevenz_rust::decompress_file(input_file_path, output_dir).map_err( - |x| { - crate::Error::SevenzipError(x) - } - )?; + sevenz_rust::decompress_file(input_file_path, output_dir).map_err(|x| crate::Error::SevenzipError(x))?; fs::read_dir(output_dir)?.count() } }; diff --git a/src/commands/list.rs b/src/commands/list.rs index fc29b00..a2ae9d1 100644 --- a/src/commands/list.rs +++ b/src/commands/list.rs @@ -1,7 +1,7 @@ use std::{ + cell::RefCell, io::{self, BufReader, Read}, path::Path, - cell::RefCell }; use fs_err as fs; @@ -92,11 +92,13 @@ pub fn list_archive_contents( let a = RefCell::new(Vec::new()); sevenz_rust::decompress_file_with_extract_fn(archive_path, ".", |entry, _, _| { - a.borrow_mut().push(Ok(FileInArchive{path: entry.name().into(), is_dir: entry.is_directory()})); + a.borrow_mut().push(Ok(FileInArchive { + path: entry.name().into(), + is_dir: entry.is_directory(), + })); Ok(true) - }).map_err( - |e| crate::Error::SevenzipError(e) - )?; + }) + .map_err(|e| crate::Error::SevenzipError(e))?; Box::new(a.into_inner().into_iter()) } Gzip | Bzip | Lz4 | Lzma | Snappy | Zstd => { diff --git a/src/commands/mod.rs b/src/commands/mod.rs index d4d3e86..e5be233 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -4,7 +4,7 @@ mod compress; mod decompress; mod list; -use std::{ops::ControlFlow, path::{PathBuf, Path}, fs}; +use std::{ops::ControlFlow, path::PathBuf}; use rayon::prelude::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator}; use utils::colors; @@ -21,21 +21,6 @@ use crate::{ warning, CliArgs, QuestionPolicy, }; -/// Copy files from source to destination recursively. -fn copy_recursively(source: impl AsRef, destination: impl AsRef) -> std::io::Result<()> { - fs::create_dir_all(&destination)?; - for entry in fs::read_dir(source)? { - let entry = entry?; - let filetype = entry.file_type()?; - if filetype.is_dir() { - copy_recursively(entry.path(), destination.as_ref().join(entry.file_name()))?; - } else { - fs::copy(entry.path(), destination.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - /// Warn the user that (de)compressing this .zip archive might freeze their system. fn warn_user_about_loading_zip_in_memory() { const ZIP_IN_MEMORY_LIMITATION_WARNING: &str = "\n\ diff --git a/src/error.rs b/src/error.rs index 3e755ea..b3c0bef 100644 --- a/src/error.rs +++ b/src/error.rs @@ -35,7 +35,7 @@ pub enum Error { /// Invalid format passed to `--format` InvalidFormat { reason: String }, /// From sevenz_rust::Error - SevenzipError(sevenz_rust::Error) + SevenzipError(sevenz_rust::Error), } /// Alias to std's Result with ouch's Error @@ -141,9 +141,7 @@ impl fmt::Display for Error { Error::UnsupportedZipArchive(reason) => FinalError::with_title("Unsupported zip archive").detail(*reason), Error::InvalidFormat { reason } => FinalError::with_title("Invalid archive format").detail(reason.clone()), Error::Custom { reason } => reason.clone(), - Error::SevenzipError( reason ) => { - FinalError::with_title("7z error").detail(reason.to_string()) - }, + Error::SevenzipError(reason) => FinalError::with_title("7z error").detail(reason.to_string()), }; write!(f, "{err}") -- 2.11.4.GIT