From 89b83c2f6ada1f2cac062a2fdfd6ea0de341fbfd Mon Sep 17 00:00:00 2001 From: august radjoe Date: Sat, 18 Mar 2023 09:19:57 -0400 Subject: [PATCH] A better handler for `./coreutils date -f aze` (#4482) --- src/uu/date/src/date.rs | 22 +++++++++++++--------- tests/by-util/test_date.rs | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 2f428fa68..3c9488e7f 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -203,9 +203,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { return set_system_datetime(date); } else { - // Declare a file here because it needs to outlive the `dates` iterator. - let file: File; - // Get the current time, either in the local time zone or UTC. let now: DateTime = if settings.utc { let now = Utc::now(); @@ -222,12 +219,19 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let iter = std::iter::once(date); Box::new(iter) } - DateSource::File(ref path) => { - file = File::open(path).unwrap(); - let lines = BufReader::new(file).lines(); - let iter = lines.filter_map(Result::ok).map(parse_date); - Box::new(iter) - } + DateSource::File(ref path) => match File::open(path) { + Ok(file) => { + let lines = BufReader::new(file).lines(); + let iter = lines.filter_map(Result::ok).map(parse_date); + Box::new(iter) + } + Err(_err) => { + return Err(USimpleError::new( + 2, + format!("{}: No such file or directory", path.display()), + )); + } + }, DateSource::Now => { let iter = std::iter::once(Ok(now)); Box::new(iter) diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 7a353dd23..7451574ff 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -266,6 +266,24 @@ fn test_date_set_valid_2() { } } +#[test] +fn test_date_for_invalid_file() { + let result = new_ucmd!().arg("--file").arg("invalid_file").fails(); + result.no_stdout(); + assert_eq!( + result.stderr_str().trim(), + "date: invalid_file: No such file or directory", + ); +} + +#[test] +fn test_date_for_file() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_date_for_file"; + at.touch(file); + ucmd.arg("--file").arg(file).succeeds(); +} + #[test] #[cfg(all(unix, not(target_os = "macos")))] /// TODO: expected to fail currently; change to succeeds() when required.