mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-07 12:05:46 +00:00
Ask user to continue after .zip warning is shown
This commit is contained in:
parent
f8acb61777
commit
17d9f17277
@ -24,7 +24,7 @@ use crate::{
|
|||||||
progress::Progress,
|
progress::Progress,
|
||||||
utils::{
|
utils::{
|
||||||
self, concatenate_os_str_list, dir_is_empty, nice_directory_display, to_utf, try_infer_extension,
|
self, concatenate_os_str_list, dir_is_empty, nice_directory_display, to_utf, try_infer_extension,
|
||||||
user_wants_to_continue_decompressing,
|
user_wants_to_continue_compressing, user_wants_to_continue_decompressing,
|
||||||
},
|
},
|
||||||
warning, Opts, QuestionPolicy, Subcommand,
|
warning, Opts, QuestionPolicy, Subcommand,
|
||||||
};
|
};
|
||||||
@ -157,7 +157,7 @@ pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> {
|
|||||||
formats = new_formats;
|
formats = new_formats;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let compress_result = compress_files(files, formats, output_file);
|
let compress_result = compress_files(files, formats, output_file, &output_path, question_policy);
|
||||||
|
|
||||||
// If any error occurred, delete incomplete file
|
// If any error occurred, delete incomplete file
|
||||||
if compress_result.is_err() {
|
if compress_result.is_err() {
|
||||||
@ -268,7 +268,7 @@ pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> {
|
|||||||
println!();
|
println!();
|
||||||
}
|
}
|
||||||
let formats = formats.iter().flat_map(Extension::iter).map(Clone::clone).collect();
|
let formats = formats.iter().flat_map(Extension::iter).map(Clone::clone).collect();
|
||||||
list_archive_contents(archive_path, formats, list_options)?;
|
list_archive_contents(archive_path, formats, list_options, question_policy)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,7 +280,13 @@ pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> {
|
|||||||
// files are the list of paths to be compressed: ["dir/file1.txt", "dir/file2.txt"]
|
// files are the list of paths to be compressed: ["dir/file1.txt", "dir/file2.txt"]
|
||||||
// formats contains each format necessary for compression, example: [Tar, Gz] (in compression order)
|
// formats contains each format necessary for compression, example: [Tar, Gz] (in compression order)
|
||||||
// output_file is the resulting compressed file name, example: "compressed.tar.gz"
|
// output_file is the resulting compressed file name, example: "compressed.tar.gz"
|
||||||
fn compress_files(files: Vec<PathBuf>, formats: Vec<Extension>, output_file: fs::File) -> crate::Result<()> {
|
fn compress_files(
|
||||||
|
files: Vec<PathBuf>,
|
||||||
|
formats: Vec<Extension>,
|
||||||
|
output_file: fs::File,
|
||||||
|
output_dir: &Path,
|
||||||
|
question_policy: QuestionPolicy
|
||||||
|
) -> crate::Result<()> {
|
||||||
// The next lines are for displaying the progress bar
|
// The next lines are for displaying the progress bar
|
||||||
// If the input files contain a directory, then the total size will be underestimated
|
// If the input files contain a directory, then the total size will be underestimated
|
||||||
let (total_input_size, precise) = files
|
let (total_input_size, precise) = files
|
||||||
@ -352,6 +358,11 @@ fn compress_files(files: Vec<PathBuf>, formats: Vec<Extension>, output_file: fs:
|
|||||||
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
||||||
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
||||||
|
|
||||||
|
// give user the option to continue compressing after warning is shown
|
||||||
|
if !user_wants_to_continue_compressing(output_dir, question_policy)? {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let mut vec_buffer = io::Cursor::new(vec![]);
|
let mut vec_buffer = io::Cursor::new(vec![]);
|
||||||
|
|
||||||
let current_position_fn = {
|
let current_position_fn = {
|
||||||
@ -506,6 +517,11 @@ fn decompress_file(
|
|||||||
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
||||||
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
||||||
|
|
||||||
|
// give user the option to continue decompressing after warning is shown
|
||||||
|
if !user_wants_to_continue_decompressing(input_file_path, question_policy)? {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let mut vec = vec![];
|
let mut vec = vec![];
|
||||||
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))?;
|
||||||
@ -546,6 +562,7 @@ fn list_archive_contents(
|
|||||||
archive_path: &Path,
|
archive_path: &Path,
|
||||||
formats: Vec<CompressionFormat>,
|
formats: Vec<CompressionFormat>,
|
||||||
list_options: ListOptions,
|
list_options: ListOptions,
|
||||||
|
question_policy: QuestionPolicy
|
||||||
) -> crate::Result<()> {
|
) -> crate::Result<()> {
|
||||||
let reader = fs::File::open(&archive_path)?;
|
let reader = fs::File::open(&archive_path)?;
|
||||||
|
|
||||||
@ -592,6 +609,11 @@ fn list_archive_contents(
|
|||||||
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
\n\tThe design of .zip makes it impossible to compress via stream, so it must be done entirely in memory.\
|
||||||
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
\n\tBy compressing .zip with extra compression formats, you can run out of RAM if the file is too large!");
|
||||||
|
|
||||||
|
// give user the option to continue decompressing after warning is shown
|
||||||
|
if !user_wants_to_continue_decompressing(archive_path, question_policy)? {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let mut vec = vec![];
|
let mut vec = vec![];
|
||||||
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))?;
|
||||||
|
@ -8,12 +8,22 @@ mod formatting;
|
|||||||
mod fs;
|
mod fs;
|
||||||
mod question;
|
mod question;
|
||||||
|
|
||||||
pub use formatting::{concatenate_os_str_list, nice_directory_display, strip_cur_dir, to_utf, Bytes};
|
pub use formatting::{
|
||||||
pub use fs::{cd_into_same_dir_as, clear_path, create_dir_if_non_existent, dir_is_empty, try_infer_extension};
|
concatenate_os_str_list, nice_directory_display,
|
||||||
pub use question::{
|
strip_cur_dir, to_utf, Bytes
|
||||||
create_or_ask_overwrite, user_wants_to_continue_decompressing, user_wants_to_overwrite, QuestionPolicy,
|
};
|
||||||
|
pub use fs::{
|
||||||
|
cd_into_same_dir_as, clear_path, create_dir_if_non_existent,
|
||||||
|
dir_is_empty, try_infer_extension
|
||||||
|
};
|
||||||
|
pub use question::{
|
||||||
|
user_wants_to_continue_compressing, user_wants_to_continue_decompressing,
|
||||||
|
create_or_ask_overwrite, user_wants_to_overwrite,
|
||||||
|
QuestionPolicy
|
||||||
|
};
|
||||||
|
pub use utf8::{
|
||||||
|
get_invalid_utf8_paths, is_invalid_utf8
|
||||||
};
|
};
|
||||||
pub use utf8::{get_invalid_utf8_paths, is_invalid_utf8};
|
|
||||||
|
|
||||||
mod utf8 {
|
mod utf8 {
|
||||||
use std::{ffi::OsStr, path::PathBuf};
|
use std::{ffi::OsStr, path::PathBuf};
|
||||||
|
@ -63,6 +63,20 @@ pub fn create_or_ask_overwrite(path: &Path, question_policy: QuestionPolicy) ->
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if QuestionPolicy flags were set, otherwise, ask the user if they want to continue compressing.
|
||||||
|
pub fn user_wants_to_continue_compressing(path: &Path, question_policy: QuestionPolicy) -> crate::Result<bool> {
|
||||||
|
match question_policy {
|
||||||
|
QuestionPolicy::AlwaysYes => Ok(true),
|
||||||
|
QuestionPolicy::AlwaysNo => Ok(false),
|
||||||
|
QuestionPolicy::Ask => {
|
||||||
|
let path = to_utf(strip_cur_dir(path));
|
||||||
|
let path = Some(path.as_str());
|
||||||
|
let placeholder = Some("FILE");
|
||||||
|
Confirmation::new("Do you want to continue compressing 'FILE'?", placeholder).ask(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Check if QuestionPolicy flags were set, otherwise, ask the user if they want to continue decompressing.
|
/// Check if QuestionPolicy flags were set, otherwise, ask the user if they want to continue decompressing.
|
||||||
pub fn user_wants_to_continue_decompressing(path: &Path, question_policy: QuestionPolicy) -> crate::Result<bool> {
|
pub fn user_wants_to_continue_decompressing(path: &Path, question_policy: QuestionPolicy) -> crate::Result<bool> {
|
||||||
match question_policy {
|
match question_policy {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user