Replace `chrono` with `jiff`

finchie
May 16, 2025, 5:37 AM
N26HD5PFUNVDSEXAQVOTMSMNPWFHQSZ5PHMGEF2ACC23OWFHTGQQC

Dependencies

  • [2] HKHMES6T Solving conflicts
  • [3] 5IABX6JG Fix deprecation warning for from_utc
  • [4] TCXM4WIJ Remove unused dependencies
  • [5] QAS4VLXU Use `serde_derive` instead of `serde`'s `derive` feature'
  • [6] HJVWPKWV Migrate crates to edition 2024
  • [7] EEBKW7VT Keys and identities
  • [8] ND62U46T Get nix base builds working again
  • [9] FXEDPLRI Resurrecting tests, and type cleanup (no need for Arc<RwLock<…>> anymore)
  • [10] QL6K2ZM3 Tags
  • [11] FAOGX7G3 Outputting the repo after the last Git import
  • [12] AAAMZY4V Updating `pijul git` with the latest Sanakirja
  • [13] YN63NUZO Sanakirja 1.0
  • [14] 5QB3HZFV More flexible timestamp format in record: allow both formats
  • [15] NYOF5766 track file encoding in the record, including change text for file adds
  • [16] TVVW53HZ Conflict resolution
  • [17] L3RCAPPK Add --repository to tag commands
  • [18] 4OJWMSOW Fully replace crate::Identity
  • [19] EUZFFJSO Updating Pijul with the latest changes in Libpijul
  • [20] NEJOYVJB Fixing the Git feature
  • [21] PSKXR4QE Do not load the entire change in memory in log
  • [22] DWSAYGVE Update codebase to use new identity management
  • [23] MDY344ZZ Options to use Patience diff instead of Myers
  • [24] 6FRPUHWK Fix identity tests
  • [25] A3RM526Y Integrating identity malleability
  • [26] VYAJZ7DE Don't open an editor in `pijul tag create` when `-m` is set
  • [27] AEPEFS7O Write help for each argument
  • [28] 27PYHR6L Making the get_latest_touch function (useful to make archives) public in libpijul
  • [29] GUL4M5FI Cleanup and formatting
  • [30] SMMBFECL Converting to the new patch format "online"
  • [31] NO2QPRFL Adding rollback test
  • [32] KKNMDXAI Tweak identity subcommand
  • [33] BPCAJCLT Use RFC2822 date formatting in `log`, `tag`, and `record --timestamp`
  • [34] EJ7TFFOW Re-adding Cargo.lock
  • [35] YXAVFTPP Allowing vertex buffer to use references to the transaction, by changing `output::output` to take an ArcTxn<T> instead of a simple T
  • [36] 4RV7T4SR Migrate from `pijul::config` to `pijul-config`
  • [37] HWH4WWN3 Proper separation of Git commit messages into a message and description fields in changes
  • [38] 5Z2Y7VGV Migrate `pijul::identity::Complete::prove` to `pijul::remote::prove`
  • [39] EVDH2ECT Migrate from `pijul::identity` to `pijul_identity`
  • [40] OU6JOR3C Add path filtering for log, add json output for log
  • [41] XR7MNOMU file encoding in updates
  • [42] RVAH6PXA Getting libpijul to compile to WASM32
  • [43] NS36CJCO Validating timestamps in record
  • [44] L4JXJHWX pijul/*: reorganize imports and remove extern crate
  • [45] 2RXOCWUW Making libpijul deterministic (and getting rid of `rand`)
  • [46] UC5C5REV `pijul git`: two more fields in the benchmarks
  • [47] DVBSW7SI Bump dependencies with minor-level changes
  • [48] ABQDWHNG Migrate from `pijul::repository` to `pijul-repository`
  • [49] 2MKP7CB7 Move dependencies into workspace `Cargo.toml`
  • [50] WMS44NF5 Require --no-prompt for --read-password
  • [51] PNJL5TPZ Version bump
  • [52] 3SJ3DJNF Adding a --force option to `pijul add`, to include otherwise ignored files
  • [53] STG7MO5M Version bump
  • [54] HWYGVLP5 Replacing the temporary copy of chardetng with the published version
  • [55] YPMGKDPC Solving a conflict
  • [56] DDJO7X2P Remove dependency on `num_cpus`
  • [57] FOCBVLOU Implement testing for identity management
  • [58] Q3GU26WD merge with changes from sanakirja v1.1.2
  • [59] ZHABNS3S Canonicalize all paths
  • [60] QWIYNMI5 Formatting + big-endian Sanakirja
  • [61] OYN2YVPA Create `pijul_remote` crate
  • [62] 5RSZPNQR Upgrade `clap` 3.2 -> 4.3
  • [63] RDQYEED2 Fixing versions
  • [64] RZ75BZCI Remove unused dependencies
  • [65] RIZ4IP76 Solving more conflicts
  • [66] 4H2XTVJ2 Fix some mistakes in the docs
  • [67] I24UEJQL Various post-fire fixes
  • [68] ATUZBEPE Add hunk paths to log ouput
  • [69] BV4PLHOV Remove dependency on `once_cell`
  • [70] 32G3GOK7 Migrate from `dialoguer` to `pijul-interaction`
  • [71] CCLLB7OI Upgrading to Sanakirja 0.15 + version bump
  • [72] 44RUBHRE Only re-prove identity when credentials change
  • [73] F2S6XETO Fixing log --hash-only
  • [74] SU3JX6SE Create `pijul-identity` crate
  • [75] TFPETWTV Add config options for patch message templates
  • [76] OU243LAB Support for staging
  • [77] USQMBKTP Replace deprecated chrono function
  • [78] QQS7LII4 Add value hints to arguments
  • [79] ABPFWGKH Create `pijul-interaction` crate
  • [80] E6IKUIPD Command to delete a tag
  • [81] Y6TBQN7M Automatically format `pijul` crate
  • [82] 2TWWWCU4 Fixing a warning related to an updated in `chrono`
  • [83] TIPZ7UXN Started fixing the tests for parallel record/output
  • [84] 3FTEGCMR add timestamp_validator to tag --timestamp option
  • [85] C6SOSQCV Formatting
  • [86] Q3UD2OLQ Fixing warning from chrono
  • [87] PIQCNEEB Upgrading to Clap 3.0.0-alpha.5
  • [88] 4KJ45IJL Implement new identity management
  • [89] PBNQKKPE Fixing a conflict
  • [90] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [91] RRCSHAYZ Formatting
  • [92] HOTQHK5U Fixing tests
  • [*] OEKRRU6O Fix test compilation

Change contents

  • replacement in pijul-remote/src/ssh.rs at line 1099
    [7.5863][7.107:174]()
    revision = revision.max(id.last_modified.timestamp());
    [7.5863]
    [7.5918]
    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
    [7.2072]
    [7.17273]
    use std::sync::OnceLock;
  • edit in pijul-identity/src/lib.rs at line 54
    [7.17274]
    [7.758]
    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>,
    [7.5161]
    [7.5215]
    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(),
    [7.5786]
    [7.18337]
    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(),
    [7.6533]
    [7.6588]
    last_modified: Timestamp::now(),
  • edit in pijul-identity/src/create.rs at line 8
    [6.1618]
    [7.28474]
    use jiff::Timestamp;
  • replacement in pijul-identity/src/create.rs at line 114
    [7.10793][7.10793:10858]()
    new_identity.last_modified = chrono::offset::Utc::now();
    [7.10793]
    [7.10858]
    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());
    [7.31374]
    [7.31445]
    .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()?
    [7.31813]
    [7.31885]
    // 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");
    }
    [7.32013]
    [7.32308]
    .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")
    [7.32309]
    [7.32510]
    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,
    )?)
    [7.32647]
    [7.32780]
    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
    [7.1418]
    [7.1418]
    jiff.workspace = true
  • edit in pijul/tests/common/identity.rs at line 10
    [7.17988]
    [7.17988]
    use jiff::Timestamp;
  • 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)?;
    [7.23962]
    [7.24082]
    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()
    [7.24157]
    [7.24222]
    parsed_time_stamp.strftime("%Y-%m-%d").to_string()
  • edit in pijul/src/commands/tag.rs at line 4
    [7.150][7.0:53]()
    use crate::commands::record::parse_datetime_rfc2822;
  • edit in pijul/src/commands/tag.rs at line 6
    [7.130]
    [7.219]
    use jiff::Timestamp;
  • 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>,
    [7.1086]
    [7.1154]
    #[clap(long = "timestamp")]
    timestamp: Option<Timestamp>,
  • replacement in pijul/src/commands/tag.rs at line 273
    [7.4679][7.4679:4707]()
    timestamp: Option<i64>,
    [7.4679]
    [7.4707]
    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()
    },
    [7.5200]
    [7.5404]
    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]()
    use chrono::Utc;
  • edit in pijul/src/commands/record.rs at line 8
    [7.659]
    [7.101821]
    use jiff::Timestamp;
  • 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>,
    [7.863]
    [7.56]
    #[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
    [7.449][7.449:501]()
    self.timestamp.unwrap_or(0) as u64,
    [7.449]
    [7.501]
    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()
    },
    [7.1458]
    [7.1459]
    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,
    [7.1201]
    [7.107478]
    self.timestamp.map(Timestamp::as_second).unwrap_or(0) as u64,
  • edit in pijul/src/commands/log.rs at line 9
    [7.1113]
    [7.134430]
    use jiff::Timestamp;
    use jiff::tz::TimeZone;
  • replacement in pijul/src/commands/log.rs at line 198
    [7.377][7.377:443]()
    timestamp: Option<chrono::DateTime<chrono::offset::Utc>>,
    [7.377]
    [7.443]
    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())?;
    [6.3728]
    [7.1693]
    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
    [7.40825]
    [7.1210]
    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
    [7.41054]
    [7.41078]
    use jiff::Timestamp;
  • replacement in pijul/src/commands/identity.rs at line 17
    [7.41150][7.41150:41205]()
    use anyhow::bail;
    use chrono::{DateTime, Utc};
    [7.41150]
    [7.1259]
    use anyhow::{anyhow, bail};
  • edit in pijul/src/commands/identity.rs at line 19
    [7.1304]
    [7.41239]
    use jiff::Timestamp;
  • 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");
    }
    [7.42191]
    [7.42433]
    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")
    [7.42434]
    [7.42601]
    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]()
    Ok(date)
    [7.42618]
    [7.42639]
    Ok(parsed_date)
  • replacement in pijul/src/commands/identity.rs at line 99
    [7.44003][7.44003:44046]()
    pub expiry: Option<DateTime<Utc>>,
    [7.44003]
    [7.0]
    pub expiry: Option<Timestamp>,
  • replacement in pijul/src/commands/identity.rs at line 143
    [7.45773][7.45773:45816]()
    pub expiry: Option<DateTime<Utc>>,
    [7.45773]
    [7.163]
    pub expiry: Option<Timestamp>,
  • replacement in pijul/src/commands/identity.rs at line 196
    [7.47437][7.47437:47472]()
    expiry: Option<DateTime<Utc>>,
    [7.47437]
    [7.47472]
    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())
    [7.52372]
    [7.52464]
    .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)")
    [7.54135]
    [7.54198]
    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,
    ),
    [7.1476]
    [7.159173]
    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
    [7.2859]
    [7.2859]
    jiff.workspace = true
  • replacement in libpijul/src/tests/unrecord.rs at line 605
    [7.269592][7.269592:269635]()
    timestamp: chrono::Utc::now(),
    [7.269592]
    [7.269635]
    timestamp: jiff::Timestamp::now(),
  • replacement in libpijul/src/tests/unrecord.rs at line 756
    [7.275223][7.275223:275270]()
    timestamp: chrono::Utc::now(),
    [7.275223]
    [7.275270]
    timestamp: jiff::Timestamp::now(),
  • replacement in libpijul/src/tests/rollback.rs at line 66
    [7.2320][7.2320:2363]()
    timestamp: chrono::Utc::now(),
    [7.2320]
    [7.2363]
    timestamp: jiff::Timestamp::now(),
  • replacement in libpijul/src/tests/rollback.rs at line 135
    [7.4835][7.4835:4878]()
    timestamp: chrono::Utc::now(),
    [7.4835]
    [7.4878]
    timestamp: jiff::Timestamp::now(),
  • edit in libpijul/src/tests/mod.rs at line 7
    [7.289548][7.289548:289563]()
    use chrono::*;
  • replacement in libpijul/src/tests/mod.rs at line 69
    [7.290658][7.290658:290693]()
    timestamp: Utc::now(),
    [7.290658]
    [7.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(),
    [7.299855]
    [7.299898]
    timestamp: jiff::Timestamp::now(),
  • replacement in libpijul/src/tests/change.rs at line 76
    [7.448607][7.448607:448650]()
    timestamp: chrono::Utc::now(),
    [7.448607]
    [7.448650]
    timestamp: jiff::Timestamp::now(),
  • edit in libpijul/src/tests/add_file.rs at line 1
    [7.454125]
    [94.1786]
    use jiff::Timestamp;
  • replacement in libpijul/src/tests/add_file.rs at line 706
    [7.476279][7.476279:476314]()
    timestamp: Utc::now(),
    [7.476279]
    [7.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
    [7.122930]
    [7.362]
    // 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>>,
    [7.37853]
    [7.3583]
    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>>,
    [7.5983]
    [7.6031]
    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>>,
    [7.38030]
    [7.6227]
    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>>,
    [7.6325]
    [7.6373]
    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));
    [7.6480]
    [7.6648]
    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>,
    [7.6903]
    [7.6948]
    pub date: jiff::Timestamp,
  • replacement in libpijul/src/key.rs at line 81
    [7.7160][7.7160:7198]()
    date: chrono::Utc::now(),
    [7.7160]
    [7.7198]
    date: jiff::Timestamp::now(),
  • replacement in libpijul/src/key.rs at line 89
    [7.38193][7.38193:38249]()
    if expires <= &chrono::Utc::now() {
    [7.38193]
    [7.38249]
    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 {
    [7.7760]
    [7.7830]
    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() {
    [7.38950]
    [7.38997]
    if expires <= jiff::Timestamp::now() {
  • replacement in libpijul/src/key.rs at line 262
    [7.13604][7.13604:13650]()
    date: &chrono::DateTime<chrono::Utc>,
    [7.13604]
    [7.13650]
    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));
    [7.14308]
    [7.14476]
    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};
    [7.1502]
    [7.831519]
    use jiff::Timestamp;
  • replacement in libpijul/src/change.rs at line 132
    [7.833193][7.833193:833227]()
    pub timestamp: DateTime<Utc>,
    [7.833193]
    [7.4939]
    pub timestamp: Timestamp,
  • replacement in libpijul/src/change.rs at line 145
    [7.834275][7.834275:834310]()
    timestamp: Utc::now(),
    [7.834275]
    [7.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
    [7.4718]
    [7.4718]
    jiff.workspace = true
  • 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]()
    dateparser = "0.1"
  • edit in Cargo.toml at line 62
    [7.6832]
    [7.6832]
    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]()
    "syn 2.0.48",
    [7.9302]
    [7.9310]
    "syn 2.0.101",
  • 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]()
    "syn 2.0.48",
    [7.24346]
    [7.24354]
    "syn 2.0.101",
  • 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
    [7.9269]
    [7.33609]
    [[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
    [7.33622]
    [7.33622]
    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]()
    "chrono",
  • edit in Cargo.lock at line 1386
    [7.35616]
    [7.35616]
    "jiff",
  • replacement in Cargo.lock at line 1496
    [7.37688][7.10054:10073]()
    version = "0.4.20"
    [7.37688]
    [7.10197]
    version = "0.4.27"
  • replacement in Cargo.lock at line 1498
    [7.37772][7.10074:10152]()
    checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
    [7.37772]
    [7.10198]
    checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
  • replacement in Cargo.lock at line 1741
    [7.44773][7.10966:10981]()
    "syn 2.0.48",
    [7.44773]
    [7.44781]
    "syn 2.0.101",
  • edit in Cargo.lock at line 1876
    [7.48144][7.48144:48155]()
    "chrono",
  • edit in Cargo.lock at line 1880
    [7.48210][7.48210:48225]()
    "dateparser",
  • edit in Cargo.lock at line 1888
    [7.48360]
    [7.48360]
    "jiff",
  • edit in Cargo.lock at line 1937
    [7.1292][7.1292:1318]()
    "chrono",
    "dateparser",
  • edit in Cargo.lock at line 1938
    [7.1332]
    [7.1332]
    "jiff",
  • replacement in Cargo.lock at line 2039
    [7.737][7.11632:11650]()
    version = "1.6.0"
    [7.737]
    [7.755]
    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"
    [7.820]
    [7.49790]
    checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
    dependencies = [
    "portable-atomic",
    ]
  • replacement in Cargo.lock at line 2084
    [7.51066][7.11753:11772]()
    version = "1.0.78"
    [7.51066]
    [7.51085]
    version = "1.0.95"
  • replacement in Cargo.lock at line 2086
    [7.51150][7.11773:11851]()
    checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
    [7.51150]
    [7.51228]
    checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
  • replacement in Cargo.lock at line 2131
    [7.52010][4.297:312]()
    "syn 2.0.48",
    [7.52010]
    [7.52018]
    "syn 2.0.101",
  • replacement in Cargo.lock at line 2136
    [7.52048][7.11852:11871]()
    version = "1.0.35"
    [7.52048]
    [7.52067]
    version = "1.0.40"
  • replacement in Cargo.lock at line 2138
    [7.52132][7.11872:11950]()
    checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
    [7.52132]
    [7.52210]
    checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
  • replacement in Cargo.lock at line 2432
    [7.59055][7.13203:13223]()
    version = "1.0.196"
    [7.59055]
    [7.59075]
    version = "1.0.219"
  • replacement in Cargo.lock at line 2434
    [7.59140][7.13224:13302]()
    checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
    [7.59140]
    [7.59218]
    checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
  • replacement in Cargo.lock at line 2450
    [7.59514][7.13403:13423]()
    version = "1.0.196"
    [7.59514]
    [7.59534]
    version = "1.0.219"
  • replacement in Cargo.lock at line 2452
    [7.59599][7.13424:13502]()
    checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
    [7.59599]
    [7.59677]
    checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
  • replacement in Cargo.lock at line 2456
    [7.59720][7.13503:13518]()
    "syn 2.0.48",
    [7.59720]
    [7.59728]
    "syn 2.0.101",
  • replacement in Cargo.lock at line 2592
    [7.9801][7.13933:13952]()
    version = "2.0.48"
    [7.9801]
    [7.9820]
    version = "2.0.101"
  • replacement in Cargo.lock at line 2594
    [7.9885][7.13953:14031]()
    checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
    [7.9885]
    [7.63035]
    checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
  • replacement in Cargo.lock at line 2677
    [7.65022][7.14667:14682]()
    "syn 2.0.48",
    [7.65022]
    [7.65030]
    "syn 2.0.101",
  • replacement in Cargo.lock at line 2832
    [7.68573][7.14880:14895]()
    "syn 2.0.48",
    [7.68573]
    [7.68581]
    "syn 2.0.101",
  • replacement in Cargo.lock at line 3124
    [7.75764][7.16386:16401]()
    "syn 2.0.48",
    [7.75764]
    [7.75772]
    "syn 2.0.101",
  • replacement in Cargo.lock at line 3158
    [7.76590][7.16699:16714]()
    "syn 2.0.48",
    [7.76590]
    [7.76598]
    "syn 2.0.101",
  • 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]()
    "syn 2.0.48",
    [7.83273]
    [7.83298]
    "syn 2.0.101",