add cli option to (de)compress quietly

This commit is contained in:
a-moreira 2022-12-18 22:49:37 -03:00
parent 5a97029bde
commit e26323bd99
6 changed files with 42 additions and 24 deletions

View File

@ -22,7 +22,7 @@ use crate::{
/// Unpacks the archive given by `archive` into the folder given by `into`. /// Unpacks the archive given by `archive` into the folder given by `into`.
/// Assumes that output_folder is empty /// Assumes that output_folder is empty
pub fn unpack_archive(reader: Box<dyn Read>, output_folder: &Path) -> crate::Result<Vec<PathBuf>> { pub fn unpack_archive(reader: Box<dyn Read>, output_folder: &Path, quiet: bool) -> crate::Result<Vec<PathBuf>> {
assert!(output_folder.read_dir().expect("dir exists").count() == 0); assert!(output_folder.read_dir().expect("dir exists").count() == 0);
let mut archive = tar::Archive::new(reader); let mut archive = tar::Archive::new(reader);
@ -37,15 +37,16 @@ pub fn unpack_archive(reader: Box<dyn Read>, output_folder: &Path) -> crate::Res
// importance for most users, but would generate lots of // importance for most users, but would generate lots of
// spoken text for users using screen readers, braille displays // spoken text for users using screen readers, braille displays
// and so on // and so on
if !quiet {
info!( info!(
inaccessible, inaccessible,
"{:?} extracted. ({})", "{:?} extracted. ({})",
utils::strip_cur_dir(&output_folder.join(file.path()?)), utils::strip_cur_dir(&output_folder.join(file.path()?)),
format_size(file.size(), DECIMAL), format_size(file.size(), DECIMAL),
); );
files_unpacked.push(file_path); files_unpacked.push(file_path);
}
} }
Ok(files_unpacked) Ok(files_unpacked)
@ -85,6 +86,7 @@ pub fn build_archive_from_paths<W>(
input_filenames: &[PathBuf], input_filenames: &[PathBuf],
output_path: &Path, output_path: &Path,
writer: W, writer: W,
quiet: bool,
file_visibility_policy: FileVisibilityPolicy, file_visibility_policy: FileVisibilityPolicy,
) -> crate::Result<W> ) -> crate::Result<W>
where where
@ -118,7 +120,9 @@ where
// little importance for most users, but would generate lots of // little importance for most users, but would generate lots of
// spoken text for users using screen readers, braille displays // spoken text for users using screen readers, braille displays
// and so on // and so on
info!(inaccessible, "Compressing '{}'.", utils::to_utf(path)); if !quiet {
info!(inaccessible, "Compressing '{}'.", utils::to_utf(path));
}
if path.is_dir() { if path.is_dir() {
builder.append_dir(path, path)?; builder.append_dir(path, path)?;

View File

@ -29,7 +29,7 @@ use crate::{
/// Unpacks the archive given by `archive` into the folder given by `output_folder`. /// Unpacks the archive given by `archive` into the folder given by `output_folder`.
/// Assumes that output_folder is empty /// Assumes that output_folder is empty
pub fn unpack_archive<R>(mut archive: ZipArchive<R>, output_folder: &Path) -> crate::Result<Vec<PathBuf>> pub fn unpack_archive<R>(mut archive: ZipArchive<R>, output_folder: &Path, quiet: bool) -> crate::Result<Vec<PathBuf>>
where where
R: Read + Seek, R: Read + Seek,
{ {
@ -54,7 +54,9 @@ where
// importance for most users, but would generate lots of // importance for most users, but would generate lots of
// spoken text for users using screen readers, braille displays // spoken text for users using screen readers, braille displays
// and so on // and so on
info!(inaccessible, "File {} extracted to \"{}\"", idx, file_path.display()); if !quiet {
info!(inaccessible, "File {} extracted to \"{}\"", idx, file_path.display());
}
fs::create_dir_all(&file_path)?; fs::create_dir_all(&file_path)?;
} }
_is_file @ false => { _is_file @ false => {
@ -66,12 +68,14 @@ where
let file_path = strip_cur_dir(file_path.as_path()); let file_path = strip_cur_dir(file_path.as_path());
// same reason is in _is_dir: long, often not needed text // same reason is in _is_dir: long, often not needed text
info!( if !quiet {
inaccessible, info!(
"{:?} extracted. ({})", inaccessible,
file_path.display(), "{:?} extracted. ({})",
format_size(file.size(), DECIMAL), file_path.display(),
); format_size(file.size(), DECIMAL),
);
}
let mut output_file = fs::File::create(file_path)?; let mut output_file = fs::File::create(file_path)?;
io::copy(&mut file, &mut output_file)?; io::copy(&mut file, &mut output_file)?;
@ -134,6 +138,7 @@ pub fn build_archive_from_paths<W>(
input_filenames: &[PathBuf], input_filenames: &[PathBuf],
output_path: &Path, output_path: &Path,
writer: W, writer: W,
quiet: bool,
file_visibility_policy: FileVisibilityPolicy, file_visibility_policy: FileVisibilityPolicy,
) -> crate::Result<W> ) -> crate::Result<W>
where where
@ -185,7 +190,9 @@ where
// little importance for most users, but would generate lots of // little importance for most users, but would generate lots of
// spoken text for users using screen readers, braille displays // spoken text for users using screen readers, braille displays
// and so on // and so on
info!(inaccessible, "Compressing '{}'.", to_utf(path)); if !quiet {
info!(inaccessible, "Compressing '{}'.", to_utf(path));
}
let metadata = match path.metadata() { let metadata = match path.metadata() {
Ok(metadata) => metadata, Ok(metadata) => metadata,

View File

@ -32,6 +32,7 @@ pub fn compress_files(
extensions: Vec<Extension>, extensions: Vec<Extension>,
output_file: fs::File, output_file: fs::File,
output_path: &Path, output_path: &Path,
quiet: bool,
question_policy: QuestionPolicy, question_policy: QuestionPolicy,
file_visibility_policy: FileVisibilityPolicy, file_visibility_policy: FileVisibilityPolicy,
) -> crate::Result<bool> { ) -> crate::Result<bool> {
@ -74,7 +75,7 @@ pub fn compress_files(
io::copy(&mut reader, &mut writer)?; io::copy(&mut reader, &mut writer)?;
} }
Tar => { Tar => {
archive::tar::build_archive_from_paths(&files, output_path, &mut writer, file_visibility_policy)?; archive::tar::build_archive_from_paths(&files, output_path, &mut writer, quiet, file_visibility_policy)?;
writer.flush()?; writer.flush()?;
} }
Zip => { Zip => {
@ -88,7 +89,7 @@ pub fn compress_files(
let mut vec_buffer = Cursor::new(vec![]); let mut vec_buffer = Cursor::new(vec![]);
archive::zip::build_archive_from_paths(&files, output_path, &mut vec_buffer, file_visibility_policy)?; archive::zip::build_archive_from_paths(&files, output_path, &mut vec_buffer, quiet, file_visibility_policy)?;
vec_buffer.rewind()?; vec_buffer.rewind()?;
io::copy(&mut vec_buffer, &mut writer)?; io::copy(&mut vec_buffer, &mut writer)?;
} }

View File

@ -30,6 +30,7 @@ pub fn decompress_file(
output_dir: &Path, output_dir: &Path,
output_file_path: PathBuf, output_file_path: PathBuf,
question_policy: QuestionPolicy, question_policy: QuestionPolicy,
quiet: bool
) -> crate::Result<()> { ) -> crate::Result<()> {
assert!(output_dir.exists()); assert!(output_dir.exists());
let reader = fs::File::open(input_file_path)?; let reader = fs::File::open(input_file_path)?;
@ -48,7 +49,7 @@ pub fn decompress_file(
{ {
let zip_archive = zip::ZipArchive::new(reader)?; let zip_archive = zip::ZipArchive::new(reader)?;
let files = if let ControlFlow::Continue(files) = smart_unpack( let files = if let ControlFlow::Continue(files) = smart_unpack(
|output_dir| crate::archive::zip::unpack_archive(zip_archive, output_dir), |output_dir| crate::archive::zip::unpack_archive(zip_archive, output_dir, quiet),
output_dir, output_dir,
&output_file_path, &output_file_path,
question_policy, question_policy,
@ -111,7 +112,7 @@ pub fn decompress_file(
} }
Tar => { Tar => {
if let ControlFlow::Continue(files) = smart_unpack( if let ControlFlow::Continue(files) = smart_unpack(
|output_dir| crate::archive::tar::unpack_archive(reader, output_dir), |output_dir| crate::archive::tar::unpack_archive(reader, output_dir, quiet),
output_dir, output_dir,
&output_file_path, &output_file_path,
question_policy, question_policy,
@ -135,7 +136,7 @@ pub fn decompress_file(
let zip_archive = zip::ZipArchive::new(io::Cursor::new(vec))?; let zip_archive = zip::ZipArchive::new(io::Cursor::new(vec))?;
if let ControlFlow::Continue(files) = smart_unpack( if let ControlFlow::Continue(files) = smart_unpack(
|output_dir| crate::archive::zip::unpack_archive(zip_archive, output_dir), |output_dir| crate::archive::zip::unpack_archive(zip_archive, output_dir, quiet),
output_dir, output_dir,
&output_file_path, &output_file_path,
question_policy, question_policy,

View File

@ -164,6 +164,7 @@ pub fn run(
formats, formats,
output_file, output_file,
&output_path, &output_path,
args.quiet,
question_policy, question_policy,
file_visibility_policy, file_visibility_policy,
); );
@ -244,7 +245,7 @@ pub fn run(
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) {
let output_file_path = output_dir.join(file_name); // Path used by single file format archives let output_file_path = output_dir.join(file_name); // Path used by single file format archives
decompress_file(input_path, formats, &output_dir, output_file_path, question_policy)?; decompress_file(input_path, formats, &output_dir, output_file_path, question_policy, args.quiet)?;
} }
} }
Subcommand::List { archives: files, tree } => { Subcommand::List { archives: files, tree } => {

View File

@ -29,6 +29,10 @@ pub struct Opts {
#[arg(short = 'H', long)] #[arg(short = 'H', long)]
pub hidden: bool, pub hidden: bool,
/// Silences output
#[arg(short = 'Q', long)]
pub quiet: bool,
/// Ignores files matched by git's ignore files /// Ignores files matched by git's ignore files
#[arg(short = 'g', long)] #[arg(short = 'g', long)]
pub gitignore: bool, pub gitignore: bool,