safer handling of Local DateTime objects

This commit is contained in:
Vladan Popovic 2023-05-18 02:16:05 +02:00
parent 4dc14db293
commit ed0c277c4b
1 changed files with 13 additions and 5 deletions

View File

@ -7,9 +7,17 @@ pub(crate) mod repo;
pub(crate) mod tree;
use chrono::offset::{Local, TimeZone};
use chrono::DateTime;
use chrono::{DateTime, NaiveDateTime};
use git2::{Commit, Signature};
fn min_date() -> DateTime<Local> {
Local.from_utc_datetime(&NaiveDateTime::MIN)
}
fn timestamp_with_fallback(timestamp: i64) -> DateTime<Local> {
Local.timestamp_opt(timestamp, 0).earliest().unwrap_or(min_date())
}
#[derive(Clone, Debug)]
pub struct SocialSignature {
pub when: DateTime<Local>,
@ -20,7 +28,7 @@ pub struct SocialSignature {
impl Default for SocialSignature {
fn default() -> Self {
Self {
when: Local.timestamp(0, 0),
when: min_date(),
name: "".to_string(),
email: "".to_string(),
}
@ -53,7 +61,7 @@ impl Default for SocialCommit {
fn default() -> Self {
Self {
id: "".to_string(),
time: Local.timestamp(0, 0),
time: min_date(),
message: "".to_string(),
author: SocialSignature::default(),
committer: SocialSignature::default(),
@ -68,7 +76,7 @@ impl From<Signature<'_>> for SocialSignature {
Self {
name: s.name().unwrap_or("").to_owned(),
email: s.email().unwrap_or("").to_owned(),
when: Local.timestamp(s.when().seconds(), 0),
when: timestamp_with_fallback(s.when().seconds()),
}
}
}
@ -77,7 +85,7 @@ impl From<Commit<'_>> for SocialCommit {
fn from(c: Commit<'_>) -> Self {
Self {
id: format!("{}", c.id()),
time: Local.timestamp(c.time().seconds(), 0),
time: timestamp_with_fallback(c.time().seconds()),
message: c.message().unwrap_or("").to_owned(),
author: c.author().into(),
committer: c.committer().into(),