warn user if file extension is passed as file name

example: .tar.gz is a file named .tar with extension .gz

this can be confusing because people might expect .tar.gz to be a
.tar.gz archive, but it's currently not
This commit is contained in:
João M. Bezerra 2022-10-11 17:33:46 -03:00
parent f8e6075ee4
commit f554e3c5f0
2 changed files with 12 additions and 11 deletions

View File

@ -34,7 +34,6 @@ impl Opts {
(true, true) => unreachable!(),
};
// TODO: change this to be just a single function call?
let file_visibility_policy = FileVisibilityPolicy::new()
.read_git_exclude(opts.gitignore)
.read_ignore(opts.gitignore)

View File

@ -3,6 +3,7 @@
use std::{ffi::OsStr, fmt, path::Path};
use self::CompressionFormat::*;
use crate::warning;
/// A wrapper around `CompressionFormat` that allows combinations like `tgz`
#[derive(Debug, Clone, Eq)]
@ -103,19 +104,20 @@ pub const SUPPORTED_EXTENSIONS: &[&str] = &[
"zst",
];
/// Extracts extensions from a path,
/// return both the remaining path and the list of extension objects
/// Extracts extensions from a path.
///
/// Returns both the remaining path and the list of extension objects
pub fn separate_known_extensions_from_name(mut path: &Path) -> (&Path, Vec<Extension>) {
// // TODO: check for file names with the name of an extension
// // TODO2: warn the user that currently .tar.gz is a .gz file named .tar
//
// let all = ["tar", "zip", "bz", "bz2", "gz", "xz", "lzma", "lz"];
// if path.file_name().is_some() && all.iter().any(|ext| path.file_name().unwrap() == *ext) {
// todo!("we found a extension in the path name instead, what to do with this???");
// }
let mut extensions = vec![];
if let Some(file_stem) = path.file_stem().and_then(OsStr::to_str) {
let file_stem = file_stem.trim_matches('.');
if SUPPORTED_EXTENSIONS.contains(&file_stem) {
warning!("Received a file with name '{file_stem}', but {file_stem} was expected as the extension.");
}
}
// While there is known extensions at the tail, grab them
while let Some(extension) = path.extension().and_then(OsStr::to_str) {
let formats: &[CompressionFormat] = match extension {