diff --git a/Cargo.lock b/Cargo.lock index fa23c1ace..77afc4470 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,16 +1172,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "humantime_to_duration" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714764645f21cc70c4c151d7798dd158409641f37ad820bed65224aae403cbed" -dependencies = [ - "regex", - "time", -] - [[package]] name = "iana-time-zone" version = "0.1.53" @@ -3237,7 +3227,7 @@ version = "0.0.19" dependencies = [ "clap", "filetime", - "humantime_to_duration", + "parse_datetime", "time", "uucore", "windows-sys 0.48.0", diff --git a/Cargo.toml b/Cargo.toml index ed9971d95..2828c00df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ # coreutils (uutils) # * see the repository LICENSE, README, and CONTRIBUTING files for more information -# spell-checker:ignore (libs) libselinux gethostid procfs bigdecimal kqueue fundu mangen datetime uuhelp memmap +# spell-checker:ignore (libs) bigdecimal datetime fundu gethostid kqueue libselinux mangen memmap procfs uuhelp [package] name = "coreutils" diff --git a/src/uu/touch/Cargo.toml b/src/uu/touch/Cargo.toml index f90725197..4e27027a2 100644 --- a/src/uu/touch/Cargo.toml +++ b/src/uu/touch/Cargo.toml @@ -1,4 +1,4 @@ -# spell-checker:ignore humantime +# spell-checker:ignore datetime [package] name = "uu_touch" version = "0.0.19" @@ -18,8 +18,7 @@ path = "src/touch.rs" [dependencies] filetime = { workspace = true } clap = { workspace = true } -# TODO: use workspace dependency (0.3) when switching from time to chrono -humantime_to_duration = "0.2.1" +parse_datetime = { workspace = true } time = { workspace = true, features = [ "parsing", "formatting", diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 4efea56c4..f4784f155 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -84,13 +84,9 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { ) { (Some(reference), Some(date)) => { let (atime, mtime) = stat(Path::new(reference), !matches.get_flag(options::NO_DEREF))?; - if let Ok(offset) = humantime_to_duration::from_str(date) { - let mut seconds = offset.whole_seconds(); - let mut nanos = offset.subsec_nanoseconds(); - if nanos < 0 { - nanos += 1_000_000_000; - seconds -= 1; - } + if let Ok(offset) = parse_datetime::from_str(date) { + let seconds = offset.num_seconds(); + let nanos = offset.num_nanoseconds().unwrap_or(0) % 1_000_000_000; let ref_atime_secs = atime.unix_seconds(); let ref_atime_nanos = atime.nanoseconds(); @@ -445,9 +441,13 @@ fn parse_date(s: &str) -> UResult { } } - if let Ok(duration) = humantime_to_duration::from_str(s) { + if let Ok(duration) = parse_datetime::from_str(s) { let now_local = time::OffsetDateTime::now_local().unwrap(); - let diff = now_local.checked_add(duration).unwrap(); + let diff = now_local + .checked_add(time::Duration::nanoseconds( + duration.num_nanoseconds().unwrap(), + )) + .unwrap(); return Ok(local_dt_to_filetime(diff)); }