@@ -2,7 +2,7 @@ use anyhow::{bail, Context, Result};
22use std:: fs:: { read_link, symlink_metadata} ;
33use std:: io:: { BufWriter , Write } ;
44use std:: path:: Path ;
5- use tar:: { Builder , Header } ;
5+ use tar:: { Builder , Header , HeaderMode } ;
66use walkdir:: WalkDir ;
77
88use 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 {
9193fn 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