Merge branch 'dir-flag'

This commit is contained in:
João M. Bezerra 2021-10-31 01:49:33 -03:00
commit 4e731f8af3
6 changed files with 30 additions and 32 deletions

View File

@ -35,11 +35,11 @@ ouch decompress a.zip b.tar.gz c.tar
ouch d a.zip ouch d a.zip
``` ```
You can redirect the decompression results to another folder with the `-o/--output` flag. You can redirect the decompression results to another folder with the `-d/--dir` flag.
```sh ```sh
# Decompress 'summer_vacation.zip' inside of new folder 'pictures' # Decompress 'summer_vacation.zip' inside of new folder 'pictures'
ouch decompress summer_vacation.zip -o pictures ouch decompress summer_vacation.zip -d pictures
``` ```
### Compressing ### Compressing

View File

@ -47,8 +47,8 @@ pub enum Subcommand {
files: Vec<PathBuf>, files: Vec<PathBuf>,
/// Decompress files in a directory other than the current /// Decompress files in a directory other than the current
#[clap(short, long, value_hint = ValueHint::DirPath)] #[clap(short, long = "dir", value_hint = ValueHint::DirPath)]
output: Option<PathBuf>, output_dir: Option<PathBuf>,
}, },
} }

View File

@ -144,7 +144,7 @@ pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> {
compress_result?; compress_result?;
} }
Subcommand::Decompress { files, output: output_folder } => { Subcommand::Decompress { files, output_dir } => {
let mut output_paths = vec![]; let mut output_paths = vec![];
let mut formats = vec![]; let mut formats = vec![];
@ -173,10 +173,10 @@ pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> {
} }
// From Option<PathBuf> to Option<&Path> // From Option<PathBuf> to Option<&Path>
let output_folder = output_folder.as_ref().map(|path| path.as_ref()); let output_dir = output_dir.as_ref().map(|path| path.as_ref());
for ((input_path, formats), file_name) in files.iter().zip(formats).zip(output_paths) { for ((input_path, formats), file_name) in files.iter().zip(formats).zip(output_paths) {
decompress_file(input_path, formats, output_folder, file_name, question_policy)?; decompress_file(input_path, formats, output_dir, file_name, question_policy)?;
} }
} }
} }
@ -282,12 +282,12 @@ fn compress_files(files: Vec<PathBuf>, formats: Vec<CompressionFormat>, output_f
// File at input_file_path is opened for reading, example: "archive.tar.gz" // File at input_file_path is opened for reading, example: "archive.tar.gz"
// formats contains each format necessary for decompression, example: [Gz, Tar] (in decompression order) // formats contains each format necessary for decompression, example: [Gz, Tar] (in decompression order)
// output_folder it's where the file will be decompressed to // output_dir it's where the file will be decompressed to
// file_name is only used when extracting single file formats, no archive formats like .tar or .zip // file_name is only used when extracting single file formats, no archive formats like .tar or .zip
fn decompress_file( fn decompress_file(
input_file_path: &Path, input_file_path: &Path,
formats: Vec<extension::CompressionFormat>, formats: Vec<extension::CompressionFormat>,
output_folder: Option<&Path>, output_dir: Option<&Path>,
file_name: &Path, file_name: &Path,
question_policy: QuestionPolicy, question_policy: QuestionPolicy,
) -> crate::Result<()> { ) -> crate::Result<()> {
@ -296,10 +296,10 @@ fn decompress_file(
// Output path is used by single file formats // Output path is used by single file formats
let output_path = let output_path =
if let Some(output_folder) = output_folder { output_folder.join(file_name) } else { file_name.to_path_buf() }; if let Some(output_dir) = output_dir { output_dir.join(file_name) } else { file_name.to_path_buf() };
// Output folder is used by archive file formats (zip and tar) // Output folder is used by archive file formats (zip and tar)
let output_folder = output_folder.unwrap_or_else(|| Path::new(".")); let output_dir = output_dir.unwrap_or_else(|| Path::new("."));
// Zip archives are special, because they require io::Seek, so it requires it's logic separated // Zip archives are special, because they require io::Seek, so it requires it's logic separated
// from decoder chaining. // from decoder chaining.
@ -309,10 +309,10 @@ fn decompress_file(
// //
// Any other Zip decompression done can take up the whole RAM and freeze ouch. // Any other Zip decompression done can take up the whole RAM and freeze ouch.
if let [Zip] = *formats.as_slice() { if let [Zip] = *formats.as_slice() {
utils::create_dir_if_non_existent(output_folder)?; utils::create_dir_if_non_existent(output_dir)?;
let zip_archive = zip::ZipArchive::new(reader)?; let zip_archive = zip::ZipArchive::new(reader)?;
let _files = crate::archive::zip::unpack_archive(zip_archive, output_folder, question_policy)?; let _files = crate::archive::zip::unpack_archive(zip_archive, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
return Ok(()); return Ok(());
} }
@ -336,7 +336,7 @@ fn decompress_file(
reader = chain_reader_decoder(format, reader)?; reader = chain_reader_decoder(format, reader)?;
} }
utils::create_dir_if_non_existent(output_folder)?; utils::create_dir_if_non_existent(output_dir)?;
match formats[0] { match formats[0] {
Gzip | Bzip | Lzma | Zstd => { Gzip | Bzip | Lzma | Zstd => {
@ -349,28 +349,28 @@ fn decompress_file(
info!("Successfully decompressed archive in {}.", nice_directory_display(output_path)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_path));
} }
Tar => { Tar => {
let _ = crate::archive::tar::unpack_archive(reader, output_folder, question_policy)?; let _ = crate::archive::tar::unpack_archive(reader, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
Tgz => { Tgz => {
let reader = chain_reader_decoder(&Gzip, reader)?; let reader = chain_reader_decoder(&Gzip, reader)?;
let _ = crate::archive::tar::unpack_archive(reader, output_folder, question_policy)?; let _ = crate::archive::tar::unpack_archive(reader, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
Tbz => { Tbz => {
let reader = chain_reader_decoder(&Bzip, reader)?; let reader = chain_reader_decoder(&Bzip, reader)?;
let _ = crate::archive::tar::unpack_archive(reader, output_folder, question_policy)?; let _ = crate::archive::tar::unpack_archive(reader, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
Tlzma => { Tlzma => {
let reader = chain_reader_decoder(&Lzma, reader)?; let reader = chain_reader_decoder(&Lzma, reader)?;
let _ = crate::archive::tar::unpack_archive(reader, output_folder, question_policy)?; let _ = crate::archive::tar::unpack_archive(reader, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
Tzst => { Tzst => {
let reader = chain_reader_decoder(&Zstd, reader)?; let reader = chain_reader_decoder(&Zstd, reader)?;
let _ = crate::archive::tar::unpack_archive(reader, output_folder, question_policy)?; let _ = crate::archive::tar::unpack_archive(reader, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
Zip => { Zip => {
eprintln!("Compressing first into .zip."); eprintln!("Compressing first into .zip.");
@ -384,9 +384,9 @@ fn decompress_file(
io::copy(&mut reader, &mut vec)?; io::copy(&mut reader, &mut vec)?;
let zip_archive = zip::ZipArchive::new(io::Cursor::new(vec))?; let zip_archive = zip::ZipArchive::new(io::Cursor::new(vec))?;
let _ = crate::archive::zip::unpack_archive(zip_archive, output_folder, question_policy)?; let _ = crate::archive::zip::unpack_archive(zip_archive, output_dir, question_policy)?;
info!("Successfully decompressed archive in {}.", nice_directory_display(output_folder)); info!("Successfully decompressed archive in {}.", nice_directory_display(output_dir));
} }
} }

View File

@ -138,9 +138,7 @@ impl fmt::Display for Error {
Error::UnknownExtensionError(_) => todo!(), Error::UnknownExtensionError(_) => todo!(),
Error::AlreadyExists => todo!(), Error::AlreadyExists => todo!(),
Error::InvalidZipArchive(_) => todo!(), Error::InvalidZipArchive(_) => todo!(),
Error::PermissionDenied { error_title } => { Error::PermissionDenied { error_title } => FinalError::with_title(error_title).detail("Permission denied"),
FinalError::with_title(error_title).detail("Permission denied").to_owned()
}
Error::UnsupportedZipArchive(_) => todo!(), Error::UnsupportedZipArchive(_) => todo!(),
Error::Custom { reason } => reason.clone(), Error::Custom { reason } => reason.clone(),
}; };

View File

@ -182,7 +182,7 @@ fn extract_files(archive_path: &Path) -> Vec<PathBuf> {
no: false, no: false,
cmd: Subcommand::Decompress { cmd: Subcommand::Decompress {
files: vec![archive_path.to_owned()], files: vec![archive_path.to_owned()],
output: Some(extraction_output_folder.clone()), output_dir: Some(extraction_output_folder.clone()),
}, },
}; };
run(command, QuestionPolicy::Ask).expect("Failed to extract"); run(command, QuestionPolicy::Ask).expect("Failed to extract");

View File

@ -51,7 +51,7 @@ pub fn extract_files(archive_path: &Path) -> Vec<PathBuf> {
no: false, no: false,
cmd: Subcommand::Decompress { cmd: Subcommand::Decompress {
files: vec![archive_path.to_owned()], files: vec![archive_path.to_owned()],
output: Some(extraction_output_folder.clone()), output_dir: Some(extraction_output_folder.clone()),
}, },
}; };
run(command, QuestionPolicy::Ask).expect("Failed to extract"); run(command, QuestionPolicy::Ask).expect("Failed to extract");