replacement in pijul-remote/src/ssh.rs at line 1099
[7.5863]→[7.107:174](∅→∅) − revision = revision.max(id.last_modified.timestamp());
+ revision = revision.max(id.last_modified.as_second());
edit in pijul-identity/src/lib.rs at line 47
[7.599]→[7.17142:17143](∅→∅),
[7.1997]→[7.17142:17143](∅→∅),
[7.17142]→[7.17142:17143](∅→∅),
[7.17143]→[7.1998:2047](∅→∅) −
− use libpijul::key::{PublicKey, SKey, SecretKey};
edit in pijul-identity/src/lib.rs at line 52
+ use std::sync::OnceLock;
edit in pijul-identity/src/lib.rs at line 54
+ use jiff::Timestamp;
+ use libpijul::key::{PublicKey, SKey, SecretKey};
edit in pijul-identity/src/lib.rs at line 58
[5.44]→[7.0:25](∅→∅),
[7.2141]→[7.0:25](∅→∅) − use std::sync::OnceLock;
replacement in pijul-identity/src/lib.rs at line 170
[7.5161]→[7.5161:5215](∅→∅) − pub last_modified: chrono::DateTime<chrono::Utc>,
+ pub last_modified: Timestamp,
replacement in pijul-identity/src/lib.rs at line 199
[7.5786]→[7.5786:5841](∅→∅) − last_modified: chrono::offset::Utc::now(),
+ last_modified: Timestamp::now(),
replacement in pijul-identity/src/lib.rs at line 242
[7.6533]→[7.6533:6588](∅→∅) − last_modified: chrono::offset::Utc::now(),
+ last_modified: Timestamp::now(),
edit in pijul-identity/src/create.rs at line 8
replacement in pijul-identity/src/create.rs at line 114
[7.10793]→[7.10793:10858](∅→∅) − new_identity.last_modified = chrono::offset::Utc::now();
+ new_identity.last_modified = Timestamp::now();
replacement in pijul-identity/src/create.rs at line 193
[7.31374]→[7.31374:31445](∅→∅) − .map(|date| date.format("%Y-%m-%d %H:%M:%S").to_string());
+ .map(|date| date.strftime("%Y-%m-%d %H:%M:%S (%Z)").to_string());
replacement in pijul-identity/src/create.rs at line 205
[7.31813]→[7.2624:2675](∅→∅) − let time_stamp: String = Input::new()?
+ // TODO: the timestamp is parsed twice
+ let expiry_date: String = Input::new()?
replacement in pijul-identity/src/create.rs at line 209
[7.32013]→[7.2676:2752](∅→∅),
[7.2752]→[7.32088:32308](∅→∅),
[7.32088]→[7.32088:32308](∅→∅) − .with_validator(move |input: &String| -> Result<(), &str> {
− let parsed_date = dateparser::parse_with_timezone(input, &chrono::offset::Utc);
− if parsed_date.is_err() {
− return Err("Invalid date");
− }
+ .with_validator(move |input: &String| -> Result<(), String> {
+ let expiry_date: Timestamp = input
+ .parse()
+ .map_err(|error| format!("Unable to parse date: {error:#?}"))?;
replacement in pijul-identity/src/create.rs at line 214
[7.32309]→[7.32309:32510](∅→∅) − let date = parsed_date.unwrap();
− if chrono::offset::Utc::now().timestamp_millis() > date.timestamp_millis() {
− Err("Date is in the past")
+ if expiry_date <= Timestamp::now() {
+ Err("Date is in the past".to_string())
replacement in pijul-identity/src/create.rs at line 222
[7.32647]→[7.32647:32780](∅→∅) − Some(dateparser::parse_with_timezone(
− &time_stamp,
− &chrono::offset::Utc,
− )?)
+ Some(expiry_date.parse()?)
edit in pijul-identity/Cargo.toml at line 20
[7.1339]→[7.1339:1391](∅→∅) − chrono.workspace = true
− dateparser.workspace = true
edit in pijul-identity/Cargo.toml at line 21
edit in pijul/tests/common/identity.rs at line 10
replacement in pijul/tests/common/identity.rs at line 207
[7.23962]→[7.23962:24082](∅→∅) − let parsed_time_stamp =
− dateparser::parse_with_timezone(time_stamp, &chrono::offset::Utc)?;
+ let parsed_time_stamp: Timestamp = time_stamp.parse().unwrap();
replacement in pijul/tests/common/identity.rs at line 211
[7.24157]→[7.24157:24222](∅→∅) − parsed_time_stamp.format("%Y-%m-%d").to_string()
+ parsed_time_stamp.strftime("%Y-%m-%d").to_string()
edit in pijul/src/commands/tag.rs at line 4
− use crate::commands::record::parse_datetime_rfc2822;
edit in pijul/src/commands/tag.rs at line 6
replacement in pijul/src/commands/tag.rs at line 42
[7.1086]→[7.54:129](∅→∅),
[7.120]→[7.1122:1154](∅→∅),
[7.129]→[7.1122:1154](∅→∅),
[7.1122]→[7.1122:1154](∅→∅) − #[clap(long = "timestamp", value_parser = parse_datetime_rfc2822)]
− timestamp: Option<i64>,
+ #[clap(long = "timestamp")]
+ timestamp: Option<Timestamp>,
replacement in pijul/src/commands/tag.rs at line 273
[7.4679]→[7.4679:4707](∅→∅) − timestamp: Option<i64>,
+ timestamp: Option<Timestamp>,
replacement in pijul/src/commands/tag.rs at line 289
[7.5200]→[7.5200:5248](∅→∅),
[7.5248]→[7.1141:1315](∅→∅),
[7.1315]→[2.50:50](∅→∅),
[2.50]→[7.5345:5404](∅→∅),
[7.110]→[7.5345:5404](∅→∅),
[7.127]→[7.5345:5404](∅→∅),
[7.641]→[7.5345:5404](∅→∅),
[7.1315]→[7.5345:5404](∅→∅),
[7.5345]→[7.5345:5404](∅→∅) − timestamp: if let Some(t) = timestamp {
− chrono::DateTime::from_naive_utc_and_offset(
− chrono::NaiveDateTime::from_timestamp_opt(t, 0).unwrap(),
− chrono::Utc,
− )
−
− } else {
− chrono::Utc::now()
− },
+ timestamp: timestamp.unwrap_or_else(Timestamp::now),
edit in pijul/src/commands/record.rs at line 7
[7.55]→[7.101804:101821](∅→∅),
[7.63]→[7.101804:101821](∅→∅),
[7.1486]→[7.101804:101821](∅→∅),
[7.101804]→[7.101804:101821](∅→∅) edit in pijul/src/commands/record.rs at line 8
replacement in pijul/src/commands/record.rs at line 40
[7.863]→[7.130:201](∅→∅),
[7.65]→[7.102495:102527](∅→∅),
[7.201]→[7.102495:102527](∅→∅),
[7.102495]→[7.102495:102527](∅→∅) − #[clap(long = "timestamp", value_parser = parse_datetime_rfc2822)]
− pub timestamp: Option<i64>,
+ #[clap(long = "timestamp")]
+ pub timestamp: Option<Timestamp>,
edit in pijul/src/commands/record.rs at line 61
[7.102760]→[7.202:341](∅→∅),
[7.341]→[7.0:35](∅→∅),
[7.35]→[7.266:272](∅→∅),
[7.375]→[7.266:272](∅→∅),
[7.266]→[7.266:272](∅→∅),
[7.272]→[7.0:31](∅→∅),
[7.31]→[7.36:58](∅→∅),
[7.58]→[7.52:58](∅→∅),
[7.52]→[7.52:58](∅→∅),
[7.58]→[7.272:312](∅→∅),
[7.272]→[7.272:312](∅→∅) − pub(crate) fn parse_datetime_rfc2822(s: &str) -> Result<i64, &'static str> {
− if let Ok(ts) = chrono::DateTime::parse_from_rfc2822(s) {
− return Ok(ts.timestamp());
− }
− if let Ok(t) = s.parse() {
− return Ok(t);
− }
− Err("Could not parse timestamp")
− }
−
replacement in pijul/src/commands/record.rs at line 125
− self.timestamp.unwrap_or(0) as u64,
+ self.timestamp.map(Timestamp::as_second).unwrap_or(0) as u64,
replacement in pijul/src/commands/record.rs at line 256
[7.1458]→[7.105923:105980](∅→∅),
[7.105923]→[7.105923:105980](∅→∅),
[7.105980]→[7.128:189](∅→∅),
[7.189]→[7.103:232](∅→∅),
[7.103]→[7.103:232](∅→∅),
[7.225]→[7.106081:106144](∅→∅),
[7.232]→[7.106081:106144](∅→∅),
[7.106081]→[7.106081:106144](∅→∅) − timestamp: if let Some(t) = self.timestamp {
− chrono::DateTime::from_naive_utc_and_offset(
− chrono::NaiveDateTime::from_timestamp_opt(t, 0).unwrap(),
− chrono::Utc,
− )
− } else {
− Utc::now()
− },
+ timestamp: self.timestamp.unwrap_or_else(Timestamp::now),
replacement in pijul/src/commands/record.rs at line 356
[7.1201]→[7.622:674](∅→∅),
[7.622]→[7.622:674](∅→∅) − self.timestamp.unwrap_or(0) as u64,
+ self.timestamp.map(Timestamp::as_second).unwrap_or(0) as u64,
edit in pijul/src/commands/log.rs at line 9
+ use jiff::Timestamp;
+ use jiff::tz::TimeZone;
replacement in pijul/src/commands/log.rs at line 198
− timestamp: Option<chrono::DateTime<chrono::offset::Utc>>,
+ timestamp: Option<Timestamp>,
replacement in pijul/src/commands/log.rs at line 241
[6.3728]→[7.376:446](∅→∅),
[7.1636]→[7.376:446](∅→∅) − writeln!(f, "Date: {}", timestamp.to_rfc2822())?;
+ let local_timestamp = timestamp.to_zoned(TimeZone::system());
+ writeln!(
+ f,
+ "Date: {}",
+ local_timestamp.strftime("%Y-%m-%d %H:%M:%S (%Z)")
+ )?;
edit in pijul/src/commands/identity.rs at line 1
+ use jiff::tz::TimeZone;
edit in pijul/src/commands/identity.rs at line 9
[7.40992]→[7.16902:16931](∅→∅) − use chrono::{DateTime, Utc};
edit in pijul/src/commands/identity.rs at line 10
replacement in pijul/src/commands/identity.rs at line 17
[7.41150]→[7.41150:41205](∅→∅) − use anyhow::bail;
− use chrono::{DateTime, Utc};
+ use anyhow::{anyhow, bail};
edit in pijul/src/commands/identity.rs at line 19
replacement in pijul/src/commands/identity.rs at line 57
[7.42191]→[7.42191:42433](∅→∅) − fn parse_expiry(input: &str) -> Result<DateTime<Utc>, anyhow::Error> {
− let parsed_date = dateparser::parse_with_timezone(input, &chrono::offset::Utc);
− if parsed_date.is_err() {
− bail!("Invalid date");
− }
+ fn parse_expiry(input: &str) -> Result<Timestamp, anyhow::Error> {
+ let parsed_date: Timestamp = input
+ .parse()
+ .map_err(|error| anyhow!("Error parsing date: {error:#?}"))?;
replacement in pijul/src/commands/identity.rs at line 62
[7.42434]→[7.42434:42601](∅→∅) − let date = parsed_date.unwrap();
− if chrono::offset::Utc::now().timestamp_millis() > date.timestamp_millis() {
− bail!("Date is in the past")
+ if parsed_date <= Timestamp::now() {
+ Err(anyhow!("Date is in the past"))
replacement in pijul/src/commands/identity.rs at line 65
[7.42618]→[7.42618:42639](∅→∅) replacement in pijul/src/commands/identity.rs at line 99
[7.44003]→[7.44003:44046](∅→∅) − pub expiry: Option<DateTime<Utc>>,
+ pub expiry: Option<Timestamp>,
replacement in pijul/src/commands/identity.rs at line 143
[7.45773]→[7.45773:45816](∅→∅) − pub expiry: Option<DateTime<Utc>>,
+ pub expiry: Option<Timestamp>,
replacement in pijul/src/commands/identity.rs at line 196
[7.47437]→[7.47437:47472](∅→∅) − expiry: Option<DateTime<Utc>>,
+ expiry: Option<Timestamp>,
replacement in pijul/src/commands/identity.rs at line 335
[7.52372]→[7.52372:52464](∅→∅) − .map(|date| date.format("%Y-%m-%d %H:%M:%S (UTC)").to_string())
+ .map(|date| date.strftime("%Y-%m-%d %H:%M:%S (%Z)").to_string())
replacement in pijul/src/commands/identity.rs at line 370
[7.54135]→[7.19126:19207](∅→∅) − identity.last_modified.format("%Y-%m-%d %H:%M:%S (UTC)")
+ identity
+ .last_modified
+ .to_zoned(TimeZone::system())
+ .strftime("%Y-%m-%d %H:%M:%S (%Z)")
replacement in pijul/src/commands/git.rs at line 770
[7.1476]→[3.0:68](∅→∅),
[3.68]→[7.50:207](∅→∅),
[7.382]→[7.50:207](∅→∅),
[7.159043]→[7.50:207](∅→∅),
[7.207]→[7.159129:159173](∅→∅),
[7.751]→[7.159129:159173](∅→∅),
[7.159129]→[7.159129:159173](∅→∅) − timestamp: chrono::DateTime::from_naive_utc_and_offset(
− chrono::NaiveDateTime::from_timestamp_opt(signature.when().seconds(), 0)
− .expect("seconds and nanos are within bounds"),
− chrono::Utc,
− ),
+ timestamp: jiff::Timestamp::from_second(signature.when().seconds()),
edit in pijul/Cargo.toml at line 29
[7.2380]→[7.2380:2404](∅→∅) − chrono.workspace = true
edit in pijul/Cargo.toml at line 33
[7.2549]→[7.2549:2577](∅→∅) − dateparser.workspace = true
edit in pijul/Cargo.toml at line 39
replacement in libpijul/src/tests/unrecord.rs at line 605
[7.269592]→[7.269592:269635](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
replacement in libpijul/src/tests/unrecord.rs at line 756
[7.275223]→[7.275223:275270](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
replacement in libpijul/src/tests/rollback.rs at line 66
[7.2320]→[7.2320:2363](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
replacement in libpijul/src/tests/rollback.rs at line 135
[7.4835]→[7.4835:4878](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
edit in libpijul/src/tests/mod.rs at line 7
[7.289548]→[7.289548:289563](∅→∅) replacement in libpijul/src/tests/mod.rs at line 69
[7.290658]→[7.290658:290693](∅→∅) + timestamp: jiff::Timestamp::now(),
replacement in libpijul/src/tests/missing_context.rs at line 275
[7.299855]→[7.299855:299898](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
replacement in libpijul/src/tests/change.rs at line 76
[7.448607]→[7.448607:448650](∅→∅) − timestamp: chrono::Utc::now(),
+ timestamp: jiff::Timestamp::now(),
edit in libpijul/src/tests/add_file.rs at line 1
replacement in libpijul/src/tests/add_file.rs at line 706
[7.476279]→[7.476279:476314](∅→∅) + timestamp: Timestamp::now(),
replacement in libpijul/src/output/archive.rs at line 246
[7.122930]→[7.311:362](∅→∅),
[7.311]→[7.311:362](∅→∅) − c.timestamp.timestamp() as u64
+
+ // Since jiff::Timestamp can represent negative values before the Unix epoch,
+ // clamp all unrepresentable (negative) values to 0
+ match u64::try_from(c.timestamp.as_second()) {
+ Ok(value) => value,
+ Err(_) => 0,
+ }
replacement in libpijul/src/key.rs at line 24
[7.37853]→[7.37853:37909](∅→∅) − pub expires: Option<chrono::DateTime<chrono::Utc>>,
+ pub expires: Option<jiff::Timestamp>,
replacement in libpijul/src/key.rs at line 33
[7.5983]→[7.37910:37966](∅→∅) − expires: Option<chrono::DateTime<chrono::Utc>>,
+ expires: Option<jiff::Timestamp>,
replacement in libpijul/src/key.rs at line 42
[7.38030]→[7.38030:38086](∅→∅) − pub expires: Option<chrono::DateTime<chrono::Utc>>,
+ pub expires: Option<jiff::Timestamp>,
replacement in libpijul/src/key.rs at line 50
[7.6325]→[7.38087:38143](∅→∅) − expires: Option<chrono::DateTime<chrono::Utc>>,
+ expires: Option<jiff::Timestamp>,
replacement in libpijul/src/key.rs at line 58
[7.6480]→[7.6480:6610](∅→∅),
[7.6610]→[7.104433:104477](∅→∅) − use chrono::Datelike;
− let expires = chrono::Utc::now();
− let expires = expires.with_year(expires.year() + 1).unwrap();
− let sk = SKey::generate(Some(expires));
+ use jiff::ToSpan;
+ let expiry_date = jiff::Timestamp::now().checked_add(1.year()).unwrap();
+ let sk = SKey::generate(Some(expiry_date));
replacement in libpijul/src/key.rs at line 72
[7.6903]→[7.6903:6948](∅→∅) − pub date: chrono::DateTime<chrono::Utc>,
+ pub date: jiff::Timestamp,
replacement in libpijul/src/key.rs at line 81
[7.7160]→[7.7160:7198](∅→∅) − date: chrono::Utc::now(),
+ date: jiff::Timestamp::now(),
replacement in libpijul/src/key.rs at line 89
[7.38193]→[7.38193:38249](∅→∅) − if expires <= &chrono::Utc::now() {
+ if expires <= &jiff::Timestamp::now() {
replacement in libpijul/src/key.rs at line 99
[7.7760]→[7.38432:38510](∅→∅) − pub fn generate(expires: Option<chrono::DateTime<chrono::Utc>>) -> Self {
+ pub fn generate(expires: Option<jiff::Timestamp>) -> Self {
replacement in libpijul/src/key.rs at line 179
[7.38950]→[7.38950:38997](∅→∅) − if expires <= chrono::Utc::now() {
+ if expires <= jiff::Timestamp::now() {
replacement in libpijul/src/key.rs at line 262
[7.13604]→[7.13604:13650](∅→∅) − date: &chrono::DateTime<chrono::Utc>,
+ date: &jiff::Timestamp,
replacement in libpijul/src/key.rs at line 283
[7.14308]→[7.14308:14438](∅→∅),
[7.14438]→[7.104478:104522](∅→∅) − use chrono::Datelike;
− let expires = chrono::Utc::now();
− let expires = expires.with_year(expires.year() + 1).unwrap();
− let sk = SKey::generate(Some(expires));
+ use jiff::ToSpan;
+ let expiry_date = jiff::Timestamp::now().checked_add(1.year()).unwrap();
+ let sk = SKey::generate(Some(expiry_date));
replacement in libpijul/src/change.rs at line 6
[7.1502]→[7.4217:4246](∅→∅) − use chrono::{DateTime, Utc};
replacement in libpijul/src/change.rs at line 132
[7.833193]→[7.833193:833227](∅→∅) − pub timestamp: DateTime<Utc>,
+ pub timestamp: Timestamp,
replacement in libpijul/src/change.rs at line 145
[7.834275]→[7.834275:834310](∅→∅) + timestamp: Timestamp::now(),
edit in libpijul/Cargo.toml at line 48
[7.4457]→[7.4457:4481](∅→∅) − chrono.workspace = true
edit in libpijul/Cargo.toml at line 54
edit in Cargo.toml at line 35
[7.6159]→[7.6159:6213](∅→∅) − chrono = { version = "0.4.27", features = ["serde"] }
edit in Cargo.toml at line 41
[7.6334]→[7.6334:6353](∅→∅) edit in Cargo.toml at line 62
+ jiff = { version = "0.2", features = ["serde"] }
edit in Cargo.lock at line 47
[7.87]→[7.87:100](∅→∅),
[7.100]→[7.1040:1082](∅→∅),
[7.491]→[7.140:205](∅→∅),
[7.1082]→[7.140:205](∅→∅),
[7.140]→[7.140:205](∅→∅),
[7.205]→[7.1083:1161](∅→∅) −
− [[package]]
− name = "android-tzdata"
− version = "0.1.1"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
edit in Cargo.lock at line 49
[7.1251]→[7.1251:1488](∅→∅) − name = "android_system_properties"
− version = "0.1.5"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
− dependencies = [
− "libc",
− ]
−
− [[package]]
edit in Cargo.lock at line 333
[7.7952]→[7.7952:7968](∅→∅),
[7.7968]→[7.3282:3301](∅→∅),
[7.2348]→[7.7987:8052](∅→∅),
[7.3301]→[7.7987:8052](∅→∅),
[7.3948]→[7.7987:8052](∅→∅),
[7.7987]→[7.7987:8052](∅→∅),
[7.8052]→[7.3302:3380](∅→∅),
[7.2427]→[7.8130:8147](∅→∅),
[7.3380]→[7.8130:8147](∅→∅),
[7.4027]→[7.8130:8147](∅→∅),
[7.8130]→[7.8130:8147](∅→∅),
[7.8147]→[7.2428:2447](∅→∅),
[7.2447]→[7.8147:8177](∅→∅),
[7.4047]→[7.8147:8177](∅→∅),
[7.8147]→[7.8147:8177](∅→∅),
[7.8193]→[7.8193:8218](∅→∅),
[7.8227]→[7.8227:8244](∅→∅),
[7.8244]→[7.3381:3408](∅→∅),
[7.3408]→[7.8255:8270](∅→∅),
[7.4075]→[7.8255:8270](∅→∅),
[7.8255]→[7.8255:8270](∅→∅) − name = "chrono"
− version = "0.4.33"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
− dependencies = [
− "android-tzdata",
− "iana-time-zone",
− "js-sys",
− "num-traits",
− "serde",
− "wasm-bindgen",
− "windows-targets 0.52.0",
− ]
−
− [[package]]
replacement in Cargo.lock at line 391
[7.9302]→[7.3804:3819](∅→∅) edit in Cargo.lock at line 561
[7.1331]→[7.15383:15648](∅→∅),
[7.4827]→[7.15383:15648](∅→∅),
[7.15383]→[7.15383:15648](∅→∅),
[7.15648]→[7.15648:15650](∅→∅) −
− [[package]]
− name = "dateparser"
− version = "0.1.8"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "c9e12a21fe97a29f5ae9cb6770419711f180d3715a039b500b5ff7ab45bb00c4"
− dependencies = [
− "anyhow",
− "chrono",
− "lazy_static 1.4.0",
− "regex",
− ]
replacement in Cargo.lock at line 900
[7.24346]→[7.6847:6862](∅→∅) edit in Cargo.lock at line 1169
[7.30828]→[7.30828:30852](∅→∅),
[7.30852]→[7.8590:8609](∅→∅),
[7.4225]→[7.30871:30936](∅→∅),
[7.5201]→[7.30871:30936](∅→∅),
[7.8391]→[7.30871:30936](∅→∅),
[7.8609]→[7.30871:30936](∅→∅),
[7.30871]→[7.30871:30936](∅→∅),
[7.30936]→[7.8610:8688](∅→∅),
[7.4304]→[7.31014:31138](∅→∅),
[7.5280]→[7.31014:31138](∅→∅),
[7.8470]→[7.31014:31138](∅→∅),
[7.8688]→[7.31014:31138](∅→∅),
[7.31014]→[7.31014:31138](∅→∅),
[7.31138]→[7.8471:8488](∅→∅),
[7.5293]→[7.31149:31194](∅→∅),
[7.8488]→[7.31149:31194](∅→∅),
[7.31149]→[7.31149:31194](∅→∅),
[7.31194]→[7.1719:1737](∅→∅),
[7.1737]→[7.31212:31277](∅→∅),
[7.31212]→[7.31212:31277](∅→∅),
[7.31277]→[7.1738:1816](∅→∅),
[7.1816]→[7.31355:31372](∅→∅),
[7.31355]→[7.31355:31372](∅→∅),
[7.31372]→[7.1817:1824](∅→∅),
[7.1824]→[7.31394:31409](∅→∅),
[7.31394]→[7.31394:31409](∅→∅) − name = "iana-time-zone"
− version = "0.1.60"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
− dependencies = [
− "android_system_properties",
− "core-foundation-sys",
− "iana-time-zone-haiku",
− "js-sys",
− "wasm-bindgen",
− "windows-core",
− ]
−
− [[package]]
− name = "iana-time-zone-haiku"
− version = "0.1.2"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
− dependencies = [
− "cc",
− ]
−
− [[package]]
edit in Cargo.lock at line 1258
+
+ [[package]]
+ name = "jiff"
+ version = "0.2.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806"
+ dependencies = [
+ "jiff-static",
+ "jiff-tzdb-platform",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde",
+ "windows-sys 0.52.0",
+ ]
+
+ [[package]]
+ name = "jiff-static"
+ version = "0.2.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.101",
+ ]
+
+ [[package]]
+ name = "jiff-tzdb"
+ version = "0.1.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524"
edit in Cargo.lock at line 1292
+ name = "jiff-tzdb-platform"
+ version = "0.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8"
+ dependencies = [
+ "jiff-tzdb",
+ ]
+
+ [[package]]
edit in Cargo.lock at line 1374
[7.992]→[7.35407:35418](∅→∅),
[7.35407]→[7.35407:35418](∅→∅) edit in Cargo.lock at line 1386
replacement in Cargo.lock at line 1496
[7.37688]→[7.10054:10073](∅→∅) replacement in Cargo.lock at line 1498
[7.37772]→[7.10074:10152](∅→∅) − checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
replacement in Cargo.lock at line 1741
[7.44773]→[7.10966:10981](∅→∅) edit in Cargo.lock at line 1876
[7.48144]→[7.48144:48155](∅→∅) edit in Cargo.lock at line 1880
[7.48210]→[7.48210:48225](∅→∅) edit in Cargo.lock at line 1888
edit in Cargo.lock at line 1937
[7.1292]→[7.1292:1318](∅→∅) − "chrono",
− "dateparser",
edit in Cargo.lock at line 1938
replacement in Cargo.lock at line 2039
[7.737]→[7.11632:11650](∅→∅) + version = "1.11.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
+
+ [[package]]
+ name = "portable-atomic-util"
+ version = "0.2.4"
replacement in Cargo.lock at line 2047
[7.820]→[7.11651:11729](∅→∅) − checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+ checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
+ dependencies = [
+ "portable-atomic",
+ ]
replacement in Cargo.lock at line 2084
[7.51066]→[7.11753:11772](∅→∅) replacement in Cargo.lock at line 2086
[7.51150]→[7.11773:11851](∅→∅) − checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+ checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
replacement in Cargo.lock at line 2131
[7.52010]→[4.297:312](∅→∅) replacement in Cargo.lock at line 2136
[7.52048]→[7.11852:11871](∅→∅) replacement in Cargo.lock at line 2138
[7.52132]→[7.11872:11950](∅→∅) − checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+ checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
replacement in Cargo.lock at line 2432
[7.59055]→[7.13203:13223](∅→∅) replacement in Cargo.lock at line 2434
[7.59140]→[7.13224:13302](∅→∅) − checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+ checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
replacement in Cargo.lock at line 2450
[7.59514]→[7.13403:13423](∅→∅) replacement in Cargo.lock at line 2452
[7.59599]→[7.13424:13502](∅→∅) − checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
replacement in Cargo.lock at line 2456
[7.59720]→[7.13503:13518](∅→∅) replacement in Cargo.lock at line 2592
[7.9801]→[7.13933:13952](∅→∅) replacement in Cargo.lock at line 2594
[7.9885]→[7.13953:14031](∅→∅) − checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+ checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
replacement in Cargo.lock at line 2677
[7.65022]→[7.14667:14682](∅→∅) replacement in Cargo.lock at line 2832
[7.68573]→[7.14880:14895](∅→∅) replacement in Cargo.lock at line 3124
[7.75764]→[7.16386:16401](∅→∅) replacement in Cargo.lock at line 3158
[7.76590]→[7.16699:16714](∅→∅) edit in Cargo.lock at line 3255
[7.9660]→[7.19747:19769](∅→∅),
[7.19769]→[7.17031:17050](∅→∅),
[7.17050]→[7.9696:9761](∅→∅),
[7.19788]→[7.9696:9761](∅→∅),
[7.9696]→[7.9696:9761](∅→∅),
[7.9761]→[7.17051:17129](∅→∅),
[7.17129]→[7.9839:9856](∅→∅),
[7.19867]→[7.9839:9856](∅→∅),
[7.9839]→[7.9839:9856](∅→∅),
[7.9856]→[7.17130:17157](∅→∅),
[7.11845]→[7.9883:9885](∅→∅),
[7.17157]→[7.9883:9885](∅→∅),
[7.19895]→[7.9883:9885](∅→∅),
[7.9883]→[7.9883:9885](∅→∅),
[7.9885]→[7.78789:78802](∅→∅),
[7.78789]→[7.78789:78802](∅→∅) − name = "windows-core"
− version = "0.52.0"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
− dependencies = [
− "windows-targets 0.52.0",
− ]
−
− [[package]]
replacement in Cargo.lock at line 3515
[7.83273]→[7.19882:19897](∅→∅)