From 70fe59f4a1cad25f687397206ee2cbe50e643181 Mon Sep 17 00:00:00 2001 From: Svetlin Stefanov Date: Mon, 5 Sep 2022 21:48:24 +0200 Subject: [PATCH 1/2] Parse the output while parsing the baseline file. --- .../fixtures/generate_git_date_baseline.sh | 5 ----- .../generate_git_date_baseline.tar.xz | Bin 129 -> 9180 bytes git-date/tests/time/parse.rs | 14 ++++++++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/git-date/tests/fixtures/generate_git_date_baseline.sh b/git-date/tests/fixtures/generate_git_date_baseline.sh index 0d76ede8e83..6c02cf7620d 100644 --- a/git-date/tests/fixtures/generate_git_date_baseline.sh +++ b/git-date/tests/fixtures/generate_git_date_baseline.sh @@ -39,8 +39,3 @@ baseline '123456789' # raw baseline '1660874655 +0800' -# failing - -# empty_input -baseline "" - diff --git a/git-date/tests/fixtures/generated-archives/generate_git_date_baseline.tar.xz b/git-date/tests/fixtures/generated-archives/generate_git_date_baseline.tar.xz index 29ce18a37dc2d3e841d88d30c80e06fb77bd2878..83a995a48449f9c429a83b3f3b4f8c6fa3fd1cc8 100644 GIT binary patch literal 9180 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 M7PEh=OeRM01HSwxPXGV_ diff --git a/git-date/tests/time/parse.rs b/git-date/tests/time/parse.rs index f8eb67f0fda..148a7904566 100644 --- a/git-date/tests/time/parse.rs +++ b/git-date/tests/time/parse.rs @@ -6,7 +6,7 @@ use once_cell::sync::Lazy; type Result = std::result::Result>; -static BASELINE: Lazy> = Lazy::new(|| { +static BASELINE: Lazy> = Lazy::new(|| { let base = git_testtools::scripted_fixture_repo_read_only("generate_git_date_baseline.sh").unwrap(); (|| -> Result<_> { @@ -15,7 +15,14 @@ static BASELINE: Lazy> = Lazy::new(|| { let mut lines = baseline.lines(); while let Some(date_str) = lines.next() { let exit_code = lines.next().expect("three lines per baseline").to_str()?.parse()?; - let output = lines.next().expect("three lines per baseline").into(); + let output = u32::from_str( + lines + .next() + .expect("three lines per baseline") + .to_str() + .expect("valid utf"), + ) + .expect("valid epoch value"); map.insert(date_str.into(), (exit_code, output)); } Ok(map) @@ -34,8 +41,7 @@ fn baseline() { ); if *exit_code == 0 { let actual = res.unwrap().seconds_since_unix_epoch; - let expected = u32::from_str(output.to_str().expect("valid utf")).expect("valid epoch value"); - assert_eq!(actual, expected, "{pattern:?} disagrees with baseline: {actual:?}") + assert_eq!(actual, *output, "{pattern:?} disagrees with baseline: {actual:?}") } } } From 79d82d46613c83280d2401ef4d72a35010a70b87 Mon Sep 17 00:00:00 2001 From: Svetlin Stefanov Date: Sun, 11 Sep 2022 09:17:46 +0200 Subject: [PATCH 2/2] WIP. --- git-date/src/parse.rs | 32 ++++++++++-------- .../generate_git_date_baseline.tar.xz | Bin 9180 -> 9184 bytes git-date/tests/time/parse.rs | 1 - git-prompt/src/unix.rs | 4 +-- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/git-date/src/parse.rs b/git-date/src/parse.rs index 814cacd2c30..98ca53e9d69 100644 --- a/git-date/src/parse.rs +++ b/git-date/src/parse.rs @@ -103,27 +103,29 @@ mod relative { } pub(crate) fn parse(input: &str, now: Option) -> Option> { - parse_inner(input).map(|offset| { - let offset = std::time::Duration::from_secs(offset.whole_seconds().try_into().expect("positive value")); - now.ok_or(Error::MissingCurrentTime).map(|now| { - now.checked_sub(offset) - .expect("BUG: values can't be large enough to cause underflow") - .into() - }) + let offset = parse_inner(input).map(|offset| { + let secs = offset.whole_seconds().try_into().expect("positive value"); + return std::time::Duration::from_secs(secs); + })?; + now.ok_or(Error::MissingCurrentTime).map(|now| { + now.checked_sub(offset) + .expect("BUG: values can't be large enough to cause underflow") + .into() }) } fn duration(period: &str, multiplier: i64) -> Option { let period = period.strip_suffix('s').unwrap_or(period); - Some(match period { - "second" => Duration::seconds(multiplier), - "minute" => Duration::minutes(multiplier), - "hour" => Duration::hours(multiplier), - "day" => Duration::days(multiplier), - "week" => Duration::weeks(multiplier), - // TODO months & years + let seconds: i64 = match period { + "second" => 1, + "minute" => 60, + "hour" => 3_600, + "day" => 86_400, + "week" => 604_800, + // TODO months & years? _ => return None, - }) + }; + Some(Duration::seconds(seconds.checked_mul(multiplier)?)) } #[cfg(test)] diff --git a/git-date/tests/fixtures/generated-archives/generate_git_date_baseline.tar.xz b/git-date/tests/fixtures/generated-archives/generate_git_date_baseline.tar.xz index 83a995a48449f9c429a83b3f3b4f8c6fa3fd1cc8..28a92ba796fa53aa7cf8e4994997ec7d6ad6cd02 100644 GIT binary patch delta 106 zcmccP{=j{L4CCC5vT4e(>jIen_2hrMWh%$QVaRyOccO1zN@U*uD~GQ5gnoH?sch~- zK_&B}ss-$`4wtxUbT63O;A6LJ`o?Ak5V&(>%TlSfmR<(No$d`Em>2@KzNp)HB>guN JNRlNo3INt3EdKxi delta 102 zcmV-s0Ga>bN8Cq{908oM9cCk0r;un^7)hceG;!nq^aOFGGu>PWx9*+j4o)BhfFn!r zE3;E|Ud2{0w^QHl!d#{z@f{rCoun!N0Ikmg*U-J^9{>TkM}Y7G0QF|HwXwu!`vL#} I000D8T2Ck~A^-pY diff --git a/git-date/tests/time/parse.rs b/git-date/tests/time/parse.rs index 148a7904566..259243bf621 100644 --- a/git-date/tests/time/parse.rs +++ b/git-date/tests/time/parse.rs @@ -99,7 +99,6 @@ mod relative { use time::{Duration, OffsetDateTime}; #[test] - #[should_panic] // TODO: fix fn large_offsets_can_panic() { git_date::parse("999999999999999 weeks ago", Some(std::time::UNIX_EPOCH)).ok(); } diff --git a/git-prompt/src/unix.rs b/git-prompt/src/unix.rs index f48f7d269b8..a08d2d77777 100644 --- a/git-prompt/src/unix.rs +++ b/git-prompt/src/unix.rs @@ -9,11 +9,11 @@ pub(crate) mod imp { }; use nix::sys::{termios, termios::Termios}; - use parking_lot::{lock_api::MutexGuard, Mutex, RawMutex}; + use parking_lot::{const_mutex, lock_api::MutexGuard, Mutex, RawMutex}; use crate::{unix::TTY_PATH, Error, Mode, Options}; - static TERM_STATE: Mutex> = Mutex::new(None); + static TERM_STATE: Mutex> = const_mutex(None); /// Ask the user given a `prompt`, returning the result. pub(crate) fn ask(prompt: &str, Options { mode, .. }: &Options<'_>) -> Result {