Skip to content

Commit b747a60

Browse files
committed
Add git baseline.
1 parent 3e6e0f9 commit b747a60

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

git-date/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ document-features = { version = "0.2.0", optional = true }
2424

2525
[dev-dependencies]
2626
git-testtools = { path = "../tests/tools"}
27+
once_cell = "1.12.0"
2728

2829
[package.metadata.docs.rs]
2930
all-features = true

git-date/src/parse.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use crate::time::format::{RFC2822, SHORT};
1+
use crate::time::format::{DEFAULT, ISO8601, ISO8601_STRICT, RFC2822, SHORT};
2+
use crate::time::Sign;
23
use crate::Time;
4+
use std::str::FromStr;
35
use time::{Date, OffsetDateTime};
46

57
#[allow(missing_docs)]
@@ -13,6 +15,18 @@ pub fn parse(input: &str) -> Option<Time> {
1315
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
1416
} else if let Ok(val) = OffsetDateTime::parse(input, RFC2822) {
1517
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
18+
} else if let Ok(val) = OffsetDateTime::parse(input, ISO8601) {
19+
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
20+
} else if let Ok(val) = OffsetDateTime::parse(input, ISO8601_STRICT) {
21+
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
22+
} else if let Ok(val) = OffsetDateTime::parse(input, DEFAULT) {
23+
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
24+
} else if let Ok(val) = u32::from_str(input) {
25+
// Format::Unix
26+
Some(Time::new(val, 0))
27+
} else if let Ok(val) = parse_raw(input) {
28+
// Format::Raw
29+
Some(val)
1630
} else if let Some(val) = relative::parse(input) {
1731
Some(Time::new(val.unix_timestamp() as u32, val.offset().whole_seconds()))
1832
} else {
@@ -21,6 +35,25 @@ pub fn parse(input: &str) -> Option<Time> {
2135
}
2236
}
2337

38+
fn parse_raw(input: &str) -> Result<Time, ()> {
39+
let mut split = input.split_whitespace();
40+
let seconds_since_unix_epoch: u32 = split.next().ok_or(())?.parse().map_err(|_| ())?;
41+
let offset = split.next().ok_or(())?;
42+
if offset.len() != 5 {
43+
return Err(());
44+
}
45+
let sign = if &offset[..1] == "-" { Sign::Plus } else { Sign::Minus };
46+
let hours: i32 = offset[1..3].parse().map_err(|_| ())?;
47+
let minutes: i32 = offset[3..5].parse().map_err(|_| ())?;
48+
let offset_in_seconds = hours * 3600 + minutes * 60;
49+
let time = Time {
50+
seconds_since_unix_epoch,
51+
offset_in_seconds,
52+
sign,
53+
};
54+
Ok(time)
55+
}
56+
2457
mod relative {
2558
use std::str::FromStr;
2659
use time::{Duration, OffsetDateTime};

git-date/tests/time/parse.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,40 @@
1+
use bstr::{BString, ByteSlice};
12
use git_date::time::Sign;
23
use git_date::Time;
4+
use once_cell::sync::Lazy;
5+
use std::collections::HashMap;
36
use time::OffsetDateTime;
47

8+
type Result<T = ()> = std::result::Result<T, Box<dyn std::error::Error>>;
9+
10+
static BASELINE: Lazy<HashMap<BString, usize>> = Lazy::new(|| {
11+
let base = git_testtools::scripted_fixture_repo_read_only("generate_git_date_baseline.sh").unwrap();
12+
13+
(|| -> Result<_> {
14+
let mut map = HashMap::new();
15+
let baseline = std::fs::read(base.join("baseline.git"))?;
16+
let mut lines = baseline.lines();
17+
while let Some(date_str) = lines.next() {
18+
let exit_code = lines.next().expect("two lines per baseline").to_str()?.parse()?;
19+
map.insert(date_str.into(), exit_code);
20+
}
21+
Ok(map)
22+
})()
23+
.unwrap()
24+
});
25+
26+
#[test]
27+
fn baseline() {
28+
for (pattern, exit_code) in BASELINE.iter() {
29+
let res = git_date::parse(pattern.to_str().expect("valid pattern"));
30+
assert_eq!(
31+
res.is_some(),
32+
*exit_code == 0,
33+
"{pattern:?} disagrees with baseline: {res:?}"
34+
)
35+
}
36+
}
37+
538
#[test]
639
fn special_time_is_ok_for_now() {
740
assert_eq!(

0 commit comments

Comments
 (0)