diff options
author | Pádraig Brady <P@draigBrady.com> | 2023-04-01 16:27:52 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2023-04-08 12:11:50 +0100 |
commit | db28af406f311ac8f78604cc5906613866aecef5 (patch) | |
tree | 23c7a3ab85ed425be66ee0ddc8b298769171445d /tests/mv/update.sh | |
parent | 5891d28edebe229f1a6057275e281b10c1f2247b (diff) | |
download | coreutils-db28af406f311ac8f78604cc5906613866aecef5.tar.gz |
cp,mv: add --update=none to always skip existing files
Add --update=none which is equivalent to the --no-clobber behavior
from before coreutils 9.2. I.e. existing files are unconditionally
skipped, and them not being replaced does not affect the exit status.
* src/copy.h [enum Update_type]: A new type to support parameters
to the --update command line option.
[enum Interactive]: Add I_ALWAYS_SKIP.
* src/copy.c: Treat I_ALWAYS_SKIP like I_ALWAYS_NO (-n),
except that we don't fail when skipping.
* src/system.h (emit_update_parameters_note): A new function
to output the description of the new --update parameters.
* src/cp.c (main): Parse --update arguments, ensuring that
-n takes precedence if specified.
(usage): Describe the new option. Also allude that
-u is related in the -n description.
* src/mv.c: Accept the new --update parameters and
update usage() accordingly.
* doc/coreutils.texi (cp invocation): Describe the new --update
parameters. Also reference --update from the --no-clobber description.
(mv invocation): Likewise.
* tests/mv/update.sh: Test the new parameters.
* NEWS: Mention the new feature.
Addresses https://bugs.gnu.org/62572
Diffstat (limited to 'tests/mv/update.sh')
-rwxr-xr-x | tests/mv/update.sh | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/tests/mv/update.sh b/tests/mv/update.sh index d3ec6120c..ab7309f06 100755 --- a/tests/mv/update.sh +++ b/tests/mv/update.sh @@ -19,11 +19,13 @@ . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src print_ver_ cp mv -echo old > old || framework_failure_ -touch -d yesterday old || framework_failure_ -echo new > new || framework_failure_ - +test_reset() { + echo old > old || framework_failure_ + touch -d yesterday old || framework_failure_ + echo new > new || framework_failure_ +} +test_reset for interactive in '' -i; do for cp_or_mv in cp mv; do # This is a no-op, with no prompt. @@ -36,19 +38,32 @@ for interactive in '' -i; do done done -# This will actually perform the rename. -mv --update new old || fail=1 -test -f new && fail=1 -case "$(cat old)" in new) ;; *) fail=1 ;; esac +# These should perform the rename / copy +for update_option in '--update' '--update=older' '--update=all' \ + '--update=none --update=all'; do + test_reset + mv $update_option new old || fail=1 + test -f new && fail=1 + case "$(cat old)" in new) ;; *) fail=1 ;; esac + + test_reset + cp $update_option new old || fail=1 + case "$(cat old)" in new) ;; *) fail=1 ;; esac + case "$(cat new)" in new) ;; *) fail=1 ;; esac +done -# Restore initial conditions. -echo old > old || framework_failure_ -touch -d yesterday old || fail=1 -echo new > new || framework_failure_ +# These should not perform the rename / copy +for update_option in '--update=none' \ + '--update=all --update=none'; do + test_reset + mv $update_option new old || fail=1 + case "$(cat new)" in new) ;; *) fail=1 ;; esac + case "$(cat old)" in old) ;; *) fail=1 ;; esac -# This will actually perform the copy. -cp --update new old || fail=1 -case "$(cat old)" in new) ;; *) fail=1 ;; esac -case "$(cat new)" in new) ;; *) fail=1 ;; esac + test_reset + cp $update_option new old || fail=1 + case "$(cat new)" in new) ;; *) fail=1 ;; esac + case "$(cat old)" in old) ;; *) fail=1 ;; esac +done Exit $fail |