diff --git a/Cargo.lock b/Cargo.lock index 7928a8fa..ba1f36e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2363,8 +2363,7 @@ dependencies = [ [[package]] name = "tar" version = "0.4.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +source = "git+https://github.com/DeterminateSystems/tar-rs.git?branch=force-mtime#b25211be672398a005b39061ee35d28a2a3d7e8a" dependencies = [ "filetime", "libc", diff --git a/Cargo.toml b/Cargo.toml index a7a2726e..69f2d362 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,8 @@ serde = { version = "1.0.164", features = ["derive"] } serde_json = "1.0.97" gix = { version = "0.46.0", features = ["async-network-client", "serde"] } gix-ref = { version = "0.30.0", features = ["serde"] } -tar = { version = "0.4.38", features = ["xattr"] } +#tar = { version = "0.4.38", features = ["xattr"] } +tar = { git = "https://github.com/DeterminateSystems/tar-rs.git", branch = "force-mtime", features = ["xattr"] } flate2 = "1.0.26" tempfile = "3.6.0" ring = "0.16.20" diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 57d1595d..446fd94a 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -557,7 +557,18 @@ async fn push_new_release( span.record("source", tracing::field::display(source.clone().display())); tracing::debug!("Found source"); - let flake_tarball = get_flake_tarball(&source) + let last_modified = if let Some(last_modified) = flake_metadata.get("lastModified") { + last_modified.as_u64().ok_or_else(|| { + eyre!("`nix flake metadata --json` does not have a integer `lastModified` field") + })? + } else { + return Err(eyre!( + "`nix flake metadata` did not return a `lastModified` attribute" + )); + }; + tracing::debug!("lastModified = {}", last_modified); + + let flake_tarball = get_flake_tarball(&source, last_modified) .await .wrap_err("Making release tarball")?; diff --git a/src/flake_info.rs b/src/flake_info.rs index ea57cf25..a36729af 100644 --- a/src/flake_info.rs +++ b/src/flake_info.rs @@ -13,9 +13,13 @@ const FLAKE_URL_PLACEHOLDER_UUID: &str = "c9026fc0-ced9-48e0-aa3c-fc86c4c86df1"; directory = %directory.display(), ) )] -pub(crate) async fn get_flake_tarball(directory: &Path) -> color_eyre::Result> { +pub(crate) async fn get_flake_tarball( + directory: &Path, + last_modified: u64, +) -> color_eyre::Result> { let mut tarball_builder = tar::Builder::new(vec![]); tarball_builder.follow_symlinks(false); + tarball_builder.force_mtime(last_modified); tracing::trace!("Creating tarball"); // `tar` works according to the current directory (yay)