From ca73d85c09d868519b68bc4b8917765a5cb03f3d Mon Sep 17 00:00:00 2001 From: Embers-of-the-Fire Date: Thu, 1 Aug 2024 09:43:06 +0800 Subject: [PATCH] Add `--upgrade` switch for `mv` command (#13505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Add `--upgrade, -u` switch for `mv` command, corresponding to `cp`. Closes #13458. # User-Facing Changes ```plain ❯ help mv | find update ╭──────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 0 │ -u, --update - move and overwite only when the SOURCE file is newer than the destination file or when the destination file is missing │ ╰──────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` # Tests + Formatting - [x] `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - [x] `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style - [x] `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging)) - [x] `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the tests for the standard library P.S. The standard test kit (`nu-test-support`) doesn't provide utility to create file with modification timestamp, and I didn't find any test for this in `cp` command. I had tested on my local machine but I'm not sure how to integrate it into ci. If unit testing is required, I may need your guidance. # After Submitting - [x] Command docs are auto generated. --- crates/nu-command/src/filesystem/umv.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/nu-command/src/filesystem/umv.rs b/crates/nu-command/src/filesystem/umv.rs index d5c58f30e4..0c10df9ab2 100644 --- a/crates/nu-command/src/filesystem/umv.rs +++ b/crates/nu-command/src/filesystem/umv.rs @@ -30,6 +30,11 @@ impl Command for UMv { example: "mv test.txt my/subdirectory", result: None, }, + Example { + description: "Move only if source file is newer than target file", + example: "mv -u new/test.txt old/", + result: None, + }, Example { description: "Move many files into a directory", example: "mv *.txt my/subdirectory", @@ -49,6 +54,11 @@ impl Command for UMv { .switch("verbose", "explain what is being done.", Some('v')) .switch("progress", "display a progress bar", Some('p')) .switch("interactive", "prompt before overwriting", Some('i')) + .switch( + "update", + "move and overwrite only when the SOURCE file is newer than the destination file or when the destination file is missing", + Some('u') + ) .switch("no-clobber", "do not overwrite an existing file", Some('n')) .rest( "paths", @@ -77,6 +87,11 @@ impl Command for UMv { } else { uu_mv::OverwriteMode::Force }; + let update = if call.has_flag(engine_state, stack, "update")? { + UpdateMode::ReplaceIfOlder + } else { + UpdateMode::ReplaceAll + }; #[allow(deprecated)] let cwd = current_dir(engine_state, stack)?; @@ -164,7 +179,7 @@ impl Command for UMv { verbose, suffix: String::from("~"), backup: BackupMode::NoBackup, - update: UpdateMode::ReplaceAll, + update, target_dir: None, no_target_dir: false, strip_slashes: false,