about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakub Beránek <berykubik@gmail.com>2024-03-30 21:27:58 +0100
committerJakub Beránek <berykubik@gmail.com>2024-03-31 12:56:05 +0200
commit18d9d44bd6f431db4e50f5636b08458a8a1a63c4 (patch)
tree5caa8f44923355ea921e07bcd1c200a250f1b558
parent8caef4e6c30cd89496ab077e271cd0e9c03fe970 (diff)
downloadrust-18d9d44bd6f431db4e50f5636b08458a8a1a63c4.tar.gz
rust-18d9d44bd6f431db4e50f5636b08458a8a1a63c4.zip
Make tarball generation more deterministic
-rw-r--r--src/tools/rust-installer/src/tarballer.rs7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/tools/rust-installer/src/tarballer.rs b/src/tools/rust-installer/src/tarballer.rs
index e5a925b2cbf..24d341db78e 100644
--- a/src/tools/rust-installer/src/tarballer.rs
+++ b/src/tools/rust-installer/src/tarballer.rs
@@ -2,7 +2,7 @@ use anyhow::{bail, Context, Result};
 use std::fs::{read_link, symlink_metadata};
 use std::io::{BufWriter, Write};
 use std::path::Path;
-use tar::{Builder, Header};
+use tar::{Builder, Header, HeaderMode};
 use walkdir::WalkDir;
 
 use crate::{
@@ -61,6 +61,8 @@ impl Tarballer {
         // first, so files may be directly created. (See rust-lang/rustup.rs#1092.)
         let buf = BufWriter::with_capacity(1024 * 1024, encoder);
         let mut builder = Builder::new(buf);
+        // Make uid, gid and mtime deterministic to improve reproducibility
+        builder.mode(HeaderMode::Deterministic);
 
         let pool = rayon::ThreadPoolBuilder::new().num_threads(2).build().unwrap();
         pool.install(move || {
@@ -91,7 +93,8 @@ impl Tarballer {
 fn append_path<W: Write>(builder: &mut Builder<W>, src: &Path, path: &String) -> Result<()> {
     let stat = symlink_metadata(src)?;
     let mut header = Header::new_gnu();
-    header.set_metadata(&stat);
+    header.set_metadata_in_mode(&stat, HeaderMode::Deterministic);
+
     if stat.file_type().is_symlink() {
         let link = read_link(src)?;
         builder.append_link(&mut header, path, &link)?;