@@ -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