1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

cp: treat an empty file name as a non-existing file

This commit is contained in:
Samuel Tardieu 2024-09-07 20:57:49 +02:00 committed by Ben Wiederhake
parent 22401f827b
commit dd9e7ad363
2 changed files with 30 additions and 4 deletions

View file

@ -9,6 +9,7 @@ use std::cmp::Ordering;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
#[cfg(not(windows))] #[cfg(not(windows))]
use std::ffi::CString; use std::ffi::CString;
use std::ffi::OsString;
use std::fs::{self, File, Metadata, OpenOptions, Permissions}; use std::fs::{self, File, Metadata, OpenOptions, Permissions};
use std::io; use std::io;
#[cfg(unix)] #[cfg(unix)]
@ -677,7 +678,7 @@ pub fn uu_app() -> Command {
Arg::new(options::PATHS) Arg::new(options::PATHS)
.action(ArgAction::Append) .action(ArgAction::Append)
.value_hint(clap::ValueHint::AnyPath) .value_hint(clap::ValueHint::AnyPath)
.value_parser(ValueParser::path_buf()), .value_parser(ValueParser::os_string()),
) )
} }
@ -707,8 +708,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
} }
let paths: Vec<PathBuf> = matches let paths: Vec<PathBuf> = matches
.remove_many::<PathBuf>(options::PATHS) .remove_many::<OsString>(options::PATHS)
.map(|v| v.collect()) .map(|v| v.map(PathBuf::from).collect())
.unwrap_or_default(); .unwrap_or_default();
let (sources, target) = parse_path_args(paths, &options)?; let (sources, target) = parse_path_args(paths, &options)?;

View file

@ -54,7 +54,6 @@ static TEST_MOUNT_COPY_FROM_FOLDER: &str = "dir_with_mount";
static TEST_MOUNT_MOUNTPOINT: &str = "mount"; static TEST_MOUNT_MOUNTPOINT: &str = "mount";
#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] #[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))]
static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt"; static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt";
#[cfg(unix)]
static TEST_NONEXISTENT_FILE: &str = "nonexistent_file.txt"; static TEST_NONEXISTENT_FILE: &str = "nonexistent_file.txt";
#[cfg(all( #[cfg(all(
unix, unix,
@ -169,6 +168,32 @@ fn test_cp_multiple_files() {
assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n"); assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n");
} }
#[test]
fn test_cp_multiple_files_with_nonexistent_file() {
let (at, mut ucmd) = at_and_ucmd!();
ucmd.arg(TEST_HELLO_WORLD_SOURCE)
.arg(TEST_NONEXISTENT_FILE)
.arg(TEST_HOW_ARE_YOU_SOURCE)
.arg(TEST_COPY_TO_FOLDER)
.fails();
assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n");
assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n");
}
#[test]
fn test_cp_multiple_files_with_empty_file_name() {
let (at, mut ucmd) = at_and_ucmd!();
ucmd.arg(TEST_HELLO_WORLD_SOURCE)
.arg("")
.arg(TEST_HOW_ARE_YOU_SOURCE)
.arg(TEST_COPY_TO_FOLDER)
.fails();
assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n");
assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n");
}
#[test] #[test]
// FixME: for MacOS, this has intermittent failures; track repair progress at GH:uutils/coreutils/issues/1590 // FixME: for MacOS, this has intermittent failures; track repair progress at GH:uutils/coreutils/issues/1590
#[cfg(not(target_os = "macos"))] #[cfg(not(target_os = "macos"))]