From 44698d68c94a82bd1ae10203c2dd52768f09e62a Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Tue, 30 Aug 2022 12:02:37 +0200 Subject: [PATCH 1/2] Use `SOURCE_DATE_EPOCH` environment variable as build timestamp if set See https://reproducible-builds.org/docs/source-date-epoch/ for details. This enables reproducible builds. --- src/feature/build.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/feature/build.rs b/src/feature/build.rs index 2c26f288..180d0a66 100644 --- a/src/feature/build.rs +++ b/src/feature/build.rs @@ -18,6 +18,7 @@ use { }, getset::{Getters, MutGetters}, std::env, + std::str::FromStr, time::{format_description, OffsetDateTime}, }; @@ -123,13 +124,19 @@ pub(crate) fn configure_build(instructions: &Instructions, config: &mut Config) let mut add_entries = || { if *build_config.timestamp() { + let ts = match env::var("SOURCE_DATE_EPOCH") { + Ok(v) => OffsetDateTime::from_unix_timestamp(i64::from_str(&v)?)?, + Err(std::env::VarError::NotPresent) => OffsetDateTime::now_utc(), + Err(e) => return Err(e.into()), + }; match build_config.timezone() { TimeZone::Utc => { - add_config_entries(config, *build_config, &OffsetDateTime::now_utc())?; + add_config_entries(config, *build_config, &ts)?; } #[cfg(feature = "local_offset")] TimeZone::Local => { - add_config_entries(config, *build_config, &OffsetDateTime::now_local()?)?; + let local_offset = time::UtcOffset::local_offset_at(ts)?; + add_config_entries(config, *build_config, &ts.to_offset(local_offset))?; } }; } From 6d896742e6e092354b12959cc0f53be4134ba25b Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Tue, 30 Aug 2022 17:30:22 +0200 Subject: [PATCH 2/2] Document use of SOURCE_BUILD_EPOCH --- src/feature/build.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/feature/build.rs b/src/feature/build.rs index 180d0a66..c0c02c33 100644 --- a/src/feature/build.rs +++ b/src/feature/build.rs @@ -40,6 +40,9 @@ use { /// * **NOTE** - The date/time instruction output is determined by the [`kind`](TimestampKind) field and can be any combination of the three. /// * **NOTE** - To keep processing other sections if an Error occurs in this one, set /// [`Build::skip_if_error`](Build::skip_if_error_mut()) to true. +/// * **NOTE** - If the +/// [`SOURCE_BUILD_EPOCH`](https://reproducible-builds.org/docs/source-date-epoch/) environment +/// variable is set, vergen will use the value of that variable in place of the current time. /// /// # Example ///