From 61d373713779ed817c01a41c88f53e1955bff638 Mon Sep 17 00:00:00 2001 From: Nbiba Bedis Date: Fri, 12 Nov 2021 09:15:21 +0100 Subject: [PATCH] Skip compressing file if its the same file as the output --- src/commands.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/commands.rs b/src/commands.rs index 5a2dceebc..73dbd4e2a 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -44,7 +44,16 @@ fn represents_several_files(files: &[PathBuf]) -> bool { /// Entrypoint of ouch, receives cli options and matches Subcommand to decide what to do pub fn run(args: Opts, question_policy: QuestionPolicy) -> crate::Result<()> { match args.cmd { - Subcommand::Compress { files, output: output_path } => { + Subcommand::Compress { mut files, output: output_path } => { + // If output_path exists and contains some of the input files, warn the user and remove them from the input list (in order to avoid compression recursion) + if output_path.exists() { + clean_input_files_if_needed(&mut files, &output_path.canonicalize()?); + } + // After cleaning, if there are no input files left, exit + if files.is_empty() { + return Err(FinalError::with_title("No files to compress").into()); + } + // Formats from path extension, like "file.tar.gz.xz" -> vec![Tar, Gzip, Lzma] let mut formats = extension::extensions_from_path(&output_path); @@ -526,3 +535,15 @@ fn check_mime_type( } Ok(ControlFlow::Continue(())) } + +fn clean_input_files_if_needed(files: &mut Vec, output_path: &Path) { + let mut idx = 0; + while idx < files.len() { + if files[idx] == output_path { + warning!("The output file and the input file are the same: `{}`, skipping...", output_path.display()); + files.remove(idx); + } else { + idx += 1; + } + } +}