From 176fa1a3e33f8388f32a4c442167e3bcb587543e Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Wed, 30 Nov 2022 01:10:58 -0700 Subject: [PATCH] Replace chrono with just time. And ugprade to time 0.3 --- Cargo.lock | 261 ++++++--------------------------------------- Cargo.toml | 5 +- src/filter/time.rs | 50 ++++++--- 3 files changed, 74 insertions(+), 242 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f14a0ae..1a18428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,15 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "ansi_term" version = "0.12.1" @@ -78,12 +69,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "bumpalo" -version = "3.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" - [[package]] name = "cc" version = "1.0.73" @@ -96,21 +81,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "time", - "wasm-bindgen", - "winapi", -] - [[package]] name = "clap" version = "4.0.22" @@ -158,22 +128,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - [[package]] name = "crossbeam-channel" version = "0.5.6" @@ -203,50 +157,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cxx" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "diff" version = "0.1.13" @@ -314,7 +224,6 @@ dependencies = [ "anyhow", "argmax", "atty", - "chrono", "clap", "clap_complete", "crossbeam-channel", @@ -337,6 +246,7 @@ dependencies = [ "regex-syntax", "tempdir", "test-case", + "time", "users", "version_check", ] @@ -379,7 +289,7 @@ checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -416,30 +326,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "iana-time-zone" -version = "0.1.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" -dependencies = [ - "cxx", - "cxx-build", -] - [[package]] name = "ignore" version = "0.4.18" @@ -485,15 +371,6 @@ dependencies = [ "libc", ] -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -506,15 +383,6 @@ version = "0.2.136" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55edcf6c0bb319052dea84732cf99db461780fd5e8d3eb46ab6ff312ab31f197" -[[package]] -name = "link-cplusplus" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" -dependencies = [ - "cc", -] - [[package]] name = "linux-raw-sys" version = "0.0.46" @@ -577,25 +445,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.13.1" @@ -606,6 +455,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.15.0" @@ -767,10 +625,10 @@ dependencies = [ ] [[package]] -name = "scratch" -version = "1.0.2" +name = "serde" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" [[package]] name = "strsim" @@ -871,13 +729,30 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", ] [[package]] @@ -886,12 +761,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "users" version = "0.11.0" @@ -919,72 +788,12 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 3659c05..5af47cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,6 @@ globset = "0.4" anyhow = "1.0" dirs-next = "2.0" normpath = "0.3.2" -chrono = "0.4" once_cell = "1.15.0" crossbeam-channel = "0.5.6" clap_complete = {version = "4.0.5", optional = true} @@ -57,6 +56,10 @@ faccess = "0.2.4" version = "4.0.22" features = ["suggestions", "color", "wrap_help", "cargo", "unstable-grouped", "derive"] +[dependencies.time] +version = "0.3" +features = ["parsing", "local-offset"] + [target.'cfg(unix)'.dependencies] users = "0.11.0" nix = { version = "0.24.2", default-features = false, features = ["signal"] } diff --git a/src/filter/time.rs b/src/filter/time.rs index e854c39..4c6bc4c 100644 --- a/src/filter/time.rs +++ b/src/filter/time.rs @@ -1,4 +1,5 @@ -use chrono::{offset::TimeZone, DateTime, Local, NaiveDate}; +use time::format_description::{parse as time_format, well_known::Rfc3339}; +use time::{Date, OffsetDateTime, PrimitiveDateTime, UtcOffset}; use std::time::SystemTime; @@ -9,23 +10,45 @@ pub enum TimeFilter { After(SystemTime), } +fn parse_local_time(s: &str) -> time::Result { + const DAY_FORMAT: &'static str = "[year]-[month]-[day]"; + const DATETIME_FORMAT: &'static str = "[year]-[month]-[day] [hour repr:24]:[minute]:[second]"; + let primitive = Date::parse(s, &time_format(DAY_FORMAT).unwrap()) + .map(|d| d.midnight()) + .or_else(|_| PrimitiveDateTime::parse(s, &time_format(DATETIME_FORMAT).unwrap()))?; + let offset = get_offset_for_local_time(primitive)?; + let local_time = primitive.assume_offset(offset); + + Ok(local_time) +} + +#[cfg(not(test))] +fn get_offset_for_local_time( + time: PrimitiveDateTime, +) -> Result { + UtcOffset::local_offset_at(time.assume_utc()) +} + +/// While running tests, there can be multiple threads, and `UtcOffset::local_offset_at` will fail +/// on unix if there are multiple threads, so during tests, we use a shim that just always returns +/// an offset of -4 +#[cfg(test)] +fn get_offset_for_local_time( + _time: PrimitiveDateTime, +) -> Result { + UtcOffset::from_hms(-4, 0, 0) +} + impl TimeFilter { fn from_str(ref_time: &SystemTime, s: &str) -> Option { humantime::parse_duration(s) .map(|duration| *ref_time - duration) .ok() .or_else(|| { - DateTime::parse_from_rfc3339(s) + OffsetDateTime::parse(s, &Rfc3339) + .or_else(|_| parse_local_time(s)) .map(|dt| dt.into()) .ok() - .or_else(|| { - NaiveDate::parse_from_str(s, "%F") - .map(|nd| nd.and_hms(0, 0, 0)) - .ok() - .and_then(|ndt| Local.from_local_datetime(&ndt).single()) - }) - .or_else(|| Local.datetime_from_str(s, "%F %T").ok()) - .map(|dt| dt.into()) }) } @@ -52,10 +75,7 @@ mod tests { #[test] fn is_time_filter_applicable() { - let ref_time = Local - .datetime_from_str("2010-10-10 10:10:10", "%F %T") - .unwrap() - .into(); + let ref_time = parse_local_time("2010-10-10 10:10:10").unwrap().into(); assert!(TimeFilter::after(&ref_time, "1min") .unwrap() @@ -109,7 +129,7 @@ mod tests { .unwrap() .applies_to(&t1m_ago)); - let ref_time = DateTime::parse_from_rfc3339("2010-10-10T10:10:10+00:00") + let ref_time = OffsetDateTime::parse("2010-10-10T10:10:10+00:00", &Rfc3339) .unwrap() .into(); let t1m_ago = ref_time - Duration::from_secs(60);