mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-27 11:07:44 +00:00
Merge pull request #4794 from shinhs0506/mv-target-dir
mv: check if --target is a directory
This commit is contained in:
commit
c5fb6eac9f
4 changed files with 67 additions and 2 deletions
|
@ -15,6 +15,7 @@ pub enum MvError {
|
||||||
DirectoryToNonDirectory(String),
|
DirectoryToNonDirectory(String),
|
||||||
NonDirectoryToDirectory(String, String),
|
NonDirectoryToDirectory(String, String),
|
||||||
NotADirectory(String),
|
NotADirectory(String),
|
||||||
|
TargetNotADirectory(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Error for MvError {}
|
impl Error for MvError {}
|
||||||
|
@ -34,7 +35,8 @@ impl Display for MvError {
|
||||||
Self::NonDirectoryToDirectory(s, t) => {
|
Self::NonDirectoryToDirectory(s, t) => {
|
||||||
write!(f, "cannot overwrite non-directory {t} with directory {s}")
|
write!(f, "cannot overwrite non-directory {t} with directory {s}")
|
||||||
}
|
}
|
||||||
Self::NotADirectory(t) => write!(f, "target {t} is not a directory"),
|
Self::NotADirectory(t) => write!(f, "target {t}: Not a directory"),
|
||||||
|
Self::TargetNotADirectory(t) => write!(f, "target directory {t}: Not a directory"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,7 +320,12 @@ fn exec(files: &[OsString], b: &Behavior) -> UResult<()> {
|
||||||
|
|
||||||
fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, b: &Behavior) -> UResult<()> {
|
fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, b: &Behavior) -> UResult<()> {
|
||||||
if !target_dir.is_dir() {
|
if !target_dir.is_dir() {
|
||||||
return Err(MvError::NotADirectory(target_dir.quote().to_string()).into());
|
match b.target_dir {
|
||||||
|
Some(_) => {
|
||||||
|
return Err(MvError::TargetNotADirectory(target_dir.quote().to_string()).into())
|
||||||
|
}
|
||||||
|
None => return Err(MvError::NotADirectory(target_dir.quote().to_string()).into()),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let canonized_target_dir = target_dir
|
let canonized_target_dir = target_dir
|
||||||
|
|
|
@ -55,6 +55,63 @@ fn test_mv_move_file_into_dir() {
|
||||||
assert!(at.file_exists(format!("{dir}/{file}")));
|
assert!(at.file_exists(format!("{dir}/{file}")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mv_move_file_into_dir_with_target_arg() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
let dir = "test_mv_move_file_into_dir_with_target_arg_dir";
|
||||||
|
let file = "test_mv_move_file_into_dir_with_target_arg_file";
|
||||||
|
|
||||||
|
at.mkdir(dir);
|
||||||
|
at.touch(file);
|
||||||
|
|
||||||
|
ucmd.arg("--target")
|
||||||
|
.arg(dir)
|
||||||
|
.arg(file)
|
||||||
|
.succeeds()
|
||||||
|
.no_stderr();
|
||||||
|
|
||||||
|
assert!(at.file_exists(format!("{dir}/{file}")))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mv_move_file_into_file_with_target_arg() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
let file1 = "test_mv_move_file_into_file_with_target_arg_file1";
|
||||||
|
let file2 = "test_mv_move_file_into_file_with_target_arg_file2";
|
||||||
|
|
||||||
|
at.touch(file1);
|
||||||
|
at.touch(file2);
|
||||||
|
|
||||||
|
ucmd.arg("--target")
|
||||||
|
.arg(file1)
|
||||||
|
.arg(file2)
|
||||||
|
.fails()
|
||||||
|
.stderr_is(format!("mv: target directory '{file1}': Not a directory\n"));
|
||||||
|
|
||||||
|
assert!(at.file_exists(file1))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mv_move_multiple_files_into_file() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
let file1 = "test_mv_move_multiple_files_into_file1";
|
||||||
|
let file2 = "test_mv_move_multiple_files_into_file2";
|
||||||
|
let file3 = "test_mv_move_multiple_files_into_file3";
|
||||||
|
|
||||||
|
at.touch(file1);
|
||||||
|
at.touch(file2);
|
||||||
|
at.touch(file3);
|
||||||
|
|
||||||
|
ucmd.arg(file1)
|
||||||
|
.arg(file2)
|
||||||
|
.arg(file3)
|
||||||
|
.fails()
|
||||||
|
.stderr_is(format!("mv: target '{file3}': Not a directory\n"));
|
||||||
|
|
||||||
|
assert!(at.file_exists(file1));
|
||||||
|
assert!(at.file_exists(file2));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mv_move_file_between_dirs() {
|
fn test_mv_move_file_between_dirs() {
|
||||||
let (at, mut ucmd) = at_and_ucmd!();
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
|
|
@ -222,6 +222,7 @@ sed -i -Ez "s/\n([^\n#]*pad-3\.2[^\n]*)\n([^\n]*)\n([^\n]*)/\n# uutils\/numfmt s
|
||||||
|
|
||||||
# Update the GNU error message to match the one generated by clap
|
# Update the GNU error message to match the one generated by clap
|
||||||
sed -i -e "s/\$prog: multiple field specifications/error: The argument '--field <FIELDS>' was provided more than once, but cannot be used multiple times\n\nUsage: numfmt [OPTION]... [NUMBER]...\n\n\nFor more information try '--help'/g" tests/misc/numfmt.pl
|
sed -i -e "s/\$prog: multiple field specifications/error: The argument '--field <FIELDS>' was provided more than once, but cannot be used multiple times\n\nUsage: numfmt [OPTION]... [NUMBER]...\n\n\nFor more information try '--help'/g" tests/misc/numfmt.pl
|
||||||
|
sed -i -e "s/Try 'mv --help' for more information/For more information, try '--help'/g" -e "s/mv: missing file operand/error: the following required arguments were not provided:\n <files>...\n\nUsage: mv [OPTION]... [-T] SOURCE DEST\n mv [OPTION]... SOURCE... DIRECTORY\n mv [OPTION]... -t DIRECTORY SOURCE...\n/g" -e "s/mv: missing destination file operand after 'no-file'/error: The argument '<files>...' requires at least 2 values, but only 1 was provided\n\nUsage: mv [OPTION]... [-T] SOURCE DEST\n mv [OPTION]... SOURCE... DIRECTORY\n mv [OPTION]... -t DIRECTORY SOURCE...\n/g" tests/mv/diag.sh
|
||||||
|
|
||||||
# GNU doesn't support width > INT_MAX
|
# GNU doesn't support width > INT_MAX
|
||||||
# disable these test cases
|
# disable these test cases
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue