@@ -2,7 +2,7 @@ use anyhow::{bail, Context, Result};
2
2
use std:: fs:: { read_link, symlink_metadata} ;
3
3
use std:: io:: { BufWriter , Write } ;
4
4
use std:: path:: Path ;
5
- use tar:: { Builder , Header } ;
5
+ use tar:: { Builder , Header , HeaderMode } ;
6
6
use walkdir:: WalkDir ;
7
7
8
8
use crate :: {
@@ -61,6 +61,8 @@ impl Tarballer {
61
61
// first, so files may be directly created. (See rust-lang/rustup.rs#1092.)
62
62
let buf = BufWriter :: with_capacity ( 1024 * 1024 , encoder) ;
63
63
let mut builder = Builder :: new ( buf) ;
64
+ // Make uid, gid and mtime deterministic to improve reproducibility
65
+ builder. mode ( HeaderMode :: Deterministic ) ;
64
66
65
67
let pool = rayon:: ThreadPoolBuilder :: new ( ) . num_threads ( 2 ) . build ( ) . unwrap ( ) ;
66
68
pool. install ( move || {
@@ -91,7 +93,8 @@ impl Tarballer {
91
93
fn append_path < W : Write > ( builder : & mut Builder < W > , src : & Path , path : & String ) -> Result < ( ) > {
92
94
let stat = symlink_metadata ( src) ?;
93
95
let mut header = Header :: new_gnu ( ) ;
94
- header. set_metadata ( & stat) ;
96
+ header. set_metadata_in_mode ( & stat, HeaderMode :: Deterministic ) ;
97
+
95
98
if stat. file_type ( ) . is_symlink ( ) {
96
99
let link = read_link ( src) ?;
97
100
builder. append_link ( & mut header, path, & link) ?;
0 commit comments