Skip to content

Commit

Permalink
Merge pull request #141 from SpyrosRoum/fix-decompression-overwrittin…
Browse files Browse the repository at this point in the history
…g-files-without-asking

Fix decompression overwritting files without asking and failing on directories
  • Loading branch information
marcospb19 authored Nov 2, 2021
2 parents e4e1d6a + 7f5ff0f commit 73c1d9a
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
7 changes: 7 additions & 0 deletions src/archive/tar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ pub fn unpack_archive(
continue;
}

if file_path.is_dir() {
// ToDo: Maybe we should emphasise that `file_path` is a directory and everything inside it will be gone?
fs::remove_dir_all(&file_path)?;
} else if file_path.is_file() {
fs::remove_file(&file_path)?;
}

file.unpack_in(output_folder)?;

info!("{:?} extracted. ({})", output_folder.join(file.path()?), Bytes::new(file.size()));
Expand Down
7 changes: 7 additions & 0 deletions src/archive/zip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ where
continue;
}

if file_path.is_dir() {
// ToDo: Maybe we should emphasise that `file_path` is a directory and everything inside it will be gone?
fs::remove_dir_all(&file_path)?;
} else if file_path.is_file() {
fs::remove_file(&file_path)?;
}

check_for_comments(&file);

match (&*file.name()).ends_with('/') {
Expand Down
8 changes: 6 additions & 2 deletions src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -331,8 +331,12 @@ fn decompress_file(
Gzip | Bzip | Lzma | Zstd => {
reader = chain_reader_decoder(&formats[0].compression_formats[0], reader)?;

// TODO: improve error treatment
let mut writer = fs::File::create(&output_path)?;
let writer = utils::create_or_ask_overwrite(&output_path, question_policy)?;
if writer.is_none() {
// Means that the user doesn't want to overwrite
return Ok(());
}
let mut writer = writer.unwrap();

io::copy(&mut reader, &mut writer)?;
files_unpacked = vec![output_path];
Expand Down
24 changes: 23 additions & 1 deletion src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,35 @@
use std::{
cmp, env,
ffi::OsStr,
io,
path::Component,
path::{Path, PathBuf},
};

use fs_err as fs;

use crate::{dialogs::Confirmation, info};
use crate::{dialogs::Confirmation, info, Error};

/// Create the file if it doesn't exist and if it does then ask to overwrite it.
/// If the user doesn't want to overwrite then we return [`Ok(None)`]
pub fn create_or_ask_overwrite(path: &Path, question_policy: QuestionPolicy) -> Result<Option<fs::File>, Error> {
match fs::OpenOptions::new().write(true).create_new(true).open(path) {
Ok(w) => Ok(Some(w)),
Err(e) if e.kind() == io::ErrorKind::AlreadyExists => {
if user_wants_to_overwrite(path, question_policy)? {
if path.is_dir() {
// We can't just use `fs::File::create(&path)` because it would return io::ErrorKind::IsADirectory
// ToDo: Maybe we should emphasise that `path` is a directory and everything inside it will be gone?
fs::remove_dir_all(path)?;
}
Ok(Some(fs::File::create(path)?))
} else {
Ok(None)
}
}
Err(e) => Err(Error::from(e)),
}
}

/// Checks given path points to an empty directory.
pub fn dir_is_empty(dir_path: &Path) -> bool {
Expand Down

0 comments on commit 73c1d9a

Please sign in to comment.