History

add test to check times before unix epoch

Sebastian Thiel committed 4 years ago

Commit eb304ea1 parent e1a14062 files · +20 −2Browse files

Showing the changes to git-date/src (1 of 2 files). Show all

Unified · Split

git-date/src/parse.rs+12−1
@@ -1,6 +1,8 @@
11 #[derive(thiserror::Error, Debug)]
22 #[allow(missing_docs)]
33 pub enum Error {
4+ #[error("Cannot represent times before UNIX epoch at timestamp {timestamp}")]
5+ TooEarly { timestamp: i64 },
46 #[error("Date string can not be parsed")]
57 InvalidDateString,
68 #[error("Dates past 2038 can not be represented.")]
@@ -44,12 +46,21 @@ pub(crate) mod function { · 37 unmodified lines
4446 // Format::Raw
4547 val
4648 } else if let Some(time) = relative::parse(input, now).transpose()? {
47− Time::new(time.unix_timestamp().try_into()?, time.offset().whole_seconds())
49+ Time::new(timestamp(time)?, time.offset().whole_seconds())
4850 } else {
4951 return Err(Error::InvalidDateString);
5052 })
5153 }
5254
55+ fn timestamp(date: OffsetDateTime) -> Result<u32, Error> {
56+ let timestamp = date.unix_timestamp();
57+ if timestamp < 0 {
58+ Err(Error::TooEarly { timestamp })
59+ } else {
60+ Ok(timestamp.try_into()?)
61+ }
62+ }
63+
5364 fn parse_raw(input: &str) -> Option<Time> {
5465 let mut split = input.split_whitespace();
5566 let seconds_since_unix_epoch: u32 = split.next()?.parse().ok()?;