mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
Merge pull request #4826 from cakebaker/mv_4795
mv: if more than one of -i, -f, -n is specified, only the final one takes effect
This commit is contained in:
commit
9ed7ac1481
3 changed files with 45 additions and 2 deletions
|
@ -9,6 +9,8 @@ Move `SOURCE` to `DEST`, or multiple `SOURCE`(s) to `DIRECTORY`.
|
||||||
|
|
||||||
## After Help
|
## After Help
|
||||||
|
|
||||||
|
When specifying more than one of -i, -f, -n, only the final one will take effect.
|
||||||
|
|
||||||
Do not move a non-directory that has an existing destination with the same or newer modification timestamp;
|
Do not move a non-directory that has an existing destination with the same or newer modification timestamp;
|
||||||
instead, silently skip the file without failing. If the move is across file system boundaries, the comparison is
|
instead, silently skip the file without failing. If the move is across file system boundaries, the comparison is
|
||||||
to the source timestamp truncated to the resolutions of the destination file system and of the system calls used
|
to the source timestamp truncated to the resolutions of the destination file system and of the system calls used
|
||||||
|
|
|
@ -70,7 +70,7 @@ static ARG_FILES: &str = "files";
|
||||||
|
|
||||||
#[uucore::main]
|
#[uucore::main]
|
||||||
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
||||||
let mut app = uu_app().after_help(backup_control::BACKUP_CONTROL_LONG_HELP);
|
let mut app = uu_app();
|
||||||
let matches = app.try_get_matches_from_mut(args)?;
|
let matches = app.try_get_matches_from_mut(args)?;
|
||||||
|
|
||||||
if !matches.contains_id(OPT_TARGET_DIRECTORY)
|
if !matches.contains_id(OPT_TARGET_DIRECTORY)
|
||||||
|
@ -138,13 +138,17 @@ pub fn uu_app() -> Command {
|
||||||
.version(crate_version!())
|
.version(crate_version!())
|
||||||
.about(ABOUT)
|
.about(ABOUT)
|
||||||
.override_usage(format_usage(USAGE))
|
.override_usage(format_usage(USAGE))
|
||||||
.after_help(AFTER_HELP)
|
.after_help(format!(
|
||||||
|
"{AFTER_HELP}\n\n{}",
|
||||||
|
backup_control::BACKUP_CONTROL_LONG_HELP
|
||||||
|
))
|
||||||
.infer_long_args(true)
|
.infer_long_args(true)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(OPT_FORCE)
|
Arg::new(OPT_FORCE)
|
||||||
.short('f')
|
.short('f')
|
||||||
.long(OPT_FORCE)
|
.long(OPT_FORCE)
|
||||||
.help("do not prompt before overwriting")
|
.help("do not prompt before overwriting")
|
||||||
|
.overrides_with_all([OPT_INTERACTIVE, OPT_NO_CLOBBER])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -152,6 +156,7 @@ pub fn uu_app() -> Command {
|
||||||
.short('i')
|
.short('i')
|
||||||
.long(OPT_INTERACTIVE)
|
.long(OPT_INTERACTIVE)
|
||||||
.help("prompt before override")
|
.help("prompt before override")
|
||||||
|
.overrides_with_all([OPT_FORCE, OPT_NO_CLOBBER])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -159,6 +164,7 @@ pub fn uu_app() -> Command {
|
||||||
.short('n')
|
.short('n')
|
||||||
.long(OPT_NO_CLOBBER)
|
.long(OPT_NO_CLOBBER)
|
||||||
.help("do not overwrite an existing file")
|
.help("do not overwrite an existing file")
|
||||||
|
.overrides_with_all([OPT_FORCE, OPT_INTERACTIVE])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
|
|
@ -280,6 +280,41 @@ fn test_mv_interactive_dir_to_file_not_affirmative() {
|
||||||
assert!(at.dir_exists(dir));
|
assert!(at.dir_exists(dir));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mv_interactive_no_clobber_force_last_arg_wins() {
|
||||||
|
let scene = TestScenario::new(util_name!());
|
||||||
|
let at = &scene.fixtures;
|
||||||
|
|
||||||
|
let file_a = "a.txt";
|
||||||
|
let file_b = "b.txt";
|
||||||
|
|
||||||
|
at.touch(file_a);
|
||||||
|
at.touch(file_b);
|
||||||
|
|
||||||
|
scene
|
||||||
|
.ucmd()
|
||||||
|
.args(&[file_a, file_b, "-f", "-i", "-n"])
|
||||||
|
.fails()
|
||||||
|
.stderr_is(format!("mv: not replacing '{file_b}'\n"));
|
||||||
|
|
||||||
|
scene
|
||||||
|
.ucmd()
|
||||||
|
.args(&[file_a, file_b, "-n", "-f", "-i"])
|
||||||
|
.fails()
|
||||||
|
.stderr_is(format!("mv: overwrite '{file_b}'? "));
|
||||||
|
|
||||||
|
at.write(file_a, "aa");
|
||||||
|
|
||||||
|
scene
|
||||||
|
.ucmd()
|
||||||
|
.args(&[file_a, file_b, "-i", "-n", "-f"])
|
||||||
|
.succeeds()
|
||||||
|
.no_output();
|
||||||
|
|
||||||
|
assert!(!at.file_exists(file_a));
|
||||||
|
assert_eq!("aa", at.read(file_b));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mv_arg_update_interactive() {
|
fn test_mv_arg_update_interactive() {
|
||||||
let (at, mut ucmd) = at_and_ucmd!();
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue