Update utouch command to match latest uu_touch

This commit is contained in:
ysthakur 2024-07-10 21:29:57 -04:00
parent 21c331ad83
commit aa95e6bdc8
3 changed files with 81 additions and 67 deletions

68
Cargo.lock generated
View File

@ -6377,7 +6377,7 @@ dependencies = [
"indicatif",
"libc",
"quick-error 2.0.1",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
"walkdir",
"xattr",
]
@ -6389,7 +6389,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "040aa4584036b2f65e05387b0ea9ac468afce1db325743ce5f350689fd9ce4ae"
dependencies = [
"clap",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
]
[[package]]
@ -6401,7 +6401,7 @@ dependencies = [
"clap",
"rand",
"tempfile",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
]
[[package]]
@ -6413,18 +6413,19 @@ dependencies = [
"clap",
"fs_extra",
"indicatif",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
]
[[package]]
name = "uu_touch"
version = "0.0.26"
version = "0.0.27"
source = "git+https://github.com/uutils/coreutils.git#c90b69398f708b4ab3b70c7497995f05f0ff1290"
dependencies = [
"chrono",
"clap",
"filetime",
"parse_datetime",
"uucore 0.0.26",
"uucore 0.0.27",
"windows-sys 0.48.0",
]
@ -6436,7 +6437,7 @@ checksum = "5951832d73199636bde6c0d61cf960932b3c4450142c290375bc10c7abed6db5"
dependencies = [
"clap",
"platform-info",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
]
[[package]]
@ -6447,7 +6448,7 @@ checksum = "e3b44166eb6335aeac42744ea368cc4c32d3f2287a4ff765a5ce44d927ab8bb4"
dependencies = [
"clap",
"libc",
"uucore 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore 0.0.26",
"windows-sys 0.48.0",
]
@ -6463,21 +6464,6 @@ dependencies = [
"nix",
"once_cell",
"os_display",
"uucore_procs 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"wild",
]
[[package]]
name = "uucore"
version = "0.0.26"
dependencies = [
"clap",
"glob",
"libc",
"nix",
"number_prefix",
"once_cell",
"os_display",
"uucore_procs 0.0.26",
"wild",
]
@ -6496,7 +6482,7 @@ dependencies = [
"number_prefix",
"once_cell",
"os_display",
"uucore_procs 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uucore_procs 0.0.26",
"walkdir",
"wild",
"winapi-util",
@ -6505,12 +6491,19 @@ dependencies = [
]
[[package]]
name = "uucore_procs"
version = "0.0.26"
name = "uucore"
version = "0.0.27"
source = "git+https://github.com/uutils/coreutils.git#c90b69398f708b4ab3b70c7497995f05f0ff1290"
dependencies = [
"proc-macro2",
"quote",
"uuhelp_parser 0.0.26",
"clap",
"glob",
"libc",
"nix",
"number_prefix",
"once_cell",
"os_display",
"uucore_procs 0.0.27",
"wild",
]
[[package]]
@ -6521,12 +6514,18 @@ checksum = "1a233a488da42f3ddb0aaa8a9f75a969e3f37e4de7e909d2d23f6aa3ee401d20"
dependencies = [
"proc-macro2",
"quote",
"uuhelp_parser 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uuhelp_parser 0.0.26",
]
[[package]]
name = "uuhelp_parser"
version = "0.0.26"
name = "uucore_procs"
version = "0.0.27"
source = "git+https://github.com/uutils/coreutils.git#c90b69398f708b4ab3b70c7497995f05f0ff1290"
dependencies = [
"proc-macro2",
"quote",
"uuhelp_parser 0.0.27",
]
[[package]]
name = "uuhelp_parser"
@ -6534,6 +6533,11 @@ version = "0.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "425a23c7b7145bc7620c9c445817c37b1f78b6790aee9f208133f3c028975b60"
[[package]]
name = "uuhelp_parser"
version = "0.0.27"
source = "git+https://github.com/uutils/coreutils.git#c90b69398f708b4ab3b70c7497995f05f0ff1290"
[[package]]
name = "uuid"
version = "1.8.0"

View File

@ -163,7 +163,7 @@ uu_cp = "0.0.25"
uu_mkdir = "0.0.25"
uu_mktemp = "0.0.25"
uu_mv = "0.0.25"
uu_touch = { path = "../coreutils/src/uu/touch" }
uu_touch = { git = "https://github.com/uutils/coreutils.git" }
uu_whoami = "0.0.25"
uu_uname = "0.0.25"
uucore = "0.0.25"

View File

@ -5,14 +5,17 @@ use chrono::{DateTime, FixedOffset};
use filetime::FileTime;
use nu_engine::CallExt;
use nu_path::expand_path_with;
use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack};
use nu_protocol::{
Category, Example, PipelineData, ShellError, Signature, Span, Spanned, SyntaxShape, Type,
Category, Example, NuGlob, PipelineData, ShellError, Signature, Spanned, SyntaxShape, Type,
};
use uu_touch::error::TouchError;
use uu_touch::{ChangeTimes, InputFile, Options, Source};
use super::util::get_rest_for_glob_pattern;
#[derive(Clone)]
pub struct UTouch;
@ -28,21 +31,21 @@ impl Command for UTouch {
fn signature(&self) -> Signature {
Signature::build("utouch")
.input_output_types(vec![ (Type::Nothing, Type::Nothing) ])
.required(
"filename",
SyntaxShape::Filepath,
"The path of the file you want to create.",
.rest(
"files",
SyntaxShape::OneOf(vec![SyntaxShape::GlobPattern, SyntaxShape::Filepath]),
"The file(s) to create."
)
.named(
"reference",
SyntaxShape::Filepath,
"change the file or directory time to the time of the reference file/directory",
"use the access and modification times of the reference file/directory instead of the current time",
Some('r'),
)
.named(
"timestamp",
SyntaxShape::DateTime,
"use the given time instead of the current time",
"use the given timestamp instead of the current time",
Some('t')
)
.named(
@ -53,12 +56,12 @@ impl Command for UTouch {
)
.switch(
"modified",
"change the modification time of the file or directory. If no timestamp, date or reference file/directory is given, the current time is used",
"change only the modification time (if used with -a, access time is changed too)",
Some('m'),
)
.switch(
"access",
"change the access time of the file or directory. If no timestamp, date or reference file/directory is given, the current time is used",
"change only the access time (if used with -m, modification time is changed too)",
Some('a'),
)
.switch(
@ -90,8 +93,16 @@ impl Command for UTouch {
let change_atime: bool = call.has_flag(engine_state, stack, "access")?;
let no_create: bool = call.has_flag(engine_state, stack, "no-create")?;
let no_deref: bool = call.has_flag(engine_state, stack, "no-dereference")?;
let target: Spanned<String> = call.req(engine_state, stack, 0)?;
let rest: Vec<Spanned<String>> = call.rest(engine_state, stack, 1)?;
let file_globs: Vec<Spanned<NuGlob>> =
get_rest_for_glob_pattern(engine_state, stack, call, 0)?;
let cwd = engine_state.cwd(Some(stack))?;
if file_globs.is_empty() {
return Err(ShellError::MissingParameter {
param_name: "requires file paths".to_string(),
span: call.head,
});
}
let (reference_file, reference_span) = if let Some(reference) =
call.get_flag::<Spanned<PathBuf>>(engine_state, stack, "reference")?
@ -144,15 +155,14 @@ impl Command for UTouch {
ChangeTimes::Both
};
let mut files = vec![InputFile::Path(PathBuf::from(target.item))];
let mut file_spans = vec![target.span];
for file in rest {
files.push(InputFile::Path(PathBuf::from(file.item)));
file_spans.push(file.span);
let mut input_files = Vec::new();
for file_glob in &file_globs {
let path = expand_path_with(file_glob.item.as_ref(), &cwd, file_glob.item.is_expand());
input_files.push(InputFile::Path(path));
}
if let Err(err) = uu_touch::touch(
&files,
&input_files,
&Options {
no_create,
no_deref,
@ -163,13 +173,21 @@ impl Command for UTouch {
},
) {
let nu_err = match err {
TouchError::TouchFileError { path, index, error } => ShellError::GenericError {
error: format!("Could not touch {}", path.display()),
msg: error.to_string(),
span: Some(file_globs[index].span),
help: None,
inner: Vec::new(),
},
TouchError::InvalidDateFormat(date) => ShellError::IncorrectValue {
msg: format!("Invalid date: {}", date),
val_span: date_span.expect("utouch was given a date"),
val_span: date_span.expect("utouch should've been given a date"),
call_span: call.head,
},
TouchError::ReferenceFileInaccessible(reference_path, io_err) => {
let span = reference_span.expect("utouch was given a reference file");
let span =
reference_span.expect("utouch should've been given a reference file");
if io_err.kind() == ErrorKind::NotFound {
// todo merge main into this to say which file not found
ShellError::FileNotFound {
@ -177,11 +195,13 @@ impl Command for UTouch {
file: reference_path.display().to_string(),
}
} else {
io_to_nu_err(
io_err,
format!("Failed to read metadata of {}", reference_path.display()),
span,
)
ShellError::GenericError {
error: io_err.to_string(),
msg: format!("Failed to read metadata of {}", reference_path.display()),
span: Some(span),
help: None,
inner: Vec::new(),
}
}
}
_ => ShellError::GenericError {
@ -233,13 +253,3 @@ impl Command for UTouch {
]
}
}
fn io_to_nu_err(err: std::io::Error, msg: String, span: Span) -> ShellError {
ShellError::GenericError {
error: err.to_string(),
msg,
span: Some(span),
help: None,
inner: Vec::new(),
}
}