forked from extern/nushell
readd update flag to cp command (#10824)
# Description - this PR should close #10819 # User-Facing Changes Behaviour is similar to pre 0.86.0 behaviour of the cp command and should as such not have a user-facing change, only compared to the current version, were the option is readded. # After Submitting I guess the documentation will be automatically updated and as this feature is no further highlighted, probably, no more work will be needed here. # Considerations coreutils actually allows a third option: ``` pub enum UpdateMode { // --update=`all`, ReplaceAll, // --update=`none` ReplaceNone, // --update=`older` // -u ReplaceIfOlder, } ``` namely `ReplaceNone`, which I have not added. Also I think that specifying `--update 'abc'` is non functional.
This commit is contained in:
parent
f043a8a8ff
commit
8429aec57f
@ -7,7 +7,7 @@ use nu_protocol::{
|
||||
Category, Example, PipelineData, ShellError, Signature, Spanned, SyntaxShape, Type,
|
||||
};
|
||||
use std::path::PathBuf;
|
||||
use uu_cp::{BackupMode, UpdateMode};
|
||||
use uu_cp::{BackupMode, CopyMode, UpdateMode};
|
||||
|
||||
// TODO: related to uucore::error::set_exit_code(EXIT_ERR)
|
||||
// const EXIT_ERR: i32 = 1;
|
||||
@ -46,6 +46,11 @@ impl Command for UCp {
|
||||
Some('f'),
|
||||
)
|
||||
.switch("interactive", "ask before overwriting files", Some('i'))
|
||||
.switch(
|
||||
"update",
|
||||
"copy only when the SOURCE file is newer than the destination file or when the destination file is missing",
|
||||
Some('u')
|
||||
)
|
||||
.switch("progress", "display a progress bar", Some('p'))
|
||||
.switch("no-clobber", "do not overwrite an existing file", Some('n'))
|
||||
.switch("debug", "explain how a file is copied. Implies -v", None)
|
||||
@ -76,6 +81,11 @@ impl Command for UCp {
|
||||
example: "cp *.txt dir_a",
|
||||
result: None,
|
||||
},
|
||||
Example {
|
||||
description: "Copy only if source file is newer than target file",
|
||||
example: "cp -u a b",
|
||||
result: None,
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
@ -87,6 +97,11 @@ impl Command for UCp {
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let interactive = call.has_flag("interactive");
|
||||
let (update, copy_mode) = if call.has_flag("update") {
|
||||
(UpdateMode::ReplaceIfOlder, CopyMode::Update)
|
||||
} else {
|
||||
(UpdateMode::ReplaceAll, CopyMode::Copy)
|
||||
};
|
||||
let force = call.has_flag("force");
|
||||
let no_clobber = call.has_flag("no-clobber");
|
||||
let progress = call.has_flag("progress");
|
||||
@ -198,7 +213,7 @@ impl Command for UCp {
|
||||
backup: BackupMode::NoBackup,
|
||||
copy_contents: false,
|
||||
cli_dereference: false,
|
||||
copy_mode: uu_cp::CopyMode::Copy,
|
||||
copy_mode,
|
||||
no_target_dir: false,
|
||||
one_file_system: false,
|
||||
parents: false,
|
||||
@ -207,7 +222,7 @@ impl Command for UCp {
|
||||
attributes: uu_cp::Attributes::NONE,
|
||||
backup_suffix: String::from("~"),
|
||||
target_dir: None,
|
||||
update: UpdateMode::ReplaceAll,
|
||||
update,
|
||||
};
|
||||
|
||||
if let Err(error) = uu_cp::copy(&sources, &target_path, &options) {
|
||||
|
@ -582,7 +582,6 @@ fn copy_file_with_read_permission_impl(progress: bool) {
|
||||
});
|
||||
}
|
||||
|
||||
#[ignore = "not implemented with ucp"]
|
||||
#[test]
|
||||
fn copy_file_with_update_flag() {
|
||||
copy_file_with_update_flag_impl(false);
|
||||
|
Loading…
Reference in New Issue
Block a user