Skip to content

Commit 18d9d44

Browse files
committed
Make tarball generation more deterministic
1 parent 8caef4e commit 18d9d44

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/tools/rust-installer/src/tarballer.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use anyhow::{bail, Context, Result};
22
use std::fs::{read_link, symlink_metadata};
33
use std::io::{BufWriter, Write};
44
use std::path::Path;
5-
use tar::{Builder, Header};
5+
use tar::{Builder, Header, HeaderMode};
66
use walkdir::WalkDir;
77

88
use crate::{
@@ -61,6 +61,8 @@ impl Tarballer {
6161
// first, so files may be directly created. (See rust-lang/rustup.rs#1092.)
6262
let buf = BufWriter::with_capacity(1024 * 1024, encoder);
6363
let mut builder = Builder::new(buf);
64+
// Make uid, gid and mtime deterministic to improve reproducibility
65+
builder.mode(HeaderMode::Deterministic);
6466

6567
let pool = rayon::ThreadPoolBuilder::new().num_threads(2).build().unwrap();
6668
pool.install(move || {
@@ -91,7 +93,8 @@ impl Tarballer {
9193
fn append_path<W: Write>(builder: &mut Builder<W>, src: &Path, path: &String) -> Result<()> {
9294
let stat = symlink_metadata(src)?;
9395
let mut header = Header::new_gnu();
94-
header.set_metadata(&stat);
96+
header.set_metadata_in_mode(&stat, HeaderMode::Deterministic);
97+
9598
if stat.file_type().is_symlink() {
9699
let link = read_link(src)?;
97100
builder.append_link(&mut header, path, &link)?;

0 commit comments

Comments
 (0)